/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.
*
*/
package org.guvnor.m2repo.backend.server.repositories;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOCase;
import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.deployment.DeployRequest;
import org.eclipse.aether.deployment.DeploymentException;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
import org.guvnor.common.services.project.model.GAV;
import org.guvnor.m2repo.backend.server.ArtifactImpl;
import org.kie.scanner.Aether;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.uberfire.apache.commons.io.FilenameUtils;
public class FileSystemArtifactRepository implements ArtifactRepository {
private final String name;
private Logger logger = LoggerFactory.getLogger(FileSystemArtifactRepository.class);
private RemoteRepository repository;
private String repositoryDirectory;
public FileSystemArtifactRepository(final String name,
final String dir) {
this.name = name;
final String m2RepoDir = FilenameUtils.normalize(dir.trim() + File.separatorChar);
logger.info("Maven Repository root set to: " + m2RepoDir);
//Ensure repository root has been created
final File root = new File(m2RepoDir);
if (!root.exists()) {
logger.info("Creating Maven Repository root: " + m2RepoDir);
root.mkdirs();
}
this.repositoryDirectory = dir;
this.repository = this.createRepository(dir);
Aether.getAether().getRepositories().add(this.getRepository());
}
@Override
public String getName() {
return this.name;
}
@Override
public Collection<File> listFiles(final List<String> wildcards) {
return FileUtils.listFiles(new File(this.getRepositoryDirectory()),
new WildcardFileFilter(wildcards,
IOCase.INSENSITIVE),
DirectoryFileFilter.DIRECTORY);
}
@Override
public Collection<Artifact> listArtifacts(final List<String> wildcards) {
final Collection<File> files = this.listFiles(wildcards);
return files.stream().map(file -> {
final HashMap<String, String> map = new HashMap<String, String>();
map.put("repository",
this.getName());
final ArtifactImpl artifact = new ArtifactImpl(file);
artifact.setProperties(map);
return artifact;
}).collect(Collectors.toList());
}
@Override
public boolean containsArtifact(final GAV gav) {
ArtifactRequest request = createArtifactRequest(gav);
try {
Aether aether = Aether.getAether();
aether.getSystem().resolveArtifact(aether.getSession(),
request);
} catch (ArtifactResolutionException e) {
logger.trace("Artifact {} not found.",
gav,
e);
return false;
}
logger.trace("Artifact {} found.",
gav);
return true;
}
@Override
public File getArtifactFileFromRepository(final GAV gav) {
ArtifactRequest request = createArtifactRequest(gav);
ArtifactResult result = null;
try {
result = Aether.getAether().getSystem().resolveArtifact(
Aether.getAether().getSession(),
request);
} catch (ArtifactResolutionException e) {
logger.warn(e.getMessage(),
e);
}
if (result == null) {
return null;
}
File artifactFile = null;
if (result.isResolved() && !result.isMissing()) {
artifactFile = result.getArtifact().getFile();
}
return artifactFile;
}
@Override
public void deploy(final String pom,
final Artifact... artifacts) {
try {
final DeployRequest deployRequest = new DeployRequest();
for (Artifact artifact : artifacts) {
deployRequest.addArtifact(artifact);
}
deployRequest.setRepository(getRepository());
Aether.getAether().getSystem().deploy(Aether.getAether().getSession(),
deployRequest);
} catch (DeploymentException e) {
throw new RuntimeException(e);
}
}
@Override
public void delete(final GAV gav) {
}
private ArtifactRequest createArtifactRequest(final GAV gav) {
ArtifactRequest request = new ArtifactRequest();
request.addRepository(this.getRepository());
DefaultArtifact artifact = new DefaultArtifact(gav.getGroupId(),
gav.getArtifactId(),
"jar",
gav.getVersion());
request.setArtifact(artifact);
return request;
}
protected RemoteRepository getRepository() {
return this.repository;
}
private RemoteRepository createRepository(final String dir) {
File m2RepoDir = new File(dir);
if (!m2RepoDir.exists()) {
logger.error("Repository root does not exist: " + dir);
throw new IllegalArgumentException("Repository root does not exist: " + dir);
}
try {
String localRepositoryUrl = m2RepoDir.toURI().toURL().toExternalForm();
return new RemoteRepository.Builder("guvnor-m2-repo",
"default",
localRepositoryUrl)
.setSnapshotPolicy(new RepositoryPolicy(true,
RepositoryPolicy.UPDATE_POLICY_DAILY,
RepositoryPolicy.CHECKSUM_POLICY_WARN))
.setReleasePolicy(new RepositoryPolicy(true,
RepositoryPolicy.UPDATE_POLICY_ALWAYS,
RepositoryPolicy.CHECKSUM_POLICY_WARN))
.build();
} catch (MalformedURLException e) {
logger.error(e.getMessage(),
e);
throw new RuntimeException(e);
}
}
private String getRepositoryDirectory() {
return repositoryDirectory;
}
}