package de.codecentric.jenkins.dashboard.impl.repositories.artifactory; import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.TreeSet; import javax.ws.rs.core.MediaType; import org.jfrog.artifactory.client.Artifactory; import org.jfrog.artifactory.client.ArtifactoryClient; import org.jfrog.artifactory.client.model.RepoPath; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.json.JSONConfiguration; import com.sun.jersey.client.apache.ApacheHttpClient; import com.sun.jersey.client.apache.config.DefaultApacheHttpClientConfig; import de.codecentric.jenkins.dashboard.api.repositories.Artifact; import de.codecentric.jenkins.dashboard.api.repositories.RepositoryInterface; /** * Implementation of Artifactory repository integration * * @author marcel.birkner * */ public class ArtifactoryConnector implements RepositoryInterface { private final static Logger LOGGER = LoggerFactory.getLogger(ArtifactoryConnector.class); private String username; private String password; private URI repositoryURI; public ArtifactoryConnector(String username, String password, URI repositoryURI) { LOGGER.info("ArtifactoryConnector"); this.username = username; this.password = password; this.repositoryURI = repositoryURI; } public boolean canConnect() { LOGGER.info("Checking Artifactory connection"); ClientResponse response = getResponse(); return canConnect(response); } protected boolean canConnect(ClientResponse response) { int status = response.getStatus(); if (status == httpStatusOk) { LOGGER.info("Connection ok"); return true; } LOGGER.error("Could not connect to {}. ResponseCode: {}", repositoryURI, status); return false; } public List<Artifact> getArtefactList(String artifactId) { return getArtefactList("", artifactId); } public List<Artifact> getArtefactList(String groupId, String artifactId) { LOGGER.info("Getting Artefact List from Server [" + repositoryURI + "] for " + groupId + " and " + artifactId); List<Artifact> artifactList = new ArrayList<Artifact>(); if (!org.springframework.util.StringUtils.hasText(artifactId)) { LOGGER.warn("artifactId is empty. Cannot search for artifacts."); return artifactList; } if (!canConnect()) { LOGGER.warn("Please validate your repository connection configuration under the global config."); return artifactList; } List<String> versions = new ArrayList<String>(); Set<String> versionsSet = new TreeSet<String>(); Artifactory artifactory = ArtifactoryClient.create(repositoryURI.toString(), username, password); List<RepoPath> results = artifactory.searches().artifactsByName(artifactId).doSearch(); for (RepoPath item : results) { String itemPath = item.getItemPath(); String[] split = itemPath.split(artifactId); String itemVersion = split[1].replaceAll("/", ""); String itemGroupId = org.apache.commons.lang.StringUtils.removeEnd(split[0], "/").replace("/", "."); if (org.springframework.util.StringUtils.hasText(itemGroupId) && itemGroupId.equalsIgnoreCase(groupId)) { versionsSet.add(itemVersion); } else { versionsSet.add(itemVersion); } } versions.addAll(versionsSet); Collections.sort(versions); Collections.reverse(versions); for (String version : versions) { artifactList.add(new Artifact(artifactId, version, "")); } return artifactList; } private ClientResponse getResponse() { final Client client = buildClient(); final WebResource restResource = client.resource(repositoryURI); final ClientResponse response = restResource.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class); return response; } private Client buildClient() { DefaultApacheHttpClientConfig config = new DefaultApacheHttpClientConfig(); config.getState().setCredentials(null, null, -1, username, password); config.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); Client restClient = ApacheHttpClient.create(config); restClient.setFollowRedirects(true); return restClient; } }