]> source.dussan.org Git - archiva.git/commitdiff
[MRM-161] move the query layer to a separate module
authorBrett Porter <brett@apache.org>
Tue, 5 Sep 2006 05:12:31 +0000 (05:12 +0000)
committerBrett Porter <brett@apache.org>
Tue, 5 Sep 2006 05:12:31 +0000 (05:12 +0000)
git-svn-id: https://svn.apache.org/repos/asf/maven/archiva/trunk@440260 13f79535-47bb-0310-9956-ffa450edef68

25 files changed:
archiva-reports-standard/pom.xml
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/AbstractRepositoryQueryLayer.java [deleted file]
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/BadMetadataReportProcessor.java
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/Cache.java [deleted file]
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/CachedRepositoryQueryLayer.java [deleted file]
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultArtifactReportProcessor.java
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultRepositoryQueryLayer.java [deleted file]
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultRepositoryQueryLayerFactory.java [deleted file]
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayer.java [deleted file]
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayerException.java [deleted file]
archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayerFactory.java [deleted file]
archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/AbstractRepositoryQueryLayerTestCase.java
archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/CacheTest.java
archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/CachedRepositoryQueryLayerTest.java
archiva-reports-standard/src/test/java/org/apache/maven/archiva/reporting/MockRepositoryQueryLayer.java
archiva-repository-layer/pom.xml [new file with mode: 0644]
archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayer.java [new file with mode: 0644]
archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/Cache.java [new file with mode: 0644]
archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayer.java [new file with mode: 0644]
archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayer.java [new file with mode: 0644]
archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayerFactory.java [new file with mode: 0644]
archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayer.java [new file with mode: 0644]
archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayerException.java [new file with mode: 0644]
archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayerFactory.java [new file with mode: 0644]
pom.xml

index 64df5f2d6b4ea9111556deaa68310a16b8cbf15b..6a0bb7183278d50647ec54b29dbe524c17f6b68b 100755 (executable)
       <groupId>org.apache.maven.archiva</groupId>
       <artifactId>archiva-utils</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.maven.archiva</groupId>
+      <artifactId>archiva-repository-layer</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.apache.maven.archiva</groupId>
       <artifactId>archiva-indexer</artifactId>
diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/AbstractRepositoryQueryLayer.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/AbstractRepositoryQueryLayer.java
deleted file mode 100644 (file)
index 8d9bc6e..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-package org.apache.maven.archiva.reporting;
-
-/*
- * Copyright 2005-2006 The Apache Software Foundation.
- *
- * 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.
- */
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
-import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.List;
-
-/**
- *
- */
-public abstract class AbstractRepositoryQueryLayer
-    implements RepositoryQueryLayer
-{
-    protected ArtifactRepository repository;
-
-    public boolean containsArtifact( Artifact artifact )
-    {
-        File f = new File( repository.getBasedir(), repository.pathOf( artifact ) );
-        return f.exists();
-    }
-
-    public boolean containsArtifact( Artifact artifact, Snapshot snapshot )
-    {
-        String artifactPath = getSnapshotArtifactRepositoryPath( artifact, snapshot );
-        File artifactFile = new File( artifactPath );
-        return artifactFile.exists();
-    }
-
-    public List getVersions( Artifact artifact )
-        throws RepositoryQueryLayerException
-    {
-        Metadata metadata = getMetadata( artifact );
-
-        return metadata.getVersioning().getVersions();
-    }
-
-    protected String getSnapshotArtifactRepositoryPath( Artifact artifact, Snapshot snapshot )
-    {
-        File f = new File( repository.getBasedir(), repository.pathOf( artifact ) );
-        String snapshotInfo = artifact.getVersion().replaceFirst( "SNAPSHOT", snapshot.getTimestamp() + "-" +
-            snapshot.getBuildNumber() + ".pom" );
-        File snapshotFile = new File( f.getParentFile(), artifact.getArtifactId() + "-" + snapshotInfo );
-        return snapshotFile.getAbsolutePath();
-    }
-
-    protected Metadata getMetadata( Artifact artifact )
-        throws RepositoryQueryLayerException
-    {
-        Metadata metadata;
-
-        ArtifactRepositoryMetadata repositoryMetadata = new ArtifactRepositoryMetadata( artifact );
-        String path = repository.pathOfRemoteRepositoryMetadata( repositoryMetadata );
-        File metadataFile = new File( repository.getBasedir(), path );
-        if ( metadataFile.exists() )
-        {
-            MetadataXpp3Reader reader = new MetadataXpp3Reader();
-            try
-            {
-                metadata = reader.read( new FileReader( metadataFile ) );
-            }
-            catch ( FileNotFoundException e )
-            {
-                throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e );
-            }
-            catch ( IOException e )
-            {
-                throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e );
-            }
-            catch ( XmlPullParserException e )
-            {
-                throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e );
-            }
-        }
-        else
-        {
-            throw new RepositoryQueryLayerException( "Metadata not found: " + metadataFile.getAbsolutePath() );
-        }
-
-        return metadata;
-    }
-}
index bb3869ad295b3a74de963d773e677ab0ca949720..73352400244227d4f5458dace01cb9adaa588e85 100644 (file)
@@ -16,6 +16,8 @@ package org.apache.maven.archiva.reporting;
  * limitations under the License.
  */
 
+import org.apache.maven.archiva.layer.RepositoryQueryLayer;
+import org.apache.maven.archiva.layer.RepositoryQueryLayerFactory;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/Cache.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/Cache.java
deleted file mode 100644 (file)
index 2559cf2..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-package org.apache.maven.archiva.reporting;
-
-/*
- * Copyright 2005-2006 The Apache Software Foundation.
- *
- * 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.
- */
-
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-/**
- * Class to implement caching.
- */
-public class Cache
-{
-    private final Map cache;
-
-    private final double cacheHitRatio;
-
-    private final int cacheMaxSize;
-
-    private long cacheHits;
-
-    private long cacheMiss;
-
-    /**
-     * Caches all data and expires only the oldest data when the specified cache hit rate is reached.
-     */
-    public Cache( double cacheHitRatio )
-    {
-        this( cacheHitRatio, 0 );
-    }
-
-    /**
-     * Caches all data and expires only the oldest data when the maximum cache size is reached
-     */
-    public Cache( int cacheMaxSize )
-    {
-        this( (double) 1, cacheMaxSize );
-    }
-
-    /**
-     * Caches all data and expires only the oldest data when either the specified cache hit rate is reached
-     * or the maximum cache size is reached.
-     */
-    public Cache( double cacheHitRatio, int cacheMaxSize )
-    {
-        this.cacheHitRatio = cacheHitRatio;
-        this.cacheMaxSize = cacheMaxSize;
-
-        if ( cacheMaxSize > 0 )
-        {
-            cache = new LinkedHashMap( cacheMaxSize );
-        }
-        else
-        {
-            cache = new LinkedHashMap();
-        }
-    }
-
-    /**
-     * Check if the specified key is already mapped to an object.
-     *
-     * @param key the key used to map the cached object
-     * @return true if the cache contains an object associated with the given key
-     */
-    public boolean containsKey( Object key )
-    {
-        boolean contains;
-        synchronized ( cache )
-        {
-            contains = cache.containsKey( key );
-
-            if ( contains )
-            {
-                cacheHits++;
-            }
-            else
-            {
-                cacheMiss++;
-            }
-        }
-
-        return contains;
-    }
-
-    /**
-     * Check for a cached object and return it if it exists. Returns null when the keyed object is not found
-     *
-     * @param key the key used to map the cached object
-     * @return the object mapped to the given key, or null if no cache object is mapped to the given key
-     */
-    public Object get( Object key )
-    {
-        Object retValue = null;
-
-        synchronized ( cache )
-        {
-            if ( cache.containsKey( key ) )
-            {
-                // remove and put: this promotes it to the top since we use a linked hash map
-                retValue = cache.remove( key );
-
-                cache.put( key, retValue );
-
-                cacheHits++;
-            }
-            else
-            {
-                cacheMiss++;
-            }
-        }
-
-        return retValue;
-    }
-
-    /**
-     * Cache the given value and map it using the given key
-     *
-     * @param key   the object to map the valued object
-     * @param value the object to cache
-     */
-    public void put( Object key, Object value )
-    {
-        // remove and put: this promotes it to the top since we use a linked hash map
-        synchronized ( cache )
-        {
-            if ( cache.containsKey( key ) )
-            {
-                cache.remove( key );
-            }
-
-            cache.put( key, value );
-        }
-
-        manageCache();
-    }
-
-    /**
-     * Compute for the efficiency of this cache.
-     *
-     * @return the ratio of cache hits to the cache misses to queries for cache objects
-     */
-    public double getHitRate()
-    {
-        synchronized ( cache )
-        {
-            return cacheHits == 0 && cacheMiss == 0 ? 0 : (double) cacheHits / (double) ( cacheHits + cacheMiss );
-        }
-    }
-
-    /**
-     * Get the total number of cache objects currently cached.
-     */
-    public int size()
-    {
-        return cache.size();
-    }
-
-    /**
-     * Empty the cache and reset the cache hit rate
-     */
-    public void clear()
-    {
-        synchronized ( cache )
-        {
-            cacheHits = 0;
-            cacheMiss = 0;
-            cache.clear();
-        }
-    }
-
-    private void manageCache()
-    {
-        synchronized ( cache )
-        {
-            Iterator iterator = cache.entrySet().iterator();
-            if ( cacheMaxSize == 0 )
-            {
-                //desired HitRatio is reached, we can trim the cache to conserve memory
-                if ( cacheHitRatio <= getHitRate() )
-                {
-                    iterator.next();
-                    iterator.remove();
-                }
-            }
-            else if ( cache.size() > cacheMaxSize )
-            {
-                // maximum cache size is reached
-                while ( cache.size() > cacheMaxSize )
-                {
-                    iterator.next();
-                    iterator.remove();
-                }
-            }
-            else
-            {
-                //even though the max has not been reached, the desired HitRatio is already reached,
-                //    so we can trim the cache to conserve memory
-                if ( cacheHitRatio <= getHitRate() )
-                {
-                    iterator.next();
-                    iterator.remove();
-                }
-            }
-        }
-    }
-
-}
diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/CachedRepositoryQueryLayer.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/CachedRepositoryQueryLayer.java
deleted file mode 100644 (file)
index 7b45589..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.apache.maven.archiva.reporting;
-
-/*
- * Copyright 2005-2006 The Apache Software Foundation.
- *
- * 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.
- */
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.metadata.Metadata;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-
-
-/**
- * 
- */
-public class CachedRepositoryQueryLayer
-    extends AbstractRepositoryQueryLayer
-{
-    private Cache cache;
-
-    public static final double CACHE_HIT_RATIO = 0.5;
-
-    public CachedRepositoryQueryLayer( ArtifactRepository repository )
-    {
-        this.repository = repository;
-
-        cache = new Cache( CACHE_HIT_RATIO );
-    }
-
-    public double getCacheHitRate()
-    {
-        return cache.getHitRate();
-    }
-
-    public boolean containsArtifact( Artifact artifact )
-    {
-        boolean artifactFound = true;
-
-        String artifactPath = repository.getBasedir() + "/" + repository.pathOf( artifact );
-
-        if ( cache.get( artifactPath ) == null )
-        {
-            artifactFound = super.containsArtifact( artifact );
-            if ( artifactFound )
-            {
-                cache.put( artifactPath, artifactPath );
-            }
-        }
-
-        return artifactFound;
-    }
-
-    public boolean containsArtifact( Artifact artifact, Snapshot snapshot )
-    {
-        boolean artifactFound = true;
-
-        String path = getSnapshotArtifactRepositoryPath( artifact, snapshot );
-
-        if ( cache.get( path ) == null )
-        {
-            artifactFound = super.containsArtifact( artifact, snapshot );
-            if ( artifactFound )
-            {
-                cache.put( path, path );
-            }
-        }
-
-        return artifactFound;
-    }
-
-    /**
-     * Override method to utilize the cache
-     */
-    protected Metadata getMetadata( Artifact artifact )
-        throws RepositoryQueryLayerException
-    {
-        Metadata metadata = (Metadata) cache.get( artifact.getId() );
-
-        if ( metadata == null )
-        {
-            metadata = super.getMetadata( artifact );
-            cache.put( artifact.getId(), metadata );
-        }
-
-        return metadata;
-    }
-}
index 040113af669cc0ba5c8301a7a91416e2e57c07c0..22e220a66db18a129a0357c0483c467e0c243a23 100644 (file)
@@ -16,6 +16,7 @@ package org.apache.maven.archiva.reporting;
  * limitations under the License.
  */
 
+import org.apache.maven.archiva.layer.RepositoryQueryLayer;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultRepositoryQueryLayer.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultRepositoryQueryLayer.java
deleted file mode 100644 (file)
index 4b000fb..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.maven.archiva.reporting;
-
-/*
- * Copyright 2005-2006 The Apache Software Foundation.
- *
- * 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.
- */
-
-import org.apache.maven.artifact.repository.ArtifactRepository;
-
-/**
- * 
- */
-public class DefaultRepositoryQueryLayer
-    extends AbstractRepositoryQueryLayer
-{
-    public DefaultRepositoryQueryLayer( ArtifactRepository repository )
-    {
-        this.repository = repository;
-    }
-}
diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultRepositoryQueryLayerFactory.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/DefaultRepositoryQueryLayerFactory.java
deleted file mode 100644 (file)
index ec607b6..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.apache.maven.archiva.reporting;
-
-/*
- * Copyright 2005-2006 The Apache Software Foundation.
- *
- * 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.
- */
-
-import org.apache.maven.artifact.repository.ArtifactRepository;
-
-/**
- * Gets the default implementation of a repository query layer for the given repository.
- *
- * @author <a href="mailto:brett@apache.org">Brett Porter</a>
- * @version $Id$
- * @plexus.component role="org.apache.maven.archiva.reporting.RepositoryQueryLayerFactory"
- */
-public class DefaultRepositoryQueryLayerFactory
-    implements RepositoryQueryLayerFactory
-{
-    public RepositoryQueryLayer createRepositoryQueryLayer( ArtifactRepository repository )
-    {
-        return new DefaultRepositoryQueryLayer( repository );
-    }
-}
diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayer.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayer.java
deleted file mode 100644 (file)
index bde683e..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.apache.maven.archiva.reporting;
-
-/*
- * Copyright 2005-2006 The Apache Software Foundation.
- *
- * 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.
- */
-
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.metadata.Snapshot;
-
-import java.util.List;
-
-/**
- * The transitive and metadata validation reports will need to query the repository for artifacts.
- */
-public interface RepositoryQueryLayer
-{
-    String ROLE = RepositoryQueryLayer.class.getName();
-
-    boolean containsArtifact( Artifact artifact );
-
-    /**
-     * @todo I believe we can remove this [BP] - artifact should contain all the necessary version info!
-     */
-    boolean containsArtifact( Artifact artifact, Snapshot snapshot );
-
-    List getVersions( Artifact artifact )
-        throws RepositoryQueryLayerException;
-}
diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayerException.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayerException.java
deleted file mode 100644 (file)
index a954153..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.apache.maven.archiva.reporting;
-
-/*
- * Copyright 2005-2006 The Apache Software Foundation.
- *
- * 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.
- */
-
-/**
- *
- */
-public class RepositoryQueryLayerException
-    extends Exception
-{
-    public RepositoryQueryLayerException( String message, Throwable cause )
-    {
-        super( message, cause );
-    }
-
-    public RepositoryQueryLayerException( String message )
-    {
-        super( message );
-    }
-}
diff --git a/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayerFactory.java b/archiva-reports-standard/src/main/java/org/apache/maven/archiva/reporting/RepositoryQueryLayerFactory.java
deleted file mode 100644 (file)
index e69527b..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.apache.maven.archiva.reporting;
-
-/*
- * Copyright 2005-2006 The Apache Software Foundation.
- *
- * 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.
- */
-
-import org.apache.maven.artifact.repository.ArtifactRepository;
-
-/**
- * Gets the preferred implementation of a repository query layer for the given repository.
- *
- * @author <a href="mailto:brett@apache.org">Brett Porter</a>
- * @version $Id$
- */
-public interface RepositoryQueryLayerFactory
-{
-    String ROLE = RepositoryQueryLayerFactory.class.getName();
-
-    /**
-     * Create or obtain a query interface.
-     *
-     * @param repository the repository to query
-     * @return the obtained query layer
-     */
-    RepositoryQueryLayer createRepositoryQueryLayer( ArtifactRepository repository );
-}
index 0774095d5b890c3a348a28423e4b6a3c98c083d2..52fd4efc565c31db3c1e9e8cddb44a33fbfc83df 100644 (file)
@@ -16,6 +16,8 @@ package org.apache.maven.archiva.reporting;
  * limitations under the License.
  */
 
+import org.apache.maven.archiva.layer.CachedRepositoryQueryLayer;
+import org.apache.maven.archiva.layer.RepositoryQueryLayerException;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
index 123e92f30749bd12bc8dc6b6ee7a840b0e9a7158..65d6f8109e9a084546ca743fd4b282feca760572 100644 (file)
@@ -17,6 +17,7 @@ package org.apache.maven.archiva.reporting;
  */
 
 import junit.framework.TestCase;
+import org.apache.maven.archiva.layer.Cache;
 
 /**
  *
index 44e3d3108eb80e2cd41c7b558e1b053873187f1f..bba92c722d82a7c11f0780ad66e3b8407b14a84c 100644 (file)
@@ -1,5 +1,7 @@
 package org.apache.maven.archiva.reporting;
 
+import org.apache.maven.archiva.layer.CachedRepositoryQueryLayer;
+
 /*
  * Copyright 2005-2006 The Apache Software Foundation.
  *
index 6657a29a0097794dbbd64e071d6c544c48f46f6e..e1aa69ac2a2636bd186f4a46bcf83e0b47d9e671 100644 (file)
@@ -16,6 +16,7 @@ package org.apache.maven.archiva.reporting;
  * limitations under the License.
  */
 
+import org.apache.maven.archiva.layer.RepositoryQueryLayer;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.repository.metadata.Snapshot;
 
@@ -25,7 +26,7 @@ import java.util.Iterator;
 import java.util.List;
 
 /**
- * 
+ *
  */
 public class MockRepositoryQueryLayer
     implements RepositoryQueryLayer
diff --git a/archiva-repository-layer/pom.xml b/archiva-repository-layer/pom.xml
new file mode 100644 (file)
index 0000000..3b177c2
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+
+<!--
+  ~ Copyright 2005-2006 The Apache Software Foundation.
+  ~
+  ~ 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.
+  -->
+
+<project>
+  <parent>
+    <artifactId>archiva</artifactId>
+    <groupId>org.apache.maven.archiva</groupId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.maven.archiva</groupId>
+  <artifactId>archiva-repository-layer</artifactId>
+  <name>Archiva Repository Interface Layer</name>
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-artifact-manager</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-repository-metadata</artifactId>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayer.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/AbstractRepositoryQueryLayer.java
new file mode 100644 (file)
index 0000000..60b0e5b
--- /dev/null
@@ -0,0 +1,106 @@
+package org.apache.maven.archiva.layer;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.metadata.ArtifactRepositoryMetadata;
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.Snapshot;
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ *
+ */
+public abstract class AbstractRepositoryQueryLayer
+    implements RepositoryQueryLayer
+{
+    protected ArtifactRepository repository;
+
+    public boolean containsArtifact( Artifact artifact )
+    {
+        File f = new File( repository.getBasedir(), repository.pathOf( artifact ) );
+        return f.exists();
+    }
+
+    public boolean containsArtifact( Artifact artifact, Snapshot snapshot )
+    {
+        String artifactPath = getSnapshotArtifactRepositoryPath( artifact, snapshot );
+        File artifactFile = new File( artifactPath );
+        return artifactFile.exists();
+    }
+
+    public List getVersions( Artifact artifact )
+        throws RepositoryQueryLayerException
+    {
+        Metadata metadata = getMetadata( artifact );
+
+        return metadata.getVersioning().getVersions();
+    }
+
+    protected String getSnapshotArtifactRepositoryPath( Artifact artifact, Snapshot snapshot )
+    {
+        File f = new File( repository.getBasedir(), repository.pathOf( artifact ) );
+        String snapshotInfo = artifact.getVersion().replaceFirst( "SNAPSHOT", snapshot.getTimestamp() + "-" +
+            snapshot.getBuildNumber() + ".pom" );
+        File snapshotFile = new File( f.getParentFile(), artifact.getArtifactId() + "-" + snapshotInfo );
+        return snapshotFile.getAbsolutePath();
+    }
+
+    protected Metadata getMetadata( Artifact artifact )
+        throws RepositoryQueryLayerException
+    {
+        Metadata metadata;
+
+        ArtifactRepositoryMetadata repositoryMetadata = new ArtifactRepositoryMetadata( artifact );
+        String path = repository.pathOfRemoteRepositoryMetadata( repositoryMetadata );
+        File metadataFile = new File( repository.getBasedir(), path );
+        if ( metadataFile.exists() )
+        {
+            MetadataXpp3Reader reader = new MetadataXpp3Reader();
+            try
+            {
+                metadata = reader.read( new FileReader( metadataFile ) );
+            }
+            catch ( FileNotFoundException e )
+            {
+                throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e );
+            }
+            catch ( IOException e )
+            {
+                throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e );
+            }
+            catch ( XmlPullParserException e )
+            {
+                throw new RepositoryQueryLayerException( "Error occurred while attempting to read metadata file", e );
+            }
+        }
+        else
+        {
+            throw new RepositoryQueryLayerException( "Metadata not found: " + metadataFile.getAbsolutePath() );
+        }
+
+        return metadata;
+    }
+}
diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/Cache.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/Cache.java
new file mode 100644 (file)
index 0000000..fc68f9c
--- /dev/null
@@ -0,0 +1,221 @@
+package org.apache.maven.archiva.layer;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Class to implement caching.
+ */
+public class Cache
+{
+    private final Map cache;
+
+    private final double cacheHitRatio;
+
+    private final int cacheMaxSize;
+
+    private long cacheHits;
+
+    private long cacheMiss;
+
+    /**
+     * Caches all data and expires only the oldest data when the specified cache hit rate is reached.
+     */
+    public Cache( double cacheHitRatio )
+    {
+        this( cacheHitRatio, 0 );
+    }
+
+    /**
+     * Caches all data and expires only the oldest data when the maximum cache size is reached
+     */
+    public Cache( int cacheMaxSize )
+    {
+        this( (double) 1, cacheMaxSize );
+    }
+
+    /**
+     * Caches all data and expires only the oldest data when either the specified cache hit rate is reached
+     * or the maximum cache size is reached.
+     */
+    public Cache( double cacheHitRatio, int cacheMaxSize )
+    {
+        this.cacheHitRatio = cacheHitRatio;
+        this.cacheMaxSize = cacheMaxSize;
+
+        if ( cacheMaxSize > 0 )
+        {
+            cache = new LinkedHashMap( cacheMaxSize );
+        }
+        else
+        {
+            cache = new LinkedHashMap();
+        }
+    }
+
+    /**
+     * Check if the specified key is already mapped to an object.
+     *
+     * @param key the key used to map the cached object
+     * @return true if the cache contains an object associated with the given key
+     */
+    public boolean containsKey( Object key )
+    {
+        boolean contains;
+        synchronized ( cache )
+        {
+            contains = cache.containsKey( key );
+
+            if ( contains )
+            {
+                cacheHits++;
+            }
+            else
+            {
+                cacheMiss++;
+            }
+        }
+
+        return contains;
+    }
+
+    /**
+     * Check for a cached object and return it if it exists. Returns null when the keyed object is not found
+     *
+     * @param key the key used to map the cached object
+     * @return the object mapped to the given key, or null if no cache object is mapped to the given key
+     */
+    public Object get( Object key )
+    {
+        Object retValue = null;
+
+        synchronized ( cache )
+        {
+            if ( cache.containsKey( key ) )
+            {
+                // remove and put: this promotes it to the top since we use a linked hash map
+                retValue = cache.remove( key );
+
+                cache.put( key, retValue );
+
+                cacheHits++;
+            }
+            else
+            {
+                cacheMiss++;
+            }
+        }
+
+        return retValue;
+    }
+
+    /**
+     * Cache the given value and map it using the given key
+     *
+     * @param key   the object to map the valued object
+     * @param value the object to cache
+     */
+    public void put( Object key, Object value )
+    {
+        // remove and put: this promotes it to the top since we use a linked hash map
+        synchronized ( cache )
+        {
+            if ( cache.containsKey( key ) )
+            {
+                cache.remove( key );
+            }
+
+            cache.put( key, value );
+        }
+
+        manageCache();
+    }
+
+    /**
+     * Compute for the efficiency of this cache.
+     *
+     * @return the ratio of cache hits to the cache misses to queries for cache objects
+     */
+    public double getHitRate()
+    {
+        synchronized ( cache )
+        {
+            return cacheHits == 0 && cacheMiss == 0 ? 0 : (double) cacheHits / (double) ( cacheHits + cacheMiss );
+        }
+    }
+
+    /**
+     * Get the total number of cache objects currently cached.
+     */
+    public int size()
+    {
+        return cache.size();
+    }
+
+    /**
+     * Empty the cache and reset the cache hit rate
+     */
+    public void clear()
+    {
+        synchronized ( cache )
+        {
+            cacheHits = 0;
+            cacheMiss = 0;
+            cache.clear();
+        }
+    }
+
+    private void manageCache()
+    {
+        synchronized ( cache )
+        {
+            Iterator iterator = cache.entrySet().iterator();
+            if ( cacheMaxSize == 0 )
+            {
+                //desired HitRatio is reached, we can trim the cache to conserve memory
+                if ( cacheHitRatio <= getHitRate() )
+                {
+                    iterator.next();
+                    iterator.remove();
+                }
+            }
+            else if ( cache.size() > cacheMaxSize )
+            {
+                // maximum cache size is reached
+                while ( cache.size() > cacheMaxSize )
+                {
+                    iterator.next();
+                    iterator.remove();
+                }
+            }
+            else
+            {
+                //even though the max has not been reached, the desired HitRatio is already reached,
+                //    so we can trim the cache to conserve memory
+                if ( cacheHitRatio <= getHitRate() )
+                {
+                    iterator.next();
+                    iterator.remove();
+                }
+            }
+        }
+    }
+
+}
diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayer.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/CachedRepositoryQueryLayer.java
new file mode 100644 (file)
index 0000000..91f9c5f
--- /dev/null
@@ -0,0 +1,99 @@
+package org.apache.maven.archiva.layer;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.metadata.Metadata;
+import org.apache.maven.artifact.repository.metadata.Snapshot;
+
+
+/**
+ *
+ */
+public class CachedRepositoryQueryLayer
+    extends AbstractRepositoryQueryLayer
+{
+    private Cache cache;
+
+    public static final double CACHE_HIT_RATIO = 0.5;
+
+    public CachedRepositoryQueryLayer( ArtifactRepository repository )
+    {
+        this.repository = repository;
+
+        cache = new Cache( CACHE_HIT_RATIO );
+    }
+
+    public double getCacheHitRate()
+    {
+        return cache.getHitRate();
+    }
+
+    public boolean containsArtifact( Artifact artifact )
+    {
+        boolean artifactFound = true;
+
+        String artifactPath = repository.getBasedir() + "/" + repository.pathOf( artifact );
+
+        if ( cache.get( artifactPath ) == null )
+        {
+            artifactFound = super.containsArtifact( artifact );
+            if ( artifactFound )
+            {
+                cache.put( artifactPath, artifactPath );
+            }
+        }
+
+        return artifactFound;
+    }
+
+    public boolean containsArtifact( Artifact artifact, Snapshot snapshot )
+    {
+        boolean artifactFound = true;
+
+        String path = getSnapshotArtifactRepositoryPath( artifact, snapshot );
+
+        if ( cache.get( path ) == null )
+        {
+            artifactFound = super.containsArtifact( artifact, snapshot );
+            if ( artifactFound )
+            {
+                cache.put( path, path );
+            }
+        }
+
+        return artifactFound;
+    }
+
+    /**
+     * Override method to utilize the cache
+     */
+    protected Metadata getMetadata( Artifact artifact )
+        throws RepositoryQueryLayerException
+    {
+        Metadata metadata = (Metadata) cache.get( artifact.getId() );
+
+        if ( metadata == null )
+        {
+            metadata = super.getMetadata( artifact );
+            cache.put( artifact.getId(), metadata );
+        }
+
+        return metadata;
+    }
+}
diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayer.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayer.java
new file mode 100644 (file)
index 0000000..582d5f3
--- /dev/null
@@ -0,0 +1,31 @@
+package org.apache.maven.archiva.layer;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+
+/**
+ *
+ */
+public class DefaultRepositoryQueryLayer
+    extends AbstractRepositoryQueryLayer
+{
+    public DefaultRepositoryQueryLayer( ArtifactRepository repository )
+    {
+        this.repository = repository;
+    }
+}
diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayerFactory.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/DefaultRepositoryQueryLayerFactory.java
new file mode 100644 (file)
index 0000000..ebfcd18
--- /dev/null
@@ -0,0 +1,35 @@
+package org.apache.maven.archiva.layer;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+
+/**
+ * Gets the default implementation of a repository query layer for the given repository.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @version $Id:DefaultRepositoryQueryLayerFactory.java 437105 2006-08-26 17:22:22 +1000 (Sat, 26 Aug 2006) brett $
+ * @plexus.component role="org.apache.maven.archiva.layer.RepositoryQueryLayerFactory"
+ */
+public class DefaultRepositoryQueryLayerFactory
+    implements RepositoryQueryLayerFactory
+{
+    public RepositoryQueryLayer createRepositoryQueryLayer( ArtifactRepository repository )
+    {
+        return new DefaultRepositoryQueryLayer( repository );
+    }
+}
diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayer.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayer.java
new file mode 100644 (file)
index 0000000..93c57ef
--- /dev/null
@@ -0,0 +1,37 @@
+package org.apache.maven.archiva.layer;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.metadata.Snapshot;
+
+import java.util.List;
+
+/**
+ * The transitive and metadata validation reports will need to query the repository for artifacts.
+ */
+public interface RepositoryQueryLayer
+{
+    String ROLE = RepositoryQueryLayer.class.getName();
+
+    boolean containsArtifact( Artifact artifact );
+
+    boolean containsArtifact( Artifact artifact, Snapshot snapshot );
+
+    List getVersions( Artifact artifact )
+        throws RepositoryQueryLayerException;
+}
diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayerException.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayerException.java
new file mode 100644 (file)
index 0000000..772bf46
--- /dev/null
@@ -0,0 +1,34 @@
+package org.apache.maven.archiva.layer;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+/**
+ *
+ */
+public class RepositoryQueryLayerException
+    extends Exception
+{
+    public RepositoryQueryLayerException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+    public RepositoryQueryLayerException( String message )
+    {
+        super( message );
+    }
+}
diff --git a/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayerFactory.java b/archiva-repository-layer/src/main/java/org/apache/maven/archiva/layer/RepositoryQueryLayerFactory.java
new file mode 100644 (file)
index 0000000..61142e9
--- /dev/null
@@ -0,0 +1,38 @@
+package org.apache.maven.archiva.layer;
+
+/*
+ * Copyright 2005-2006 The Apache Software Foundation.
+ *
+ * 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.
+ */
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+
+/**
+ * Gets the preferred implementation of a repository query layer for the given repository.
+ *
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @version $Id:RepositoryQueryLayerFactory.java 437105 2006-08-26 17:22:22 +1000 (Sat, 26 Aug 2006) brett $
+ */
+public interface RepositoryQueryLayerFactory
+{
+    String ROLE = RepositoryQueryLayerFactory.class.getName();
+
+    /**
+     * Create or obtain a query interface.
+     *
+     * @param repository the repository to query
+     * @return the obtained query layer
+     */
+    RepositoryQueryLayer createRepositoryQueryLayer( ArtifactRepository repository );
+}
diff --git a/pom.xml b/pom.xml
index a81e96b20b8d853344896e46527985cd9db6a5eb..6b02a1c8d7bc50f62997158f3e33ec6fe692bb7f 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -14,7 +14,8 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.apache.maven</groupId>
     <module>archiva-core</module>
     <module>archiva-configuration</module>
     <module>maven-meeper</module>
+    <module>archiva-repository-layer</module>
   </modules>
   <dependencies>
     <dependency>
         <artifactId>archiva-discoverer</artifactId>
         <version>${pom.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.maven.archiva</groupId>
+        <artifactId>archiva-repository-layer</artifactId>
+        <version>${pom.version}</version>
+      </dependency>
       <dependency>
         <groupId>org.apache.maven.archiva</groupId>
         <artifactId>archiva-indexer</artifactId>