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 24KB

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