You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

WicketUtils.java 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. /*
  2. * Copyright 2011 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.wicket;
  17. import java.text.DateFormat;
  18. import java.text.MessageFormat;
  19. import java.text.SimpleDateFormat;
  20. import java.util.Collection;
  21. import java.util.Date;
  22. import java.util.HashMap;
  23. import java.util.Map;
  24. import java.util.TimeZone;
  25. import javax.servlet.http.HttpServletRequest;
  26. import org.apache.wicket.Component;
  27. import org.apache.wicket.PageParameters;
  28. import org.apache.wicket.Request;
  29. import org.apache.wicket.behavior.HeaderContributor;
  30. import org.apache.wicket.behavior.SimpleAttributeModifier;
  31. import org.apache.wicket.markup.html.IHeaderContributor;
  32. import org.apache.wicket.markup.html.IHeaderResponse;
  33. import org.apache.wicket.markup.html.basic.Label;
  34. import org.apache.wicket.markup.html.image.ContextImage;
  35. import org.apache.wicket.protocol.http.WebRequest;
  36. import org.apache.wicket.resource.ContextRelativeResource;
  37. import org.eclipse.jgit.diff.DiffEntry.ChangeType;
  38. import org.wicketstuff.googlecharts.AbstractChartData;
  39. import org.wicketstuff.googlecharts.IChartData;
  40. import com.gitblit.Constants;
  41. import com.gitblit.Constants.AccessPermission;
  42. import com.gitblit.Constants.FederationPullStatus;
  43. import com.gitblit.Keys;
  44. import com.gitblit.models.FederationModel;
  45. import com.gitblit.models.Metric;
  46. import com.gitblit.utils.HttpUtils;
  47. import com.gitblit.utils.StringUtils;
  48. import com.gitblit.utils.TimeUtils;
  49. public class WicketUtils {
  50. public static void setCssClass(Component container, String value) {
  51. container.add(new SimpleAttributeModifier("class", value));
  52. }
  53. public static void setCssStyle(Component container, String value) {
  54. container.add(new SimpleAttributeModifier("style", value));
  55. }
  56. public static void setCssBackground(Component container, String value) {
  57. String background = MessageFormat.format("background-color:{0};",
  58. StringUtils.getColor(value));
  59. container.add(new SimpleAttributeModifier("style", background));
  60. }
  61. public static void setHtmlTooltip(Component container, String value) {
  62. container.add(new SimpleAttributeModifier("title", value));
  63. }
  64. public static void setInputPlaceholder(Component container, String value) {
  65. container.add(new SimpleAttributeModifier("placeholder", value));
  66. }
  67. public static void setChangeTypeCssClass(Component container, ChangeType type) {
  68. switch (type) {
  69. case ADD:
  70. setCssClass(container, "addition");
  71. break;
  72. case COPY:
  73. case RENAME:
  74. setCssClass(container, "rename");
  75. break;
  76. case DELETE:
  77. setCssClass(container, "deletion");
  78. break;
  79. case MODIFY:
  80. setCssClass(container, "modification");
  81. break;
  82. }
  83. }
  84. public static void setPermissionClass(Component container, AccessPermission permission) {
  85. if (permission == null) {
  86. setCssClass(container, "badge");
  87. return;
  88. }
  89. switch (permission) {
  90. case REWIND:
  91. case DELETE:
  92. case CREATE:
  93. setCssClass(container, "badge badge-success");
  94. break;
  95. case PUSH:
  96. setCssClass(container, "badge badge-info");
  97. break;
  98. case CLONE:
  99. setCssClass(container, "badge badge-inverse");
  100. break;
  101. default:
  102. setCssClass(container, "badge");
  103. break;
  104. }
  105. }
  106. public static void setAlternatingBackground(Component c, int i) {
  107. String clazz = i % 2 == 0 ? "light" : "dark";
  108. setCssClass(c, clazz);
  109. }
  110. public static Label createAuthorLabel(String wicketId, String author) {
  111. Label label = new Label(wicketId, author);
  112. WicketUtils.setHtmlTooltip(label, author);
  113. return label;
  114. }
  115. public static ContextImage getPullStatusImage(String wicketId, FederationPullStatus status) {
  116. String filename = null;
  117. switch (status) {
  118. case MIRRORED:
  119. case PULLED:
  120. filename = "bullet_green.png";
  121. break;
  122. case SKIPPED:
  123. filename = "bullet_yellow.png";
  124. break;
  125. case FAILED:
  126. filename = "bullet_red.png";
  127. break;
  128. case EXCLUDED:
  129. filename = "bullet_white.png";
  130. break;
  131. case PENDING:
  132. case NOCHANGE:
  133. default:
  134. filename = "bullet_black.png";
  135. }
  136. return WicketUtils.newImage(wicketId, filename, status.name());
  137. }
  138. public static ContextImage getFileImage(String wicketId, String filename) {
  139. filename = filename.toLowerCase();
  140. if (filename.endsWith(".java")) {
  141. return newImage(wicketId, "file_java_16x16.png");
  142. } else if (filename.endsWith(".rb")) {
  143. return newImage(wicketId, "file_ruby_16x16.png");
  144. } else if (filename.endsWith(".php")) {
  145. return newImage(wicketId, "file_php_16x16.png");
  146. } else if (filename.endsWith(".cs")) {
  147. return newImage(wicketId, "file_cs_16x16.png");
  148. } else if (filename.endsWith(".cpp")) {
  149. return newImage(wicketId, "file_cpp_16x16.png");
  150. } else if (filename.endsWith(".c")) {
  151. return newImage(wicketId, "file_c_16x16.png");
  152. } else if (filename.endsWith(".h")) {
  153. return newImage(wicketId, "file_h_16x16.png");
  154. } else if (filename.endsWith(".sln")) {
  155. return newImage(wicketId, "file_vs_16x16.png");
  156. } else if (filename.endsWith(".csv") || filename.endsWith(".xls")
  157. || filename.endsWith(".xlsx")) {
  158. return newImage(wicketId, "file_excel_16x16.png");
  159. } else if (filename.endsWith(".doc") || filename.endsWith(".docx")) {
  160. return newImage(wicketId, "file_doc_16x16.png");
  161. } else if (filename.endsWith(".ppt") || filename.endsWith(".pptx")) {
  162. return newImage(wicketId, "file_ppt_16x16.png");
  163. } else if (filename.endsWith(".zip")) {
  164. return newImage(wicketId, "file_zip_16x16.png");
  165. } else if (filename.endsWith(".pdf")) {
  166. return newImage(wicketId, "file_acrobat_16x16.png");
  167. } else if (filename.endsWith(".htm") || filename.endsWith(".html")) {
  168. return newImage(wicketId, "file_world_16x16.png");
  169. } else if (filename.endsWith(".xml")) {
  170. return newImage(wicketId, "file_code_16x16.png");
  171. } else if (filename.endsWith(".properties")) {
  172. return newImage(wicketId, "file_settings_16x16.png");
  173. }
  174. MarkupProcessor processor = new MarkupProcessor(GitBlitWebApp.get().settings());
  175. String ext = StringUtils.getFileExtension(filename).toLowerCase();
  176. if (processor.getMarkupExtensions().contains(ext)) {
  177. return newImage(wicketId, "file_world_16x16.png");
  178. }
  179. return newImage(wicketId, "file_16x16.png");
  180. }
  181. public static ContextImage getRegistrationImage(String wicketId, FederationModel registration,
  182. Component c) {
  183. if (registration.isResultData()) {
  184. return WicketUtils.newImage(wicketId, "information_16x16.png",
  185. c.getString("gb.federationResults"));
  186. } else {
  187. return WicketUtils.newImage(wicketId, "arrow_left.png",
  188. c.getString("gb.federationRegistration"));
  189. }
  190. }
  191. public static ContextImage newClearPixel(String wicketId) {
  192. return newImage(wicketId, "pixel.png");
  193. }
  194. public static ContextImage newBlankImage(String wicketId) {
  195. return newImage(wicketId, "blank.png");
  196. }
  197. public static ContextImage newImage(String wicketId, String file) {
  198. return newImage(wicketId, file, null);
  199. }
  200. public static ContextImage newImage(String wicketId, String file, String tooltip) {
  201. ContextImage img = new ContextImage(wicketId, file);
  202. if (!StringUtils.isEmpty(tooltip)) {
  203. setHtmlTooltip(img, tooltip);
  204. }
  205. return img;
  206. }
  207. public static Label newIcon(String wicketId, String css) {
  208. Label lbl = new Label(wicketId);
  209. setCssClass(lbl, css);
  210. return lbl;
  211. }
  212. public static Label newBlankIcon(String wicketId) {
  213. Label lbl = new Label(wicketId);
  214. setCssClass(lbl, "");
  215. lbl.setRenderBodyOnly(true);
  216. return lbl;
  217. }
  218. public static ContextRelativeResource getResource(String file) {
  219. return new ContextRelativeResource(file);
  220. }
  221. public static String getGitblitURL(Request request) {
  222. HttpServletRequest req = ((WebRequest) request).getHttpServletRequest();
  223. return HttpUtils.getGitblitURL(req);
  224. }
  225. public static HeaderContributor syndicationDiscoveryLink(final String feedTitle,
  226. final String url) {
  227. return new HeaderContributor(new IHeaderContributor() {
  228. private static final long serialVersionUID = 1L;
  229. @Override
  230. public void renderHead(IHeaderResponse response) {
  231. String contentType = "application/rss+xml";
  232. StringBuilder buffer = new StringBuilder();
  233. buffer.append("<link rel=\"alternate\" ");
  234. buffer.append("type=\"").append(contentType).append("\" ");
  235. buffer.append("title=\"").append(feedTitle).append("\" ");
  236. buffer.append("href=\"").append(url).append("\" />");
  237. response.renderString(buffer.toString());
  238. }
  239. });
  240. }
  241. public static PageParameters newTokenParameter(String token) {
  242. Map<String, String> parameterMap = new HashMap<String, String>();
  243. parameterMap.put("t", token);
  244. return new PageParameters(parameterMap);
  245. }
  246. public static PageParameters newRegistrationParameter(String url,
  247. String name) {
  248. Map<String, String> parameterMap = new HashMap<String, String>();
  249. parameterMap.put("u", url);
  250. parameterMap.put("n", name);
  251. return new PageParameters(parameterMap);
  252. }
  253. public static PageParameters newUsernameParameter(String username) {
  254. Map<String, String> parameterMap = new HashMap<String, String>();
  255. parameterMap.put("user", username);
  256. return new PageParameters(parameterMap);
  257. }
  258. public static PageParameters newTeamnameParameter(String teamname) {
  259. Map<String, String> parameterMap = new HashMap<String, String>();
  260. parameterMap.put("team", teamname);
  261. return new PageParameters(parameterMap);
  262. }
  263. public static PageParameters newProjectParameter(String projectName) {
  264. Map<String, String> parameterMap = new HashMap<String, String>();
  265. parameterMap.put("p", projectName);
  266. return new PageParameters(parameterMap);
  267. }
  268. public static PageParameters newRepositoryParameter(String repositoryName) {
  269. Map<String, String> parameterMap = new HashMap<String, String>();
  270. parameterMap.put("r", repositoryName);
  271. return new PageParameters(parameterMap);
  272. }
  273. public static PageParameters newObjectParameter(String objectId) {
  274. Map<String, String> parameterMap = new HashMap<String, String>();
  275. parameterMap.put("h", objectId);
  276. return new PageParameters(parameterMap);
  277. }
  278. public static PageParameters newObjectParameter(String repositoryName,
  279. String objectId) {
  280. Map<String, String> parameterMap = new HashMap<String, String>();
  281. if (StringUtils.isEmpty(objectId)) {
  282. return newRepositoryParameter(repositoryName);
  283. }
  284. parameterMap.put("r", repositoryName);
  285. parameterMap.put("h", objectId);
  286. return new PageParameters(parameterMap);
  287. }
  288. public static PageParameters newRangeParameter(String repositoryName,
  289. String startRange, String endRange) {
  290. Map<String, String> parameterMap = new HashMap<String, String>();
  291. parameterMap.put("r", repositoryName);
  292. parameterMap.put("h", startRange + ".." + endRange);
  293. return new PageParameters(parameterMap);
  294. }
  295. public static PageParameters newPathParameter(String repositoryName,
  296. String objectId, String path) {
  297. Map<String, String> parameterMap = new HashMap<String, String>();
  298. if (StringUtils.isEmpty(path)) {
  299. return newObjectParameter(repositoryName, objectId);
  300. }
  301. if (StringUtils.isEmpty(objectId)) {
  302. parameterMap.put("r", repositoryName);
  303. parameterMap.put("f", path);
  304. return new PageParameters(parameterMap);
  305. }
  306. parameterMap.put("r", repositoryName);
  307. parameterMap.put("h", objectId);
  308. parameterMap.put("f", path);
  309. return new PageParameters(parameterMap);
  310. }
  311. public static PageParameters newLogPageParameter(String repositoryName,
  312. String objectId, int pageNumber) {
  313. Map<String, String> parameterMap = new HashMap<String, String>();
  314. if (pageNumber <= 1) {
  315. return newObjectParameter(repositoryName, objectId);
  316. }
  317. if (StringUtils.isEmpty(objectId)) {
  318. parameterMap.put("r", repositoryName);
  319. parameterMap.put("pg", String.valueOf(pageNumber));
  320. return new PageParameters(parameterMap);
  321. }
  322. parameterMap.put("r", repositoryName);
  323. parameterMap.put("h", objectId);
  324. parameterMap.put("pg", String.valueOf(pageNumber));
  325. return new PageParameters(parameterMap);
  326. }
  327. public static PageParameters newHistoryPageParameter(String repositoryName,
  328. String objectId, String path, int pageNumber) {
  329. Map<String, String> parameterMap = new HashMap<String, String>();
  330. if (pageNumber <= 1) {
  331. return newObjectParameter(repositoryName, objectId);
  332. }
  333. if (StringUtils.isEmpty(objectId)) {
  334. parameterMap.put("r", repositoryName);
  335. parameterMap.put("f", path);
  336. parameterMap.put("pg", String.valueOf(pageNumber));
  337. return new PageParameters(parameterMap);
  338. }
  339. parameterMap.put("r", repositoryName);
  340. parameterMap.put("h", objectId);
  341. parameterMap.put("f", path);
  342. parameterMap.put("pg", String.valueOf(pageNumber));
  343. return new PageParameters(parameterMap);
  344. }
  345. public static PageParameters newBlobDiffParameter(String repositoryName,
  346. String baseCommitId, String commitId, String path) {
  347. Map<String, String> parameterMap = new HashMap<String, String>();
  348. if (StringUtils.isEmpty(commitId)) {
  349. parameterMap.put("r", repositoryName);
  350. parameterMap.put("f", path);
  351. parameterMap.put("hb", baseCommitId);
  352. return new PageParameters(parameterMap);
  353. }
  354. parameterMap.put("r", repositoryName);
  355. parameterMap.put("h", commitId);
  356. parameterMap.put("f", path);
  357. parameterMap.put("hb", baseCommitId);
  358. return new PageParameters(parameterMap);
  359. }
  360. public static PageParameters newSearchParameter(String repositoryName,
  361. String commitId, String search, Constants.SearchType type) {
  362. Map<String, String> parameterMap = new HashMap<String, String>();
  363. if (StringUtils.isEmpty(commitId)) {
  364. parameterMap.put("r", repositoryName);
  365. parameterMap.put("s", search);
  366. parameterMap.put("st", type.name());
  367. return new PageParameters(parameterMap);
  368. }
  369. parameterMap.put("r", repositoryName);
  370. parameterMap.put("h", commitId);
  371. parameterMap.put("s", search);
  372. parameterMap.put("st", type.name());
  373. return new PageParameters(parameterMap);
  374. }
  375. public static PageParameters newSearchParameter(String repositoryName,
  376. String commitId, String search, Constants.SearchType type,
  377. int pageNumber) {
  378. Map<String, String> parameterMap = new HashMap<String, String>();
  379. if (StringUtils.isEmpty(commitId)) {
  380. parameterMap.put("r", repositoryName);
  381. parameterMap.put("s", search);
  382. parameterMap.put("st", type.name());
  383. parameterMap.put("pg", String.valueOf(pageNumber));
  384. return new PageParameters(parameterMap);
  385. }
  386. parameterMap.put("r", repositoryName);
  387. parameterMap.put("h", commitId);
  388. parameterMap.put("s", search);
  389. parameterMap.put("st", type.name());
  390. parameterMap.put("pg", String.valueOf(pageNumber));
  391. return new PageParameters(parameterMap);
  392. }
  393. public static PageParameters newBlameTypeParameter(String repositoryName,
  394. String commitId, String path, String blameType) {
  395. Map<String, String> parameterMap = new HashMap<String, String>();
  396. parameterMap.put("r", repositoryName);
  397. parameterMap.put("h", commitId);
  398. parameterMap.put("f", path);
  399. parameterMap.put("blametype", blameType);
  400. return new PageParameters(parameterMap);
  401. }
  402. public static String getProjectName(PageParameters params) {
  403. return params.getString("p", "");
  404. }
  405. public static String getRepositoryName(PageParameters params) {
  406. return params.getString("r", "");
  407. }
  408. public static String getObject(PageParameters params) {
  409. return params.getString("h", null);
  410. }
  411. public static String getPath(PageParameters params) {
  412. return params.getString("f", null);
  413. }
  414. public static String getBaseObjectId(PageParameters params) {
  415. return params.getString("hb", null);
  416. }
  417. public static String getSearchString(PageParameters params) {
  418. return params.getString("s", null);
  419. }
  420. public static String getSearchType(PageParameters params) {
  421. return params.getString("st", null);
  422. }
  423. public static int getPage(PageParameters params) {
  424. // index from 1
  425. return params.getInt("pg", 1);
  426. }
  427. public static String getRegEx(PageParameters params) {
  428. return params.getString("x", "");
  429. }
  430. public static String getSet(PageParameters params) {
  431. return params.getString("set", "");
  432. }
  433. public static String getTeam(PageParameters params) {
  434. return params.getString("team", "");
  435. }
  436. public static int getDaysBack(PageParameters params) {
  437. return params.getInt("db", 0);
  438. }
  439. public static String getUsername(PageParameters params) {
  440. return params.getString("user", "");
  441. }
  442. public static String getTeamname(PageParameters params) {
  443. return params.getString("team", "");
  444. }
  445. public static String getToken(PageParameters params) {
  446. return params.getString("t", "");
  447. }
  448. public static String getUrlParameter(PageParameters params) {
  449. return params.getString("u", "");
  450. }
  451. public static String getNameParameter(PageParameters params) {
  452. return params.getString("n", "");
  453. }
  454. public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) {
  455. return createDateLabel(wicketId, date, timeZone, timeUtils, true);
  456. }
  457. public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils, boolean setCss) {
  458. String format = GitBlitWebApp.get().settings().getString(Keys.web.datestampShortFormat, "MM/dd/yy");
  459. DateFormat df = new SimpleDateFormat(format);
  460. if (timeZone == null) {
  461. timeZone = GitBlitWebApp.get().getTimezone();
  462. }
  463. df.setTimeZone(timeZone);
  464. String dateString;
  465. if (date.getTime() == 0) {
  466. dateString = "--";
  467. } else {
  468. dateString = df.format(date);
  469. }
  470. String title = null;
  471. if (date.getTime() <= System.currentTimeMillis()) {
  472. // past
  473. title = timeUtils.timeAgo(date);
  474. }
  475. if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000L) {
  476. String tmp = dateString;
  477. dateString = title;
  478. title = tmp;
  479. }
  480. Label label = new Label(wicketId, dateString);
  481. if (setCss) {
  482. WicketUtils.setCssClass(label, timeUtils.timeAgoCss(date));
  483. }
  484. if (!StringUtils.isEmpty(title)) {
  485. WicketUtils.setHtmlTooltip(label, title);
  486. }
  487. return label;
  488. }
  489. public static Label createTimeLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) {
  490. String format = GitBlitWebApp.get().settings().getString(Keys.web.timeFormat, "HH:mm");
  491. DateFormat df = new SimpleDateFormat(format);
  492. if (timeZone == null) {
  493. timeZone = GitBlitWebApp.get().getTimezone();
  494. }
  495. df.setTimeZone(timeZone);
  496. String timeString;
  497. if (date.getTime() == 0) {
  498. timeString = "--";
  499. } else {
  500. timeString = df.format(date);
  501. }
  502. String title = timeUtils.timeAgo(date);
  503. Label label = new Label(wicketId, timeString);
  504. if (!StringUtils.isEmpty(title)) {
  505. WicketUtils.setHtmlTooltip(label, title);
  506. }
  507. return label;
  508. }
  509. public static Label createDatestampLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) {
  510. String format = GitBlitWebApp.get().settings().getString(Keys.web.datestampLongFormat, "EEEE, MMMM d, yyyy");
  511. DateFormat df = new SimpleDateFormat(format);
  512. if (timeZone == null) {
  513. timeZone = GitBlitWebApp.get().getTimezone();
  514. }
  515. df.setTimeZone(timeZone);
  516. String dateString;
  517. if (date.getTime() == 0) {
  518. dateString = "--";
  519. } else {
  520. dateString = df.format(date);
  521. }
  522. String title = null;
  523. if (TimeUtils.isToday(date, timeZone)) {
  524. title = timeUtils.today();
  525. } else if (TimeUtils.isYesterday(date, timeZone)) {
  526. title = timeUtils.yesterday();
  527. } else if (date.getTime() <= System.currentTimeMillis()) {
  528. // past
  529. title = timeUtils.timeAgo(date);
  530. }
  531. if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000L) {
  532. String tmp = dateString;
  533. dateString = title;
  534. title = tmp;
  535. }
  536. Label label = new Label(wicketId, dateString);
  537. if (!StringUtils.isEmpty(title)) {
  538. WicketUtils.setHtmlTooltip(label, title);
  539. }
  540. return label;
  541. }
  542. public static Label createTimestampLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) {
  543. String format = GitBlitWebApp.get().settings().getString(Keys.web.datetimestampLongFormat,
  544. "EEEE, MMMM d, yyyy HH:mm Z");
  545. DateFormat df = new SimpleDateFormat(format);
  546. if (timeZone == null) {
  547. timeZone = GitBlitWebApp.get().getTimezone();
  548. }
  549. df.setTimeZone(timeZone);
  550. String dateString;
  551. if (date.getTime() == 0) {
  552. dateString = "--";
  553. } else {
  554. dateString = df.format(date);
  555. }
  556. String title = null;
  557. if (date.getTime() <= System.currentTimeMillis()) {
  558. // past
  559. title = timeUtils.timeAgo(date);
  560. }
  561. Label label = new Label(wicketId, dateString);
  562. if (!StringUtils.isEmpty(title)) {
  563. WicketUtils.setHtmlTooltip(label, title);
  564. }
  565. return label;
  566. }
  567. public static IChartData getChartData(Collection<Metric> metrics) {
  568. final double[] commits = new double[metrics.size()];
  569. final double[] tags = new double[metrics.size()];
  570. int i = 0;
  571. double max = 0;
  572. for (Metric m : metrics) {
  573. commits[i] = m.count;
  574. if (m.tag > 0) {
  575. tags[i] = m.count;
  576. } else {
  577. tags[i] = -1d;
  578. }
  579. max = Math.max(max, m.count);
  580. i++;
  581. }
  582. IChartData data = new AbstractChartData(max) {
  583. private static final long serialVersionUID = 1L;
  584. @Override
  585. public double[][] getData() {
  586. return new double[][] { commits, tags };
  587. }
  588. };
  589. return data;
  590. }
  591. public static double maxValue(Collection<Metric> metrics) {
  592. double max = Double.MIN_VALUE;
  593. for (Metric m : metrics) {
  594. if (m.count > max) {
  595. max = m.count;
  596. }
  597. }
  598. return max;
  599. }
  600. public static IChartData getScatterData(Collection<Metric> metrics) {
  601. final double[] y = new double[metrics.size()];
  602. final double[] x = new double[metrics.size()];
  603. int i = 0;
  604. double max = 0;
  605. for (Metric m : metrics) {
  606. y[i] = m.count;
  607. if (m.duration > 0) {
  608. x[i] = m.duration;
  609. } else {
  610. x[i] = -1d;
  611. }
  612. max = Math.max(max, m.count);
  613. i++;
  614. }
  615. IChartData data = new AbstractChartData(max) {
  616. private static final long serialVersionUID = 1L;
  617. @Override
  618. public double[][] getData() {
  619. return new double[][] { x, y };
  620. }
  621. };
  622. return data;
  623. }
  624. }