Package org.apache.archiva.web.xmlrpc.services

Source Code of org.apache.archiva.web.xmlrpc.services.SearchServiceImpl

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<Artifact> quickSearch( String queryString )
        throws Exception
    {
        List<Artifact> artifacts = new ArrayList<Artifact>();
        List<String> 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<String> 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<Artifact> getArtifactByChecksum( String checksum )
        throws Exception
    {
        List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();

        RepositorySession repositorySession = repositorySessionFactory.createSession();

        List<Artifact> results = new ArrayList<Artifact>();
        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<Artifact> getArtifactVersions( String groupId, String artifactId )
        throws Exception
    {
        List<Artifact> artifacts = new ArrayList<Artifact>();
        List<String> observableRepos = xmlRpcUserRepositories.getObservableRepositories();

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

            for ( String repoId : observableRepos )
            {
                Collection<String> 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<Artifact> getArtifactVersionsByDate( String groupId, String artifactId, String version, Date since )
        throws Exception
    {
//        List<Artifact> artifacts = new ArrayList<Artifact>();

        // 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<Dependency> getDependencies( String groupId, String artifactId, String version )
        throws Exception
    {
        List<String> 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<Dependency> dependencies = new ArrayList<Dependency>();
                    List<org.apache.archiva.metadata.model.Dependency> 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<Artifact> getDependencyTree( String groupId, String artifactId, String version )
        throws Exception
    {
//        List<Artifact> a = new ArrayList<Artifact>();

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

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

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

            for ( String repoId : observableRepos )
            {
                Collection<ProjectVersionReference> 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;
    }
}
TOP

Related Classes of org.apache.archiva.web.xmlrpc.services.SearchServiceImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.