/******************************************************************************* * Copyright (c) 2010-2014 SAP AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.view.ext.impl.internal.infobox; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.commons.lang.StringUtils; import org.eclipse.skalli.commons.CollectionUtils; import org.eclipse.skalli.commons.HtmlBuilder; import org.eclipse.skalli.commons.Link; import org.eclipse.skalli.ext.mapping.scm.ScmLocationMapper; import org.eclipse.skalli.ext.mapping.scm.ScmLocationMapping; import org.eclipse.skalli.model.Project; import org.eclipse.skalli.model.ext.devinf.DevInfProjectExt; import org.eclipse.skalli.services.extension.PropertyMapper; import org.eclipse.skalli.view.ext.ExtensionUtil; import org.eclipse.skalli.view.ext.InfoBox; import org.eclipse.skalli.view.ext.InfoBoxBase; import com.vaadin.ui.Component; import com.vaadin.ui.CssLayout; import com.vaadin.ui.Layout; public class ProjectDevInfBox extends InfoBoxBase implements InfoBox { private static final String STYLE_DEFINF_INFOBOX = "infobox-devInf"; //$NON-NLS-1$ // TODO: solve the icon madness private static final String ICON_SOURCES = "/VAADIN/themes/simple/icons/devinf/code.png"; //$NON-NLS-1$ private static final String ICON_BUGTRACKER = "/VAADIN/themes/simple/icons/devinf/bug.png"; //$NON-NLS-1$ private static final String ICON_METRICS = "/VAADIN/themes/simple/icons/devinf/metrics.png"; //$NON-NLS-1$ private static final String ICON_CI_SERVER = "/VAADIN/themes/simple/icons/devinf/ci_server.png"; //$NON-NLS-1$ private static final String ICON_REVIEW = "/VAADIN/themes/simple/icons/devinf/review.png"; //$NON-NLS-1$ private static final String ICON_JAVADOC = "/VAADIN/themes/simple/icons/devinf/javadoc.png"; //$NON-NLS-1$ @Override public String getIconPath() { return "res/icons/devInfInfo.png"; //$NON-NLS-1$ } @Override public String getCaption() { return "Development Information"; } @Override public String getShortName() { return "devInf" ; } @Override public Component getContent(Project project, ExtensionUtil util) { Layout layout = new CssLayout(); layout.addStyleName(STYLE_DEFINF_INFOBOX); layout.setSizeFull(); DevInfProjectExt devInf = project.getExtension(DevInfProjectExt.class); HtmlBuilder html = new HtmlBuilder(); if (devInf != null) { // Project Sources if (StringUtils.isNotBlank(devInf.getScmUrl())) { html.appendIconizedLink(ICON_SOURCES, "Project Sources", devInf.getScmUrl()).appendLineBreak(); } // Bug Tracker if (StringUtils.isNotBlank(devInf.getBugtrackerUrl())) { Set<String> linkList = new HashSet<String>(); linkList.add(devInf.getBugtrackerUrl()); addCreateBugLinks(linkList, util.getLoggedInUserId(), project, devInf); html.appendIconizedLinks(ICON_BUGTRACKER, "Bug Tracker", "(Create Issue)", linkList).appendLineBreak(); } // Code Metrics if (StringUtils.isNotBlank(devInf.getMetricsUrl())) { html.appendIconizedLink(ICON_METRICS, "Code Metrics", devInf.getMetricsUrl()).appendLineBreak(); } // CI / Build Server if (StringUtils.isNotBlank(devInf.getCiUrl())) { html.appendIconizedLink(ICON_CI_SERVER, "Continuous Integration / Build Server", devInf.getCiUrl()) .appendLineBreak(); } // Code Review if (StringUtils.isNotBlank(devInf.getReviewUrl())) { html.appendIconizedLink(ICON_REVIEW, "Code Review", devInf.getReviewUrl()).appendLineBreak(); } // Javadoc if (CollectionUtils.isNotBlank(devInf.getJavadocs())) { html.appendIconizedLinks(ICON_JAVADOC, "Javadoc", "(more Javadoc)", devInf.getJavadocs()).appendLineBreak(); } // SCM Locations if (CollectionUtils.isNotBlank(devInf.getScmLocations())) { html.appendHeader("Source Locations", 4).append('\n'); html.append("<ul>\n"); //$NON-NLS-1$ ScmLocationMapper mapper = new ScmLocationMapper(ScmLocationMapper.ALL_PROVIDERS, ScmLocationMapper.PURPOSE_BROWSE, ScmLocationMapper.PURPOSE_REVIEW); for (String scmLocation : devInf.getScmLocations()) { html.append("<li>"); //$NON-NLS-1$ List<String> scmUrls = getScmUrls(scmLocation, util.getLoggedInUserId(), project); for (String scmUrl: scmUrls) { html.append(copyToClipboardLink(scmUrl, scmUrl)); } List<Link> mappedScmLinks = mapper.getMappedLinks(scmLocation, util.getLoggedInUserId(), project); html.appendLinks(mappedScmLinks); html.append("</li>\n"); //$NON-NLS-1$ } html.append("</ul>\n"); //$NON-NLS-1$ } } if (html.length() > 0) { createLabel(layout, html.toString()); } else { createLabel(layout, "This project has no development information."); } return layout; } /** * Applies all SCM mapping with purpose {@link ScmLocationMapper#PURPOSE_COPY_TO_CLIPBOARD copy-to-clipboard} * to the given <code>scmLocation</code> and returns the mapped SCM URLs for locations that match any * available mapping. If no matching mapping could be found, the <tt>"scm:<provider>:"</tt> prefix * is truncated from the location and returned as sole result entry. */ private List<String> getScmUrls(String scmLocation, String userId, Project project) { List<String> scmUrls = new ArrayList<String>(); ScmLocationMapper mapper = new ScmLocationMapper(ScmLocationMapper.ALL_PROVIDERS, ScmLocationMapper.PURPOSE_COPY_TO_CLIPBOARD); List<ScmLocationMapping> clipboardMappings = mapper.getFilteredMappings(); for (ScmLocationMapping clipboardMapping : clipboardMappings) { String scmUrl = PropertyMapper.convert(scmLocation, clipboardMapping.getPattern(), clipboardMapping.getTemplate(), project, userId); if (scmUrl != null) { scmUrls.add(scmUrl); } } if (scmUrls.isEmpty()) { scmUrls.add(scmLocation.replaceFirst("^scm:.+?:", "")); //$NON-NLS-1$ //$NON-NLS-2$ } return scmUrls; } private void addCreateBugLinks(Set<String> linkList, String userId, Project project, DevInfProjectExt devInf) { List<Link> createBugLinks = getCreateBugUrl(devInf.getBugtrackerUrl(), userId, project); for (Link createBugLink : createBugLinks) { linkList.add(createBugLink.getUrl()); } } private List<Link> getCreateBugUrl(String bugtrackerUrl, String userId, Project project) { ScmLocationMapper mapper = new ScmLocationMapper(ScmLocationMapper.ALL_PROVIDERS, ScmLocationMapper.PURPOSE_CREATE_BUG); return mapper.getMappedLinks(bugtrackerUrl, userId, project); } @Override public float getPositionWeight() { return 1.5f; } @Override public int getPreferredColumn() { return COLUMN_WEST; } @Override public boolean isVisible(Project project, String loggedInUserId) { if (project.getExtension(DevInfProjectExt.class) != null) { return true; } else { return false; } } }