Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

WicketUtils.java 22KB

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