Search in sources :

Example 6 with RepositoryProblemFacet

use of org.apache.archiva.metadata.model.facets.RepositoryProblemFacet in project archiva by apache.

the class DuplicateArtifactsConsumer method processFile.

@Override
public void processFile(String path) throws ConsumerException {
    Path artifactFile = this.repositoryDir.resolve(path);
    // TODO: would be quicker to somehow make sure it ran after the update database consumer, or as a part of that
    // perhaps could use an artifact context that is retained for all consumers? First in can set the SHA-1
    // alternatively this could come straight from the storage resolver, which could populate the artifact metadata
    // in the later parse call with the desired checksum and use that
    String checksumSha1;
    ChecksummedFile checksummedFile = new ChecksummedFile(artifactFile);
    try {
        checksumSha1 = checksummedFile.calculateChecksum(ChecksumAlgorithm.SHA1);
    } catch (IOException e) {
        throw new ConsumerException(e.getMessage(), e);
    }
    MetadataRepository metadataRepository = repositorySession.getRepository();
    Collection<ArtifactMetadata> results;
    try {
        results = metadataRepository.getArtifactsByChecksum(repoId, checksumSha1);
    } catch (MetadataRepositoryException e) {
        repositorySession.close();
        throw new ConsumerException(e.getMessage(), e);
    }
    if (CollectionUtils.isNotEmpty(results)) {
        ArtifactMetadata originalArtifact;
        try {
            originalArtifact = pathTranslator.getArtifactForPath(repoId, path);
        } catch (Exception e) {
            log.warn("Not reporting problem for invalid artifact in checksum check: {}", e.getMessage());
            return;
        }
        for (ArtifactMetadata dupArtifact : results) {
            String id = path.substring(path.lastIndexOf('/') + 1);
            if (dupArtifact.getId().equals(id) && dupArtifact.getNamespace().equals(originalArtifact.getNamespace()) && dupArtifact.getProject().equals(originalArtifact.getProject()) && dupArtifact.getVersion().equals(originalArtifact.getVersion())) {
                // Skip reference to itself.
                log.debug("Not counting duplicate for artifact {} for path {}", dupArtifact, path);
                continue;
            }
            RepositoryProblemFacet problem = new RepositoryProblemFacet();
            problem.setRepositoryId(repoId);
            problem.setNamespace(originalArtifact.getNamespace());
            problem.setProject(originalArtifact.getProject());
            problem.setVersion(originalArtifact.getVersion());
            problem.setId(id);
            // FIXME: need to get the right storage resolver for the repository the dupe artifact is in, it might be
            // a different type
            // FIXME: we need the project version here, not the artifact version
            problem.setMessage("Duplicate Artifact Detected: " + path + " <--> " + pathTranslator.toPath(dupArtifact.getNamespace(), dupArtifact.getProject(), dupArtifact.getVersion(), dupArtifact.getId()));
            problem.setProblem("duplicate-artifact");
            try {
                metadataRepository.addMetadataFacet(repoId, problem);
            } catch (MetadataRepositoryException e) {
                throw new ConsumerException(e.getMessage(), e);
            }
        }
    }
}
Also used : Path(java.nio.file.Path) MetadataRepositoryException(org.apache.archiva.metadata.repository.MetadataRepositoryException) MetadataRepository(org.apache.archiva.metadata.repository.MetadataRepository) RepositoryProblemFacet(org.apache.archiva.metadata.model.facets.RepositoryProblemFacet) ConsumerException(org.apache.archiva.consumers.ConsumerException) IOException(java.io.IOException) ChecksummedFile(org.apache.archiva.checksum.ChecksummedFile) ArtifactMetadata(org.apache.archiva.metadata.model.ArtifactMetadata) ConsumerException(org.apache.archiva.consumers.ConsumerException) IOException(java.io.IOException) MetadataRepositoryException(org.apache.archiva.metadata.repository.MetadataRepositoryException)

Aggregations

RepositoryProblemFacet (org.apache.archiva.metadata.model.facets.RepositoryProblemFacet)6 MetadataRepositoryException (org.apache.archiva.metadata.repository.MetadataRepositoryException)3 Path (java.nio.file.Path)2 ArrayList (java.util.ArrayList)2 Date (java.util.Date)2 MetadataRepository (org.apache.archiva.metadata.repository.MetadataRepository)2 Test (org.junit.Test)2 FileNotFoundException (java.io.FileNotFoundException)1 IOException (java.io.IOException)1 NoSuchFileException (java.nio.file.NoSuchFileException)1 HashMap (java.util.HashMap)1 List (java.util.List)1 RepositoryAdminException (org.apache.archiva.admin.model.RepositoryAdminException)1 NetworkProxy (org.apache.archiva.admin.model.beans.NetworkProxy)1 ProxyConnector (org.apache.archiva.admin.model.beans.ProxyConnector)1 ChecksummedFile (org.apache.archiva.checksum.ChecksummedFile)1 ConsumerException (org.apache.archiva.consumers.ConsumerException)1 ArtifactMetadata (org.apache.archiva.metadata.model.ArtifactMetadata)1 ProjectVersionMetadata (org.apache.archiva.metadata.model.ProjectVersionMetadata)1 RepositorySession (org.apache.archiva.metadata.repository.RepositorySession)1