All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.archiva.web.xmlrpc.services.SearchServiceImpl Maven / Gradle / Ivy

The newest version!
package org.apache.archiva.web.xmlrpc.services;

/*
 * 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.archiva.indexer.search.RepositorySearch;
import org.apache.archiva.indexer.search.SearchResultHit;
import org.apache.archiva.indexer.search.SearchResultLimits;
import org.apache.archiva.indexer.search.SearchResults;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.FacetedMetadata;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
import org.apache.archiva.metadata.model.ProjectVersionReference;
import org.apache.archiva.metadata.repository.MetadataRepository;
import org.apache.archiva.metadata.repository.MetadataResolver;
import org.apache.archiva.metadata.repository.RepositorySession;
import org.apache.archiva.metadata.repository.RepositorySessionFactory;
import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet;
import org.apache.archiva.metadata.repository.storage.maven2.MavenProjectFacet;
import org.apache.archiva.web.xmlrpc.api.SearchService;
import org.apache.archiva.web.xmlrpc.api.beans.Artifact;
import org.apache.archiva.web.xmlrpc.api.beans.Dependency;
import org.apache.archiva.web.xmlrpc.security.XmlRpcUserRepositories;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

public class SearchServiceImpl
    implements SearchService
{
    private RepositorySearch search;

    private XmlRpcUserRepositories xmlRpcUserRepositories;

    private RepositorySessionFactory repositorySessionFactory;

    public SearchServiceImpl( XmlRpcUserRepositories xmlRpcUserRepositories,
                              RepositorySessionFactory repositorySessionFactory, RepositorySearch search )
    {
        this.xmlRpcUserRepositories = xmlRpcUserRepositories;
        this.search = search;
        this.repositorySessionFactory = repositorySessionFactory;
    }

    @SuppressWarnings( "unchecked" )
    public List quickSearch( String queryString )
        throws Exception
    {
        List artifacts = new ArrayList();
        List observableRepos = xmlRpcUserRepositories.getObservableRepositories();
        SearchResultLimits limits = new SearchResultLimits( SearchResultLimits.ALL_PAGES );
        SearchResults results;

        results = search.search( "", observableRepos, queryString, limits, null );

        RepositorySession repositorySession = repositorySessionFactory.createSession();
        try
        {
            MetadataResolver metadataResolver = repositorySession.getResolver();

            for ( SearchResultHit resultHit : results.getHits() )
            {
                List resultHitVersions = resultHit.getVersions();
                if ( resultHitVersions != null )
                {
                    for ( String version : resultHitVersions )
                    {
                        Artifact artifact = null;
                        for ( String repoId : observableRepos )
                        {
                            // slight behaviour change to previous implementation: instead of allocating "jar" when not
                            // found in the database, we can rely on the metadata repository to create it on the fly. We
                            // just allocate the default packaging if the Maven facet is not found.
                            FacetedMetadata model = metadataResolver.resolveProjectVersion( repositorySession, repoId,
                                                                                            resultHit.getGroupId(),
                                                                                            resultHit.getArtifactId(),
                                                                                            version );

                            if ( model != null )
                            {
                                String packaging = "jar";

                                MavenProjectFacet facet = (MavenProjectFacet) model.getFacet(
                                    MavenProjectFacet.FACET_ID );
                                if ( facet != null && facet.getPackaging() != null )
                                {
                                    packaging = facet.getPackaging();
                                }
                                artifact = new Artifact( repoId, resultHit.getGroupId(), resultHit.getArtifactId(),
                                                         version, packaging );
                                break;
                            }
                        }

                        if ( artifact != null )
                        {
                            artifacts.add( artifact );
                        }
                    }
                }
            }
        }
        finally
        {
            repositorySession.close();
        }

        return artifacts;
    }

    public List getArtifactByChecksum( String checksum )
        throws Exception
    {
        List observableRepos = xmlRpcUserRepositories.getObservableRepositories();

        RepositorySession repositorySession = repositorySessionFactory.createSession();

        List results = new ArrayList();
        try
        {
            MetadataRepository metadataRepository = repositorySession.getRepository();

            for ( String repoId : observableRepos )
            {
                for ( ArtifactMetadata artifact : metadataRepository.getArtifactsByChecksum( repoId, checksum ) )
                {
                    // TODO: customise XMLRPC to handle non-Maven artifacts
                    MavenArtifactFacet facet = (MavenArtifactFacet) artifact.getFacet( MavenArtifactFacet.FACET_ID );

                    results.add( new Artifact( artifact.getRepositoryId(), artifact.getNamespace(),
                                               artifact.getProject(), artifact.getVersion(),
                                               facet != null ? facet.getType() : null ) );
                }
            }
        }
        finally
        {
            repositorySession.close();
        }
        return results;
    }

    public List getArtifactVersions( String groupId, String artifactId )
        throws Exception
    {
        List artifacts = new ArrayList();
        List observableRepos = xmlRpcUserRepositories.getObservableRepositories();

        RepositorySession repositorySession = repositorySessionFactory.createSession();
        try
        {
            MetadataResolver metadataResolver = repositorySession.getResolver();

            for ( String repoId : observableRepos )
            {
                Collection results = metadataResolver.resolveProjectVersions( repositorySession, repoId,
                                                                                      groupId, artifactId );

                for ( final String version : results )
                {
                    final Artifact artifact = new Artifact( repoId, groupId, artifactId, version, "pom" );

                    artifacts.add( artifact );
                }
            }
        }
        finally
        {
            repositorySession.close();
        }

        return artifacts;
    }

    public List getArtifactVersionsByDate( String groupId, String artifactId, String version, Date since )
        throws Exception
    {
//        List artifacts = new ArrayList();

        // 1. get observable repositories
        // 2. use RepositoryBrowsing method to query uniqueVersions? (but with date)

        throw new UnsupportedOperationException( "getArtifactVersionsByDate not yet implemented" );

//        return artifacts;
    }

    public List getDependencies( String groupId, String artifactId, String version )
        throws Exception
    {
        List observableRepos = xmlRpcUserRepositories.getObservableRepositories();

        RepositorySession repositorySession = repositorySessionFactory.createSession();
        try
        {
            MetadataResolver metadataResolver = repositorySession.getResolver();

            for ( String repoId : observableRepos )
            {
                ProjectVersionMetadata model = metadataResolver.resolveProjectVersion( repositorySession, repoId,
                                                                                       groupId, artifactId, version );
                if ( model != null )
                {
                    List dependencies = new ArrayList();
                    List modelDeps = model.getDependencies();
                    for ( org.apache.archiva.metadata.model.Dependency dep : modelDeps )
                    {
                        Dependency dependency = new Dependency( dep.getGroupId(), dep.getArtifactId(), dep.getVersion(),
                                                                dep.getClassifier(), dep.getType(), dep.getScope() );
                        dependencies.add( dependency );
                    }
                    return dependencies;
                }
            }
        }
        finally
        {
            repositorySession.close();
        }
        throw new Exception( "Artifact does not exist." );
    }

    public List getDependencyTree( String groupId, String artifactId, String version )
        throws Exception
    {
//        List a = new ArrayList();

        throw new UnsupportedOperationException( "getDependencyTree not yet implemented" );
//        return a;
    }

    public List getDependees( String groupId, String artifactId, String version )
        throws Exception
    {
        List artifacts = new ArrayList();
        List observableRepos = xmlRpcUserRepositories.getObservableRepositories();

        RepositorySession repositorySession = repositorySessionFactory.createSession();
        try
        {
            MetadataResolver metadataResolver = repositorySession.getResolver();

            for ( String repoId : observableRepos )
            {
                Collection refs = metadataResolver.resolveProjectReferences( repositorySession,
                                                                                                      repoId, groupId,
                                                                                                      artifactId,
                                                                                                      version );
                for ( ProjectVersionReference ref : refs )
                {
                    artifacts.add( new Artifact( repoId, ref.getNamespace(), ref.getProjectId(),
                                                 ref.getProjectVersion(), "" ) );
                }
            }
        }
        finally
        {
            repositorySession.close();
        }

        return artifacts;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy