blob: 65335eec9aab9c12cadc6df8c145896099d204a2 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}
}