/******************************************************************************* * Copyright (c) 2013, 2016 IBM Corporation 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.ibm.team.build.internal.hjplugin; import hudson.Extension; import hudson.Util; import hudson.model.Descriptor; import hudson.model.Hudson; import hudson.scm.RepositoryBrowser; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.logging.Logger; import org.kohsuke.stapler.DataBoundConstructor; import com.ibm.team.build.internal.hjplugin.RTCChangeLogChangeSetEntry.ChangeDesc; public class RTCRepositoryBrowser extends RepositoryBrowser<RTCChangeLogSetEntry> { private static final Logger LOGGER = Logger.getLogger(RTCRepositoryBrowser.class.getName()); private static final long serialVersionUID = 1L; private static final String SLASH = "/"; //$NON-NLS-1$ private String url; @DataBoundConstructor public RTCRepositoryBrowser(String serverURI) { super(); LOGGER.finest("RTCRepositoryBrowser.constructor : Begin"); //$NON-NLS$1 this.url = getServerURI(serverURI); } /** * @return the server uri guaranteed to have a trailing slash or <code>null</code> if none. */ private String getServerURI(String serverURI) { LOGGER.finest("RTCRepositoryBrowser.getServerURI : Begin"); //$NON-NLS$1 serverURI = Util.fixEmpty(serverURI); if (serverURI != null && !serverURI.endsWith(SLASH)) { serverURI = serverURI + SLASH; } return serverURI; } /** * @return the server uri guaranteed to have a trailing slash or <code>null</code> if none. */ private String getServerURI() { return getServerURI(this.url); } @Override public URL getChangeSetLink(RTCChangeLogSetEntry changeSet) throws IOException { LOGGER.finest("RTCRepositoryBrowser.getChangeSetLink : Begin"); //$NON-NLS$1 if (changeSet instanceof RTCChangeLogChangeSetEntry) { LOGGER.finer("RTCRepositoryBrowser.getChangeSetLink : changeSet is from RTC"); //$NON-NLS$1 RTCChangeLogChangeSetEntry changeSetEntry = (RTCChangeLogChangeSetEntry) changeSet; String workspaceItemId = changeSetEntry.getWorkspaceItemId(); String changeSetItemId = changeSetEntry.getChangeSetItemId(); String serverURI = getServerURI(); if (changeSetItemId != null && serverURI != null) { StringBuilder buffer = new StringBuilder(serverURI); buffer.append("resource/itemOid/com.ibm.team.scm.ChangeSet/"); //$NON-NLS-1$ buffer.append(changeSetItemId); if (workspaceItemId != null && workspaceItemId.length() > 0) { buffer.append("?workspace=").append(workspaceItemId); //$NON-NLS-1$ } return new URL(buffer.toString()); } } return null; } public URL getVersionableStateLink(RTCChangeLogChangeSetEntry changeSet, ChangeDesc changeDesc) throws MalformedURLException { LOGGER.finest("RTCRepositoryBrowser.getVersionableStateLink : Begin"); //$NON-NLS$1 String workspaceItemId = changeSet.getWorkspaceItemId(); String componentItemId = changeSet.getComponentItemId(); String versionableItemId = changeDesc.getItemId(); String versionableStateId = changeDesc.getStateId(); String serverURI = getServerURI(); if (serverURI != null && workspaceItemId != null && componentItemId != null && versionableItemId != null && versionableStateId != null && !changeDesc.isFolderChange()) { StringBuilder buffer = new StringBuilder(serverURI); buffer.append("resource/itemOid/com.ibm.team.scm.Versionable/"); //$NON-NLS-1$ buffer.append(versionableItemId).append("/").append(versionableStateId); //$NON-NLS-1$ buffer.append("?workspace=").append(workspaceItemId); //$NON-NLS-1$ buffer.append("&component=").append(componentItemId); //$NON-NLS-1$ return new URL(buffer.toString()); } return null; } public URL getWorkItemLink(RTCChangeLogChangeSetEntry.WorkItemDesc workItem) throws MalformedURLException { LOGGER.finest("RTCRepositoryBrowser.getWorkItemLink : Begin"); //$NON-NLS$1 String serverURI = getServerURI(); if (serverURI != null && workItem != null && workItem.getNumber() != null && workItem.getNumber().length() > 0) { LOGGER.finer("RTCRepositoryBrowser.getWorkItemLink : Creating work item link"); //$NON-NLS$1 StringBuilder buffer = new StringBuilder(serverURI); buffer.append("resource/itemName/com.ibm.team.workitem.WorkItem/"); //$NON-NLS-1$ buffer.append(workItem.getNumber()); return new URL(buffer.toString()); } return null; } public URL getBaselineSetLink(RTCChangeLogSet changeLog) throws MalformedURLException { LOGGER.finest("RTCRepositoryBrowser.getBaselineSetLink : Begin"); //$NON-NLS$1 String serverURI = getServerURI(); if (serverURI != null && changeLog != null && changeLog.getBaselineSetItemId() != null && changeLog.getBaselineSetItemId().length() > 0) { LOGGER.finer("RTCRepositoryBrowser.getBaselineSetLink : Creating baselineLink"); //$NON-NLS$1 return getItemIdLink(serverURI, "resource/itemOid/com.ibm.team.scm.BaselineSet/", changeLog.getBaselineSetItemId()); } return null; } public URL getBuildDefinitionLink(RTCChangeLogSet changeLog) throws MalformedURLException { LOGGER.finest("RTCRepositoryBrowser.getBuildDefinitionLink : Begin"); //$NON-NLS$1 String serverURI = getServerURI(); if (serverURI != null && changeLog != null) { String buildDefinitionItemId = Util.fixEmptyAndTrim(changeLog.getBuildDefinitionItemId()); if (buildDefinitionItemId == null) { return null; } return getItemIdLink(serverURI, "resource/itemOid/com.ibm.team.build.BuildDefinition/", buildDefinitionItemId); } return null; } public URL getWorkspaceLink(RTCChangeLogSet changeLog) throws MalformedURLException { LOGGER.finest("RTCRepositoryBrowser.getWorkspaceLink : Begin"); //$NON-NLS$1 String serverURI = getServerURI(); if (serverURI != null && changeLog != null) { String workspaceItemId = Util.fixEmptyAndTrim(changeLog.getWorkspaceItemId()); if (workspaceItemId == null) { return null; } return getItemIdLink(serverURI, "resource/itemOid/com.ibm.team.scm.Workspace/", workspaceItemId); } return null; } public URL getStreamLink(RTCChangeLogSet changeLog) throws MalformedURLException { LOGGER.finest("RTCRepositoryBrowser.getStreamLink : Begin"); //$NON-NLS$1 String serverURI = getServerURI(); if (serverURI != null && changeLog != null) { String streamItemId = Util.fixEmptyAndTrim(changeLog.getStreamItemId()); if (streamItemId == null) { return null; } return getItemIdLink(serverURI, "resource/itemOid/com.ibm.team.scm.Workspace/", streamItemId); } return null; } public URL getFullBuildLink(String relativeUrl) throws MalformedURLException { if (relativeUrl == null) { return null; } String rootUrl = Hudson.getInstance().getRootUrl(); String buildUrl = rootUrl + relativeUrl; return new URL(Util.encode(buildUrl)); } public String getBuildNumber(String relativeUrl) { if (relativeUrl == null) { return null; } String [] parts = relativeUrl.split("/"); if (parts.length == 0) { return null; } // The last part should be the build number return parts[parts.length - 1]; } private URL getItemIdLink(String serverURI, String resourcePrefix, String itemId) throws MalformedURLException { if (serverURI != null && resourcePrefix != null && itemId != null) { LOGGER.finer("RTCRepositoryBrowser.getItemIdLink : Creating item id link"); //$NON-NLS$1 StringBuilder buffer = new StringBuilder(serverURI); buffer.append(resourcePrefix); buffer.append(itemId); return new URL(buffer.toString()); } return null; } @Extension public static final class DescriptorImpl extends Descriptor<RepositoryBrowser<?>> { public DescriptorImpl() { super(RTCRepositoryBrowser.class); } @Override public String getDisplayName() { return Messages.RTCRepositoryBrowser_display_name(); } } }