blob: fc4e94b71b604209ebcb11a10c9e05d4c0b99686 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2016 Christian Gaege 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:
* Christian Gaege - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.hudson.core.client;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.mylyn.commons.repositories.core.RepositoryLocation;
/**
* Utility class for working with job URLs
*
* @author Christian Gaege
*/
public class HudsonUrlUtil {
private final RepositoryLocation repositoryLocation;
private final Pattern jobNamePattern = Pattern.compile("[^/]+/$"); //$NON-NLS-1$
private final Pattern jobUrlPattern = Pattern.compile("job/[^/]+/$"); //$NON-NLS-1$
private final static String SLASH = "/"; //$NON-NLS-1$
public HudsonUrlUtil(RepositoryLocation repositoryLocation) {
this.repositoryLocation = repositoryLocation;
}
/**
* Assembles a job URL for the given jobName and folderUrl
*
* @param jobName
* @param folderUrl
* @return jobUrl
* @throws HudsonException
*/
public String assembleJobUrl(String jobName, String folderUrl) throws HudsonException {
String encodedJobname;
try {
encodedJobname = new URI(null, jobName, null).toASCIIString();
} catch (URISyntaxException e) {
throw new HudsonException(e);
}
if (!folderUrl.endsWith(SLASH)) {
folderUrl += SLASH;
}
if (!encodedJobname.endsWith(SLASH)) {
encodedJobname += SLASH;
}
return folderUrl + "job" + SLASH + encodedJobname; //$NON-NLS-1$
}
/**
* Converts the given list of jobIds into a Map with job folder URL as key and list of job names within the folder
* as value
*
* @param jobIds
* @return map with folderUrl as key and list of job names as value
* @throws HudsonException
*/
public Map<String, List<String>> groupJobNamesByFolderUrl(List<String> jobIds) throws HudsonException {
Map<String, List<String>> jobNamesByFolderUrl = new HashMap<String, List<String>>();
for (String jobId : jobIds) {
String folderUrl = this.getFolderUrlFromJobId(jobId);
String jobName = getJobNameFromJobId(jobId);
if (jobNamesByFolderUrl.containsKey(folderUrl)) {
jobNamesByFolderUrl.get(folderUrl).add(jobName);
} else {
List<String> jobNames = new ArrayList<String>();
jobNames.add(jobName);
jobNamesByFolderUrl.put(folderUrl, jobNames);
}
}
return jobNamesByFolderUrl;
}
/**
* Extracts the jobName from the job identified by the given jobId
*
* @param jobId
* @return jobName
* @throws HudsonException
*/
private String getJobNameFromJobId(String jobId) throws HudsonException {
Matcher matcher = this.jobNamePattern.matcher(jobId);
if (matcher.find()) {
String jobName = jobId.substring(matcher.start(), jobId.length());
try {
jobName = URLDecoder.decode(jobName, "UTF-8"); //$NON-NLS-1$
} catch (UnsupportedEncodingException e) {
throw new HudsonException(e);
}
if (jobName.endsWith(SLASH)) {
return jobName.substring(0, jobName.length() - 1);
}
return jobName;
}
return jobId;
}
/**
* Returns the folder URL of the job identified by the given jobId. Returns the base URL if the given jobId
* identifies a top level job
*
* @param jobId
* @return folderUrl
*/
private String getFolderUrlFromJobId(String jobId) {
Matcher matcher = this.jobUrlPattern.matcher(jobId);
if (matcher.find()) {
return jobId.substring(0, matcher.start());
}
return baseUrl();
}
/**
* Returns the URL of the job identified by the given jobId
*
* @param jobId
* @return jobUrl
* @throws HudsonException
*/
public String getJobUrlFromJobId(String jobId) throws HudsonException {
Matcher matcher = this.jobUrlPattern.matcher(jobId);
if (matcher.find()) {
return jobId;
}
return this.assembleJobUrl(jobId, baseUrl());
}
/**
* Returns the URL of the repository location
*
* @return baseUrl
*/
public String baseUrl() {
String url = repositoryLocation.getUrl();
if (!url.endsWith(SLASH)) {
url += SLASH;
}
return url;
}
/**
* Determines if the job identified by the given jobId is as nested job or a top level job
*
* @param jobId
* @return true if nested job, otherwise false
*/
public boolean isNestedJob(String jobId) {
return !this.getFolderUrlFromJobId(jobId).equals(baseUrl());
}
/**
* Returns a unique display name for the given jobURL
*
* @param jobUrl
* @return display name
* @throws HudsonException
*/
public String getDisplayName(String jobUrl) throws HudsonException {
String displayName = jobUrl.substring(repositoryLocation.getUrl().length(), jobUrl.length());
if (!displayName.startsWith(SLASH)) {
displayName = SLASH + displayName;
}
displayName = displayName.replaceAll("/job/", SLASH); //$NON-NLS-1$
try {
displayName = URLDecoder.decode(displayName, "UTF-8"); //$NON-NLS-1$
} catch (UnsupportedEncodingException e) {
throw new HudsonException(e);
}
if (displayName.startsWith(SLASH)) {
displayName = displayName.substring(SLASH.length());
}
if (displayName.endsWith(SLASH)) {
displayName = displayName.substring(0, displayName.length() - SLASH.length());
}
return displayName;
}
}