package de.codecentric.jenkins.dashboard.impl.repositories.nexus; import java.net.URI; import java.util.ArrayList; import java.util.List; import javax.ws.rs.core.MediaType; 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 Sonatype Nexus repository integration. * * @author marcel.birkner * */ public class NexusConnector implements RepositoryInterface { private final static Logger LOGGER = LoggerFactory.getLogger(NexusConnector.class); private String username; private String password; private URI repositoryURI; public NexusConnector(String username, String password, URI repositoryURI) { this.username = username; this.password = password; this.repositoryURI = repositoryURI; } public boolean canConnect() { LOGGER.info("Checking Nexus connection"); final Client client = buildClient(); final WebResource restResource = client.resource(repositoryURI); final ClientResponse response = restResource.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class); int status = response.getStatus(); if (status == httpStatusOk) { return true; } LOGGER.warn("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("Get artifact list for " + groupId + " " + artifactId); List<Artifact> list = new ArrayList<Artifact>(); final Client client = buildClient(); final WebResource restResource = client.resource(repositoryURI); WebResource path = restResource.path("service").path("local").path("lucene").path("search"); WebResource queryParam = path.queryParam("g", groupId).queryParam("a", artifactId); final ClientResponse clientResponse = queryParam.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class); final SearchResponse response = clientResponse.getEntity(SearchResponse.class); List<NexusArtifact> data = response.getData(); for (NexusArtifact nexusArtifact : data) { Artifact a = new Artifact(nexusArtifact.getArtifactId(), nexusArtifact.getVersion(), ""); list.add(a); } return list; } 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; } }