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

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