Java tutorial
package org.codehaus.mojo.mockrepo; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata; import org.apache.maven.artifact.repository.metadata.GroupRepositoryMetadata; import org.apache.maven.artifact.repository.metadata.Metadata; import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager; import org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.plugin.logging.Log; import org.codehaus.plexus.util.StringUtils; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * A proxy repository that uses maven's repositories to resolve artifacts. */ public class ProxyRepository implements Repository { private final RepositoryMetadataManager repositoryMetadataManager; private final List remoteArtifactRepositories; private final List remotePluginRepositories; private final ArtifactRepository localRepository; private final ArtifactFactory artifactFactory; private final List remoteRepositories; private final VersionRange anyVersion; private final ArtifactResolver artifactResolver; private final Log log; public ProxyRepository(RepositoryMetadataManager repositoryMetadataManager, List remoteArtifactRepositories, List remotePluginRepositories, ArtifactRepository localRepository, ArtifactFactory artifactFactory, Log log, ArtifactResolver artifactResolver) throws InvalidVersionSpecificationException { this.repositoryMetadataManager = repositoryMetadataManager; this.remoteArtifactRepositories = remoteArtifactRepositories; this.remotePluginRepositories = remotePluginRepositories; this.localRepository = localRepository; this.artifactFactory = artifactFactory; this.log = log; this.artifactResolver = artifactResolver; remoteRepositories = new ArrayList(); remoteRepositories.addAll(remoteArtifactRepositories); remoteRepositories.addAll(remotePluginRepositories); anyVersion = VersionRange.createFromVersionSpec("[0,]"); } public Metadata getMetadata(String path) { if (StringUtils.isEmpty(path) || path.length() < 13) { return null; } String coordPath = StringUtils.chompLast(path, "/metadata.xml"); int index = coordPath.lastIndexOf('/'); String artifactId = index == -1 ? null : coordPath.substring(index + 1); String groupId = index == -1 ? null : coordPath.substring(0, index); String pluginGroupId = coordPath.replace('/', '.'); Metadata metadata = new Metadata(); // is this path a groupId:artifactId pair? if (!StringUtils.isEmpty(artifactId) && !StringUtils.isEmpty(groupId)) { final Artifact artifact = artifactFactory.createDependencyArtifact(groupId, artifactId, anyVersion, "pom", null, "compile"); final ArtifactRepositoryMetadata artifactRepositoryMetadata = new ArtifactRepositoryMetadata(artifact); try { repositoryMetadataManager.resolve(artifactRepositoryMetadata, remoteRepositories, localRepository); final Metadata artifactMetadata = artifactRepositoryMetadata.getMetadata(); if (artifactMetadata.getVersioning() != null) { metadata.setGroupId(groupId); metadata.setArtifactId(artifactId); metadata.merge(artifactMetadata); } } catch (RepositoryMetadataResolutionException e) { log.debug(e); } } // if this path a groupId on its own? final GroupRepositoryMetadata groupRepositoryMetadata = new GroupRepositoryMetadata(pluginGroupId); try { repositoryMetadataManager.resolve(groupRepositoryMetadata, remotePluginRepositories, localRepository); metadata.merge(groupRepositoryMetadata.getMetadata()); } catch (RepositoryMetadataResolutionException e) { log.debug(e); } return metadata; } public Content getContent(String path) { // ok, decode the path... it must be formed like so // groupId.replace('.','/')+'/'+artifactId+'/'+version+'/'+artifactId+'-'+version // +(classifier!=null?'-'+classifier:"")+'.'+type String groupId; String artifactId; String version; String classifier; String type; int index1; int index2; int index3; index3 = path.lastIndexOf('/'); if (index3 == -1 || index3 + 1 >= path.length()) { // not a valid content path, so nothing at this path return null; } index2 = path.lastIndexOf('/', index3 - 1); if (index2 == -1) { // not a valid content path, so nothing at this path return null; } version = path.substring(index2 + 1, index3); index1 = path.lastIndexOf('/', index2 - 1); if (index1 == -1) { // not a valid content path, so nothing at this path return null; } artifactId = path.substring(index1 + 1, index2); groupId = path.substring(0, index1).replace('/', '.'); String name = path.substring(index3 + 1); if (!name.startsWith(artifactId + '-' + version)) { // not a valid content path, so nothing at this path return null; } String classifierAndType = name.substring(artifactId.length() + version.length() + 1); // the problem is that both the classifier and the type could legally contain a '.' // so we need to try all posibilities int index = -1; while (-1 != (index = classifierAndType.indexOf('.', index + 1))) { if (index == 0) { classifier = null; } else { classifier = classifierAndType.substring(0, index); } type = classifierAndType.substring(index + 1); Artifact artifact = artifactFactory.createArtifactWithClassifier(groupId, artifactId, version, type, classifier); try { artifactResolver.resolve(artifact, remoteRepositories, localRepository); final File file = artifact.getFile(); if (file != null && file.isFile()) { return new FileContent(file); } } catch (ArtifactResolutionException e) { log.debug(e); } catch (ArtifactNotFoundException e) { log.debug(e); } } return null; // couldn't find the artifact } public List getChildPaths(String path) { return Collections.EMPTY_LIST; } }