/* | |
* Copyright 2011 gitblit.com. | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.gitblit.wicket; | |
import java.text.DateFormat; | |
import java.text.MessageFormat; | |
import java.text.SimpleDateFormat; | |
import java.util.Collection; | |
import java.util.Date; | |
import java.util.HashMap; | |
import java.util.Map; | |
import java.util.TimeZone; | |
import javax.servlet.http.HttpServletRequest; | |
import org.apache.wicket.Component; | |
import org.apache.wicket.PageParameters; | |
import org.apache.wicket.Request; | |
import org.apache.wicket.behavior.AttributeAppender; | |
import org.apache.wicket.behavior.HeaderContributor; | |
import org.apache.wicket.behavior.SimpleAttributeModifier; | |
import org.apache.wicket.markup.html.IHeaderContributor; | |
import org.apache.wicket.markup.html.IHeaderResponse; | |
import org.apache.wicket.markup.html.basic.Label; | |
import org.apache.wicket.markup.html.image.ContextImage; | |
import org.apache.wicket.model.Model; | |
import org.apache.wicket.protocol.http.WebRequest; | |
import org.apache.wicket.resource.ContextRelativeResource; | |
import org.eclipse.jgit.diff.DiffEntry.ChangeType; | |
import com.gitblit.Constants; | |
import com.gitblit.Constants.AccessPermission; | |
import com.gitblit.Constants.FederationPullStatus; | |
import com.gitblit.IStoredSettings; | |
import com.gitblit.Keys; | |
import com.gitblit.models.FederationModel; | |
import com.gitblit.models.Metric; | |
import com.gitblit.utils.HttpUtils; | |
import com.gitblit.utils.StringUtils; | |
import com.gitblit.utils.TimeUtils; | |
public class WicketUtils { | |
public static void setCssClass(Component container, String value) { | |
container.add(new SimpleAttributeModifier("class", value)); | |
} | |
public static void addCssClass(Component container, String value) { | |
container.add(new AttributeAppender("class", new Model<String>(value), " ")); | |
} | |
public static void setCssStyle(Component container, String value) { | |
container.add(new SimpleAttributeModifier("style", value)); | |
} | |
public static void setCssBackground(Component container, String value) { | |
String background = MessageFormat.format("background-color:{0};", | |
StringUtils.getColor(value)); | |
container.add(new SimpleAttributeModifier("style", background)); | |
} | |
public static void setHtmlTooltip(Component container, String value) { | |
container.add(new SimpleAttributeModifier("title", value)); | |
} | |
public static void setInputPlaceholder(Component container, String value) { | |
container.add(new SimpleAttributeModifier("placeholder", value)); | |
} | |
public static void setChangeTypeCssClass(Component container, ChangeType type) { | |
switch (type) { | |
case ADD: | |
setCssClass(container, "addition"); | |
break; | |
case COPY: | |
case RENAME: | |
setCssClass(container, "rename"); | |
break; | |
case DELETE: | |
setCssClass(container, "deletion"); | |
break; | |
case MODIFY: | |
setCssClass(container, "modification"); | |
break; | |
} | |
} | |
public static void setPermissionClass(Component container, AccessPermission permission) { | |
if (permission == null) { | |
setCssClass(container, "badge"); | |
return; | |
} | |
switch (permission) { | |
case REWIND: | |
case DELETE: | |
case CREATE: | |
setCssClass(container, "badge badge-success"); | |
break; | |
case PUSH: | |
setCssClass(container, "badge badge-info"); | |
break; | |
case CLONE: | |
setCssClass(container, "badge badge-inverse"); | |
break; | |
default: | |
setCssClass(container, "badge"); | |
break; | |
} | |
} | |
public static void setAlternatingBackground(Component c, int i) { | |
String clazz = i % 2 == 0 ? "light" : "dark"; | |
setCssClass(c, clazz); | |
} | |
public static Label createAuthorLabel(String wicketId, String author) { | |
Label label = new Label(wicketId, author); | |
WicketUtils.setHtmlTooltip(label, author); | |
return label; | |
} | |
public static ContextImage getPullStatusImage(String wicketId, FederationPullStatus status) { | |
String filename = null; | |
switch (status) { | |
case MIRRORED: | |
case PULLED: | |
filename = "bullet_green.png"; | |
break; | |
case SKIPPED: | |
filename = "bullet_yellow.png"; | |
break; | |
case FAILED: | |
filename = "bullet_red.png"; | |
break; | |
case EXCLUDED: | |
filename = "bullet_white.png"; | |
break; | |
case PENDING: | |
case NOCHANGE: | |
default: | |
filename = "bullet_black.png"; | |
} | |
return WicketUtils.newImage(wicketId, filename, status.name()); | |
} | |
public static ContextImage getFileImage(String wicketId, String filename) { | |
filename = filename.toLowerCase(); | |
if (filename.endsWith(".java")) { | |
return newImage(wicketId, "file_java_16x16.png"); | |
} else if (filename.endsWith(".rb")) { | |
return newImage(wicketId, "file_ruby_16x16.png"); | |
} else if (filename.endsWith(".php")) { | |
return newImage(wicketId, "file_php_16x16.png"); | |
} else if (filename.endsWith(".cs")) { | |
return newImage(wicketId, "file_cs_16x16.png"); | |
} else if (filename.endsWith(".cpp")) { | |
return newImage(wicketId, "file_cpp_16x16.png"); | |
} else if (filename.endsWith(".c")) { | |
return newImage(wicketId, "file_c_16x16.png"); | |
} else if (filename.endsWith(".h")) { | |
return newImage(wicketId, "file_h_16x16.png"); | |
} else if (filename.endsWith(".sln")) { | |
return newImage(wicketId, "file_vs_16x16.png"); | |
} else if (filename.endsWith(".csv") || filename.endsWith(".xls") | |
|| filename.endsWith(".xlsx")) { | |
return newImage(wicketId, "file_excel_16x16.png"); | |
} else if (filename.endsWith(".doc") || filename.endsWith(".docx")) { | |
return newImage(wicketId, "file_doc_16x16.png"); | |
} else if (filename.endsWith(".ppt") || filename.endsWith(".pptx")) { | |
return newImage(wicketId, "file_ppt_16x16.png"); | |
} else if (filename.endsWith(".zip")) { | |
return newImage(wicketId, "file_zip_16x16.png"); | |
} else if (filename.endsWith(".pdf")) { | |
return newImage(wicketId, "file_acrobat_16x16.png"); | |
} else if (filename.endsWith(".htm") || filename.endsWith(".html")) { | |
return newImage(wicketId, "file_world_16x16.png"); | |
} else if (filename.endsWith(".xml")) { | |
return newImage(wicketId, "file_code_16x16.png"); | |
} else if (filename.endsWith(".properties")) { | |
return newImage(wicketId, "file_settings_16x16.png"); | |
} | |
String ext = StringUtils.getFileExtension(filename).toLowerCase(); | |
IStoredSettings settings = GitBlitWebApp.get().settings(); | |
if (MarkupProcessor.getMarkupExtensions(settings).contains(ext)) { | |
return newImage(wicketId, "file_world_16x16.png"); | |
} | |
return newImage(wicketId, "file_16x16.png"); | |
} | |
public static ContextImage getRegistrationImage(String wicketId, FederationModel registration, | |
Component c) { | |
if (registration.isResultData()) { | |
return WicketUtils.newImage(wicketId, "information_16x16.png", | |
c.getString("gb.federationResults")); | |
} else { | |
return WicketUtils.newImage(wicketId, "arrow_left.png", | |
c.getString("gb.federationRegistration")); | |
} | |
} | |
public static ContextImage newClearPixel(String wicketId) { | |
return newImage(wicketId, "pixel.png"); | |
} | |
public static ContextImage newBlankImage(String wicketId) { | |
return newImage(wicketId, "blank.png"); | |
} | |
public static ContextImage newImage(String wicketId, String file) { | |
return newImage(wicketId, file, null); | |
} | |
public static ContextImage newImage(String wicketId, String file, String tooltip) { | |
ContextImage img = new ContextImage(wicketId, file); | |
if (!StringUtils.isEmpty(tooltip)) { | |
setHtmlTooltip(img, tooltip); | |
} | |
return img; | |
} | |
public static Label newIcon(String wicketId, String css) { | |
Label lbl = new Label(wicketId); | |
setCssClass(lbl, css); | |
return lbl; | |
} | |
public static Label newBlankIcon(String wicketId) { | |
Label lbl = new Label(wicketId); | |
setCssClass(lbl, ""); | |
lbl.setRenderBodyOnly(true); | |
return lbl; | |
} | |
public static ContextRelativeResource getResource(String file) { | |
return new ContextRelativeResource(file); | |
} | |
public static String getGitblitURL(Request request) { | |
HttpServletRequest req = ((WebRequest) request).getHttpServletRequest(); | |
return HttpUtils.getGitblitURL(req); | |
} | |
public static HeaderContributor syndicationDiscoveryLink(final String feedTitle, | |
final String url) { | |
return new HeaderContributor(new IHeaderContributor() { | |
private static final long serialVersionUID = 1L; | |
@Override | |
public void renderHead(IHeaderResponse response) { | |
String contentType = "application/rss+xml"; | |
StringBuilder buffer = new StringBuilder(); | |
buffer.append("<link rel=\"alternate\" "); | |
buffer.append("type=\"").append(contentType).append("\" "); | |
buffer.append("title=\"").append(feedTitle).append("\" "); | |
buffer.append("href=\"").append(url).append("\" />"); | |
response.renderString(buffer.toString()); | |
} | |
}); | |
} | |
public static PageParameters newTokenParameter(String token) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
parameterMap.put("t", token); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newRegistrationParameter(String url, | |
String name) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
parameterMap.put("u", url); | |
parameterMap.put("n", name); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newUsernameParameter(String username) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
parameterMap.put("user", username); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newTeamnameParameter(String teamname) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
parameterMap.put("team", teamname); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newProjectParameter(String projectName) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
parameterMap.put("p", projectName); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newRepositoryParameter(String repositoryName) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
if (!StringUtils.isEmpty(repositoryName)) { | |
parameterMap.put("r", repositoryName); | |
} | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newObjectParameter(String objectId) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
parameterMap.put("h", objectId); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newObjectParameter(String repositoryName, | |
String objectId) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
if (StringUtils.isEmpty(objectId)) { | |
return newRepositoryParameter(repositoryName); | |
} | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", objectId); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newRangeParameter(String repositoryName, | |
String startRange, String endRange) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", startRange + ".." + endRange); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newPathParameter(String repositoryName, | |
String objectId, String path) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
if (StringUtils.isEmpty(path)) { | |
return newObjectParameter(repositoryName, objectId); | |
} | |
if (StringUtils.isEmpty(objectId)) { | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("f", path); | |
return new PageParameters(parameterMap); | |
} | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", objectId); | |
parameterMap.put("f", path); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newLogPageParameter(String repositoryName, | |
String objectId, int pageNumber) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
if (pageNumber <= 1) { | |
return newObjectParameter(repositoryName, objectId); | |
} | |
if (StringUtils.isEmpty(objectId)) { | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("pg", String.valueOf(pageNumber)); | |
return new PageParameters(parameterMap); | |
} | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", objectId); | |
parameterMap.put("pg", String.valueOf(pageNumber)); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newHistoryPageParameter(String repositoryName, | |
String objectId, String path, int pageNumber) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
if (pageNumber <= 1) { | |
return newObjectParameter(repositoryName, objectId); | |
} | |
if (StringUtils.isEmpty(objectId)) { | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("f", path); | |
parameterMap.put("pg", String.valueOf(pageNumber)); | |
return new PageParameters(parameterMap); | |
} | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", objectId); | |
parameterMap.put("f", path); | |
parameterMap.put("pg", String.valueOf(pageNumber)); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newBlobDiffParameter(String repositoryName, | |
String baseCommitId, String commitId, String path) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
if (StringUtils.isEmpty(commitId)) { | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("f", path); | |
parameterMap.put("hb", baseCommitId); | |
return new PageParameters(parameterMap); | |
} | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", commitId); | |
parameterMap.put("f", path); | |
parameterMap.put("hb", baseCommitId); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newSearchParameter(String repositoryName, | |
String commitId, String search, Constants.SearchType type) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
if (StringUtils.isEmpty(commitId)) { | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("s", search); | |
parameterMap.put("st", type.name()); | |
return new PageParameters(parameterMap); | |
} | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", commitId); | |
parameterMap.put("s", search); | |
parameterMap.put("st", type.name()); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newSearchParameter(String repositoryName, | |
String commitId, String search, Constants.SearchType type, | |
int pageNumber) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
if (StringUtils.isEmpty(commitId)) { | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("s", search); | |
parameterMap.put("st", type.name()); | |
parameterMap.put("pg", String.valueOf(pageNumber)); | |
return new PageParameters(parameterMap); | |
} | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", commitId); | |
parameterMap.put("s", search); | |
parameterMap.put("st", type.name()); | |
parameterMap.put("pg", String.valueOf(pageNumber)); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newBlameTypeParameter(String repositoryName, | |
String commitId, String path, String blameType) { | |
Map<String, String> parameterMap = new HashMap<String, String>(); | |
parameterMap.put("r", repositoryName); | |
parameterMap.put("h", commitId); | |
parameterMap.put("f", path); | |
parameterMap.put("blametype", blameType); | |
return new PageParameters(parameterMap); | |
} | |
public static PageParameters newTicketsParameters(String repositoryName, String... states) { | |
PageParameters tParams = newRepositoryParameter(repositoryName); | |
if (states != null) { | |
for (String state : states) { | |
tParams.add("status", state); | |
} | |
} | |
return tParams; | |
} | |
public static PageParameters newOpenTicketsParameter(String repositoryName) { | |
return newTicketsParameters(repositoryName, TicketsUI.openStatii); | |
} | |
public static String getProjectName(PageParameters params) { | |
return params.getString("p", ""); | |
} | |
public static String getRepositoryName(PageParameters params) { | |
return params.getString("r", ""); | |
} | |
public static String getObject(PageParameters params) { | |
return params.getString("h", null); | |
} | |
public static String getPath(PageParameters params) { | |
return params.getString("f", null); | |
} | |
public static String getBaseObjectId(PageParameters params) { | |
return params.getString("hb", null); | |
} | |
public static String getSearchString(PageParameters params) { | |
return params.getString("s", null); | |
} | |
public static String getSearchType(PageParameters params) { | |
return params.getString("st", null); | |
} | |
public static int getPage(PageParameters params) { | |
// index from 1 | |
return params.getInt("pg", 1); | |
} | |
public static String getRegEx(PageParameters params) { | |
return params.getString("x", ""); | |
} | |
public static String getSet(PageParameters params) { | |
return params.getString("set", ""); | |
} | |
public static String getTeam(PageParameters params) { | |
return params.getString("team", ""); | |
} | |
public static int getDaysBack(PageParameters params) { | |
return params.getInt("db", 0); | |
} | |
public static String getUsername(PageParameters params) { | |
return params.getString("user", ""); | |
} | |
public static String getTeamname(PageParameters params) { | |
return params.getString("team", ""); | |
} | |
public static String getToken(PageParameters params) { | |
return params.getString("t", ""); | |
} | |
public static String getUrlParameter(PageParameters params) { | |
return params.getString("u", ""); | |
} | |
public static String getNameParameter(PageParameters params) { | |
return params.getString("n", ""); | |
} | |
public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) { | |
return createDateLabel(wicketId, date, timeZone, timeUtils, true); | |
} | |
public static Label createDateLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils, boolean setCss) { | |
String format = GitBlitWebApp.get().settings().getString(Keys.web.datestampShortFormat, "MM/dd/yy"); | |
DateFormat df = new SimpleDateFormat(format); | |
if (timeZone == null) { | |
timeZone = GitBlitWebApp.get().getTimezone(); | |
} | |
df.setTimeZone(timeZone); | |
String dateString; | |
if (date.getTime() == 0) { | |
dateString = "--"; | |
} else { | |
dateString = df.format(date); | |
} | |
String title = null; | |
if (date.getTime() <= System.currentTimeMillis()) { | |
// past | |
title = timeUtils.timeAgo(date); | |
} | |
if (title != null && (System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000L) { | |
String tmp = dateString; | |
dateString = title; | |
title = tmp; | |
} | |
Label label = new Label(wicketId, dateString); | |
if (setCss) { | |
WicketUtils.setCssClass(label, timeUtils.timeAgoCss(date)); | |
} | |
if (!StringUtils.isEmpty(title)) { | |
WicketUtils.setHtmlTooltip(label, title); | |
} | |
return label; | |
} | |
public static Label createTimeLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) { | |
String format = GitBlitWebApp.get().settings().getString(Keys.web.timeFormat, "HH:mm"); | |
DateFormat df = new SimpleDateFormat(format); | |
if (timeZone == null) { | |
timeZone = GitBlitWebApp.get().getTimezone(); | |
} | |
df.setTimeZone(timeZone); | |
String timeString; | |
if (date.getTime() == 0) { | |
timeString = "--"; | |
} else { | |
timeString = df.format(date); | |
} | |
String title = timeUtils.timeAgo(date); | |
Label label = new Label(wicketId, timeString); | |
if (!StringUtils.isEmpty(title)) { | |
WicketUtils.setHtmlTooltip(label, title); | |
} | |
return label; | |
} | |
public static Label createDatestampLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) { | |
String format = GitBlitWebApp.get().settings().getString(Keys.web.datestampLongFormat, "EEEE, MMMM d, yyyy"); | |
DateFormat df = new SimpleDateFormat(format); | |
if (timeZone == null) { | |
timeZone = GitBlitWebApp.get().getTimezone(); | |
} | |
df.setTimeZone(timeZone); | |
String dateString; | |
if (date.getTime() == 0) { | |
dateString = "--"; | |
} else { | |
dateString = df.format(date); | |
} | |
String title = null; | |
if (TimeUtils.isToday(date, timeZone)) { | |
title = timeUtils.today(); | |
} else if (TimeUtils.isYesterday(date, timeZone)) { | |
title = timeUtils.yesterday(); | |
} else if (date.getTime() <= System.currentTimeMillis()) { | |
// past | |
title = timeUtils.timeAgo(date); | |
} else { | |
// future | |
title = timeUtils.inFuture(date); | |
} | |
if ((System.currentTimeMillis() - date.getTime()) < 10 * 24 * 60 * 60 * 1000L) { | |
String tmp = dateString; | |
dateString = title; | |
title = tmp; | |
} | |
Label label = new Label(wicketId, dateString); | |
if (!StringUtils.isEmpty(title)) { | |
WicketUtils.setHtmlTooltip(label, title); | |
} | |
return label; | |
} | |
public static Label createTimestampLabel(String wicketId, Date date, TimeZone timeZone, TimeUtils timeUtils) { | |
String format = GitBlitWebApp.get().settings().getString(Keys.web.datetimestampLongFormat, | |
"EEEE, MMMM d, yyyy HH:mm Z"); | |
DateFormat df = new SimpleDateFormat(format); | |
if (timeZone == null) { | |
timeZone = GitBlitWebApp.get().getTimezone(); | |
} | |
df.setTimeZone(timeZone); | |
String dateString; | |
if (date.getTime() == 0) { | |
dateString = "--"; | |
} else { | |
dateString = df.format(date); | |
} | |
String title = null; | |
if (date.getTime() <= System.currentTimeMillis()) { | |
// past | |
title = timeUtils.timeAgo(date); | |
} | |
Label label = new Label(wicketId, dateString); | |
if (!StringUtils.isEmpty(title)) { | |
WicketUtils.setHtmlTooltip(label, title); | |
} | |
return label; | |
} | |
public static double maxValue(Collection<Metric> metrics) { | |
double max = Double.MIN_VALUE; | |
for (Metric m : metrics) { | |
if (m.count > max) { | |
max = m.count; | |
} | |
} | |
return max; | |
} | |
} |