001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.eclipse.aether.internal.test.util;
020
021import java.io.File;
022import java.io.IOException;
023import java.nio.file.Files;
024import java.nio.file.Path;
025import java.util.HashSet;
026import java.util.Set;
027
028import org.eclipse.aether.RepositorySystemSession;
029import org.eclipse.aether.artifact.Artifact;
030import org.eclipse.aether.metadata.Metadata;
031import org.eclipse.aether.repository.LocalArtifactRegistration;
032import org.eclipse.aether.repository.LocalArtifactRequest;
033import org.eclipse.aether.repository.LocalArtifactResult;
034import org.eclipse.aether.repository.LocalMetadataRegistration;
035import org.eclipse.aether.repository.LocalMetadataRequest;
036import org.eclipse.aether.repository.LocalMetadataResult;
037import org.eclipse.aether.repository.LocalRepository;
038import org.eclipse.aether.repository.LocalRepositoryManager;
039import org.eclipse.aether.repository.RemoteRepository;
040
041import static java.util.Objects.requireNonNull;
042
043/**
044 * A simplistic local repository manager that uses a temporary base directory.
045 */
046public class TestLocalRepositoryManager implements LocalRepositoryManager {
047
048    private LocalRepository localRepository;
049
050    private final Set<Artifact> unavailableArtifacts = new HashSet<>();
051
052    private final Set<Artifact> artifactRegistrations = new HashSet<>();
053
054    private final Set<Metadata> metadataRegistrations = new HashSet<>();
055
056    public TestLocalRepositoryManager() {
057        try {
058            Path tempDirectory = Files.createTempDirectory("test-local-repo");
059            tempDirectory.toFile().deleteOnExit();
060            localRepository = new LocalRepository(tempDirectory);
061        } catch (IOException e) {
062            throw new IllegalStateException(e);
063        }
064    }
065
066    public LocalRepository getRepository() {
067        return localRepository;
068    }
069
070    public String getPathForLocalArtifact(Artifact artifact) {
071        requireNonNull(artifact, "artifact cannot be null");
072
073        String artifactId = artifact.getArtifactId();
074        String groupId = artifact.getGroupId();
075        String extension = artifact.getExtension();
076        String version = artifact.getVersion();
077        String classifier = artifact.getClassifier();
078
079        return String.format(
080                "%s/%s/%s/%s-%s-%s%s.%s",
081                groupId, artifactId, version, groupId, artifactId, version, classifier, extension);
082    }
083
084    public String getPathForRemoteArtifact(Artifact artifact, RemoteRepository repository, String context) {
085        requireNonNull(artifact, "artifact cannot be null");
086        requireNonNull(repository, "repository cannot be null");
087
088        return getPathForLocalArtifact(artifact);
089    }
090
091    public String getPathForLocalMetadata(Metadata metadata) {
092        requireNonNull(metadata, "metadata cannot be null");
093
094        String artifactId = metadata.getArtifactId();
095        String groupId = metadata.getGroupId();
096        String version = metadata.getVersion();
097        return String.format("%s/%s/%s/%s-%s-%s.xml", groupId, artifactId, version, groupId, artifactId, version);
098    }
099
100    public String getPathForRemoteMetadata(Metadata metadata, RemoteRepository repository, String context) {
101        requireNonNull(metadata, "metadata cannot be null");
102        requireNonNull(repository, "repository cannot be null");
103
104        return getPathForLocalMetadata(metadata);
105    }
106
107    public LocalArtifactResult find(RepositorySystemSession session, LocalArtifactRequest request) {
108        requireNonNull(session, "session cannot be null");
109        requireNonNull(request, "request cannot be null");
110
111        Artifact artifact = request.getArtifact();
112
113        LocalArtifactResult result = new LocalArtifactResult(request);
114        File file = new File(localRepository.getBasedir(), getPathForLocalArtifact(artifact));
115        result.setFile(file.isFile() ? file : null);
116        result.setAvailable(file.isFile() && !unavailableArtifacts.contains(artifact));
117
118        return result;
119    }
120
121    public void add(RepositorySystemSession session, LocalArtifactRegistration request) {
122        requireNonNull(session, "session cannot be null");
123        requireNonNull(request, "request cannot be null");
124
125        artifactRegistrations.add(request.getArtifact());
126    }
127
128    public LocalMetadataResult find(RepositorySystemSession session, LocalMetadataRequest request) {
129        requireNonNull(session, "session cannot be null");
130        requireNonNull(request, "request cannot be null");
131
132        Metadata metadata = request.getMetadata();
133
134        LocalMetadataResult result = new LocalMetadataResult(request);
135        File file = new File(localRepository.getBasedir(), getPathForLocalMetadata(metadata));
136        result.setFile(file.isFile() ? file : null);
137
138        return result;
139    }
140
141    public void add(RepositorySystemSession session, LocalMetadataRegistration request) {
142        requireNonNull(session, "session cannot be null");
143        requireNonNull(request, "request cannot be null");
144
145        metadataRegistrations.add(request.getMetadata());
146    }
147
148    public Set<Artifact> getArtifactRegistration() {
149        return artifactRegistrations;
150    }
151
152    public Set<Metadata> getMetadataRegistration() {
153        return metadataRegistrations;
154    }
155
156    public void setArtifactAvailability(Artifact artifact, boolean available) {
157        if (available) {
158            unavailableArtifacts.remove(artifact);
159        } else {
160            unavailableArtifacts.add(artifact);
161        }
162    }
163}