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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  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.SimpleDateFormat;
  19. import java.util.Collection;
  20. import java.util.Date;
  21. import java.util.List;
  22. import java.util.TimeZone;
  23. import javax.servlet.http.HttpServletRequest;
  24. import org.apache.wicket.Component;
  25. import org.apache.wicket.PageParameters;
  26. import org.apache.wicket.Request;
  27. import org.apache.wicket.behavior.HeaderContributor;
  28. import org.apache.wicket.behavior.SimpleAttributeModifier;
  29. import org.apache.wicket.markup.html.IHeaderContributor;
  30. import org.apache.wicket.markup.html.IHeaderResponse;
  31. import org.apache.wicket.markup.html.basic.Label;
  32. import org.apache.wicket.markup.html.image.ContextImage;
  33. import org.apache.wicket.protocol.http.WebRequest;
  34. import org.apache.wicket.resource.ContextRelativeResource;
  35. import org.eclipse.jgit.diff.DiffEntry.ChangeType;
  36. import org.wicketstuff.googlecharts.AbstractChartData;
  37. import org.wicketstuff.googlecharts.IChartData;
  38. import com.gitblit.GitBlit;
  39. import com.gitblit.Keys;
  40. import com.gitblit.models.Metric;
  41. import com.gitblit.utils.JGitUtils.SearchType;
  42. import com.gitblit.utils.StringUtils;
  43. import com.gitblit.utils.TimeUtils;
  44. public class WicketUtils {
  45. public static void setCssClass(Component container, String value) {
  46. container.add(new SimpleAttributeModifier("class", value));
  47. }
  48. public static void setCssStyle(Component container, String value) {
  49. container.add(new SimpleAttributeModifier("style", value));
  50. }
  51. public static void setHtmlTooltip(Component container, String value) {
  52. container.add(new SimpleAttributeModifier("title", value));
  53. }
  54. public static void setInputPlaceholder(Component container, String value) {
  55. container.add(new SimpleAttributeModifier("placeholder", value));
  56. }
  57. public static void setChangeTypeCssClass(Component container, ChangeType type) {
  58. switch (type) {
  59. case ADD:
  60. setCssClass(container, "addition");
  61. break;
  62. case COPY:
  63. case RENAME:
  64. setCssClass(container, "rename");
  65. break;
  66. case DELETE:
  67. setCssClass(container, "deletion");
  68. break;
  69. case MODIFY:
  70. setCssClass(container, "modification");
  71. break;
  72. }
  73. }
  74. public static void setTicketCssClass(Component container, String state) {
  75. String css = null;
  76. if (state.equals("open")) {
  77. css = "bug_open";
  78. } else if (state.equals("hold")) {
  79. css = "bug_hold";
  80. } else if (state.equals("resolved")) {
  81. css = "bug_resolved";
  82. } else if (state.equals("invalid")) {
  83. css = "bug_invalid";
  84. }
  85. if (css != null) {
  86. setCssClass(container, css);
  87. }
  88. }
  89. public static void setAlternatingBackground(Component c, int i) {
  90. String clazz = i % 2 == 0 ? "dark" : "light";
  91. setCssClass(c, clazz);
  92. }
  93. public static Label createAuthorLabel(String wicketId, String author) {
  94. Label label = new Label(wicketId, author);
  95. WicketUtils.setHtmlTooltip(label, author);
  96. return label;
  97. }
  98. public static ContextImage getFileImage(String wicketId, String filename) {
  99. filename = filename.toLowerCase();
  100. if (filename.endsWith(".java")) {
  101. return newImage(wicketId, "file_java_16x16.png");
  102. } else if (filename.endsWith(".rb")) {
  103. return newImage(wicketId, "file_ruby_16x16.png");
  104. } else if (filename.endsWith(".php")) {
  105. return newImage(wicketId, "file_php_16x16.png");
  106. } else if (filename.endsWith(".cs")) {
  107. return newImage(wicketId, "file_cs_16x16.png");
  108. } else if (filename.endsWith(".cpp")) {
  109. return newImage(wicketId, "file_cpp_16x16.png");
  110. } else if (filename.endsWith(".c")) {
  111. return newImage(wicketId, "file_c_16x16.png");
  112. } else if (filename.endsWith(".h")) {
  113. return newImage(wicketId, "file_h_16x16.png");
  114. } else if (filename.endsWith(".sln")) {
  115. return newImage(wicketId, "file_vs_16x16.png");
  116. } else if (filename.endsWith(".csv") || filename.endsWith(".xls")
  117. || filename.endsWith(".xlsx")) {
  118. return newImage(wicketId, "file_excel_16x16.png");
  119. } else if (filename.endsWith(".doc") || filename.endsWith(".docx")) {
  120. return newImage(wicketId, "file_word_16x16.png");
  121. } else if (filename.endsWith(".ppt")) {
  122. return newImage(wicketId, "file_ppt_16x16.png");
  123. } else if (filename.endsWith(".zip")) {
  124. return newImage(wicketId, "file_zip_16x16.png");
  125. } else if (filename.endsWith(".pdf")) {
  126. return newImage(wicketId, "file_acrobat_16x16.png");
  127. } else if (filename.endsWith(".htm") || filename.endsWith(".html")) {
  128. return newImage(wicketId, "file_world_16x16.png");
  129. } else if (filename.endsWith(".xml")) {
  130. return newImage(wicketId, "file_code_16x16.png");
  131. } else if (filename.endsWith(".properties")) {
  132. return newImage(wicketId, "file_settings_16x16.png");
  133. }
  134. List<String> mdExtensions = GitBlit.getStrings(Keys.web.markdownExtensions);
  135. for (String ext : mdExtensions) {
  136. if (filename.endsWith('.' + ext.toLowerCase())) {
  137. return newImage(wicketId, "file_world_16x16.png");
  138. }
  139. }
  140. return newImage(wicketId, "file_16x16.png");
  141. }
  142. public static ContextImage newClearPixel(String wicketId) {
  143. return newImage(wicketId, "pixel.png");
  144. }
  145. public static ContextImage newBlankImage(String wicketId) {
  146. return newImage(wicketId, "blank.png");
  147. }
  148. public static ContextImage newImage(String wicketId, String file) {
  149. return newImage(wicketId, file, null);
  150. }
  151. public static ContextImage newImage(String wicketId, String file, String tooltip) {
  152. ContextImage img = new ContextImage(wicketId, file);
  153. if (!StringUtils.isEmpty(tooltip)) {
  154. setHtmlTooltip(img, tooltip);
  155. }
  156. return img;
  157. }
  158. public static ContextRelativeResource getResource(String file) {
  159. return new ContextRelativeResource(file);
  160. }
  161. public static String getHostURL(Request request) {
  162. HttpServletRequest req = ((WebRequest) request).getHttpServletRequest();
  163. return getHostURL(req);
  164. }
  165. public static String getHostURL(HttpServletRequest request) {
  166. StringBuilder sb = new StringBuilder();
  167. sb.append(request.getScheme());
  168. sb.append("://");
  169. sb.append(request.getServerName());
  170. if ((request.getScheme().equals("http") && request.getServerPort() != 80)
  171. || (request.getScheme().equals("https") && request.getServerPort() != 443)) {
  172. sb.append(":" + request.getServerPort());
  173. }
  174. return sb.toString();
  175. }
  176. public static HeaderContributor syndicationDiscoveryLink(final String feedTitle,
  177. final String url) {
  178. return new HeaderContributor(new IHeaderContributor() {
  179. private static final long serialVersionUID = 1L;
  180. public void renderHead(IHeaderResponse response) {
  181. String contentType = "application/rss+xml";
  182. StringBuffer buffer = new StringBuffer();
  183. buffer.append("<link rel=\"alternate\" ");
  184. buffer.append("type=\"").append(contentType).append("\" ");
  185. buffer.append("title=\"").append(feedTitle).append("\" ");
  186. buffer.append("href=\"").append(url).append("\" />");
  187. response.renderString(buffer.toString());
  188. }
  189. });
  190. }
  191. public static PageParameters newUsernameParameter(String username) {
  192. return new PageParameters("user=" + username);
  193. }
  194. public static PageParameters newRepositoryParameter(String repositoryName) {
  195. return new PageParameters("r=" + repositoryName);
  196. }
  197. public static PageParameters newObjectParameter(String repositoryName, String objectId) {
  198. if (StringUtils.isEmpty(objectId)) {
  199. return newRepositoryParameter(repositoryName);
  200. }
  201. return new PageParameters("r=" + repositoryName + ",h=" + objectId);
  202. }
  203. public static PageParameters newPathParameter(String repositoryName, String objectId,
  204. String path) {
  205. if (StringUtils.isEmpty(path)) {
  206. return newObjectParameter(repositoryName, objectId);
  207. }
  208. if (StringUtils.isEmpty(objectId)) {
  209. return new PageParameters("r=" + repositoryName + ",f=" + path);
  210. }
  211. return new PageParameters("r=" + repositoryName + ",h=" + objectId + ",f=" + path);
  212. }
  213. public static PageParameters newLogPageParameter(String repositoryName, String objectId,
  214. int pageNumber) {
  215. if (pageNumber <= 1) {
  216. return newObjectParameter(repositoryName, objectId);
  217. }
  218. if (StringUtils.isEmpty(objectId)) {
  219. return new PageParameters("r=" + repositoryName + ",page=" + pageNumber);
  220. }
  221. return new PageParameters("r=" + repositoryName + ",h=" + objectId + ",page=" + pageNumber);
  222. }
  223. public static PageParameters newHistoryPageParameter(String repositoryName, String objectId,
  224. String path, int pageNumber) {
  225. if (pageNumber <= 1) {
  226. return newObjectParameter(repositoryName, objectId);
  227. }
  228. if (StringUtils.isEmpty(objectId)) {
  229. return new PageParameters("r=" + repositoryName + ",f=" + path + ",page=" + pageNumber);
  230. }
  231. return new PageParameters("r=" + repositoryName + ",h=" + objectId + ",f=" + path
  232. + ",page=" + pageNumber);
  233. }
  234. public static PageParameters newBlobDiffParameter(String repositoryName, String baseCommitId,
  235. String commitId, String path) {
  236. if (StringUtils.isEmpty(commitId)) {
  237. return new PageParameters("r=" + repositoryName + ",f=" + path + ",hb=" + baseCommitId);
  238. }
  239. return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",f=" + path + ",hb="
  240. + baseCommitId);
  241. }
  242. public static PageParameters newSearchParameter(String repositoryName, String commitId,
  243. String search, SearchType type) {
  244. if (StringUtils.isEmpty(commitId)) {
  245. return new PageParameters("r=" + repositoryName + ",s=" + search + ",st=" + type.name());
  246. }
  247. return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",s=" + search
  248. + ",st=" + type.name());
  249. }
  250. public static PageParameters newSearchParameter(String repositoryName, String commitId,
  251. String search, SearchType type, int pageNumber) {
  252. if (StringUtils.isEmpty(commitId)) {
  253. return new PageParameters("r=" + repositoryName + ",s=" + search + ",st=" + type.name()
  254. + ",page=" + pageNumber);
  255. }
  256. return new PageParameters("r=" + repositoryName + ",h=" + commitId + ",s=" + search
  257. + ",st=" + type.name() + ",page=" + pageNumber);
  258. }
  259. public static String getRepositoryName(PageParameters params) {
  260. return params.getString("r", "");
  261. }
  262. public static String getObject(PageParameters params) {
  263. return params.getString("h", null);
  264. }
  265. public static String getPath(PageParameters params) {
  266. return params.getString("f", null);
  267. }
  268. public static String getBaseObjectId(PageParameters params) {
  269. return params.getString("hb", null);
  270. }
  271. public static String getSearchString(PageParameters params) {
  272. return params.getString("s", null);
  273. }
  274. public static String getSearchType(PageParameters params) {
  275. return params.getString("st", null);
  276. }
  277. public static int getPage(PageParameters params) {
  278. // index from 1
  279. return params.getInt("page", 1);
  280. }
  281. public static String getUsername(PageParameters params) {
  282. return params.getString("user", "");
  283. }
  284. public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone) {
  285. String format = GitBlit.getString(Keys.web.datestampShortFormat, "MM/dd/yy");
  286. DateFormat df = new SimpleDateFormat(format);
  287. if (timeZone != null) {
  288. df.setTimeZone(timeZone);
  289. }
  290. String dateString = df.format(date);
  291. String title = TimeUtils.timeAgo(date);
  292. if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000L) {
  293. String tmp = dateString;
  294. dateString = title;
  295. title = tmp;
  296. }
  297. Label label = new Label(wicketId, dateString);
  298. WicketUtils.setCssClass(label, TimeUtils.timeAgoCss(date));
  299. WicketUtils.setHtmlTooltip(label, title);
  300. return label;
  301. }
  302. public static Label createTimestampLabel(String wicketId, Date date, TimeZone timeZone) {
  303. String format = GitBlit.getString(Keys.web.datetimestampLongFormat,
  304. "EEEE, MMMM d, yyyy h:mm a z");
  305. DateFormat df = new SimpleDateFormat(format);
  306. if (timeZone != null) {
  307. df.setTimeZone(timeZone);
  308. }
  309. String dateString;
  310. if (date.getTime() == 0) {
  311. dateString = "--";
  312. } else {
  313. dateString = df.format(date);
  314. }
  315. String title = TimeUtils.timeAgo(date);
  316. Label label = new Label(wicketId, dateString);
  317. WicketUtils.setHtmlTooltip(label, title);
  318. return label;
  319. }
  320. public static IChartData getChartData(Collection<Metric> metrics) {
  321. final double[] commits = new double[metrics.size()];
  322. final double[] tags = new double[metrics.size()];
  323. int i = 0;
  324. double max = 0;
  325. for (Metric m : metrics) {
  326. commits[i] = m.count;
  327. if (m.tag > 0) {
  328. tags[i] = m.count;
  329. } else {
  330. tags[i] = -1d;
  331. }
  332. max = Math.max(max, m.count);
  333. i++;
  334. }
  335. IChartData data = new AbstractChartData(max) {
  336. private static final long serialVersionUID = 1L;
  337. public double[][] getData() {
  338. return new double[][] { commits, tags };
  339. }
  340. };
  341. return data;
  342. }
  343. public static double maxValue(Collection<Metric> metrics) {
  344. double max = Double.MIN_VALUE;
  345. for (Metric m : metrics) {
  346. if (m.count > max) {
  347. max = m.count;
  348. }
  349. }
  350. return max;
  351. }
  352. public static IChartData getScatterData(Collection<Metric> metrics) {
  353. final double[] y = new double[metrics.size()];
  354. final double[] x = new double[metrics.size()];
  355. int i = 0;
  356. double max = 0;
  357. for (Metric m : metrics) {
  358. y[i] = m.count;
  359. if (m.duration > 0) {
  360. x[i] = m.duration;
  361. } else {
  362. x[i] = -1d;
  363. }
  364. max = Math.max(max, m.count);
  365. i++;
  366. }
  367. IChartData data = new AbstractChartData(max) {
  368. private static final long serialVersionUID = 1L;
  369. public double[][] getData() {
  370. return new double[][] { x, y };
  371. }
  372. };
  373. return data;
  374. }
  375. }