]> source.dussan.org Git - archiva.git/commitdiff
Updating content interface and improving predicate generator
authorMartin Stockhammer <martin_s@apache.org>
Mon, 9 Mar 2020 20:25:09 +0000 (21:25 +0100)
committerMartin Stockhammer <martin_s@apache.org>
Mon, 9 Mar 2020 20:25:44 +0000 (21:25 +0100)
archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/ManagedRepositoryContent.java
archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/ItemSelector.java
archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContent.java

index 9a25aa6b12882ab52df154e46863c8d3f141cb7d..ce819eb12f490b07861575b41fd059031aac7c74 100644 (file)
@@ -49,7 +49,8 @@ public interface ManagedRepositoryContent extends RepositoryContent
     /// *****************   New generation interface **********************
 
     /**
-     * Removes the specified content item and all content stored under the given item.
+     * Removes the specified content item and if the item is a container or directory,
+     * all content stored under the given item.
      *
      * @param item the item.
      * @throws ItemNotFoundException if the item cannot be found
@@ -170,7 +171,7 @@ public interface ManagedRepositoryContent extends RepositoryContent
      * @throws ItemNotFoundException if the specified coordinates cannot be found in the repository
      * @throws ContentAccessException if the access to the underlying storage failed
      */
-    List<? extends Artifact> getAllArtifacts( ItemSelector selector) throws ContentAccessException;
+    List<? extends Artifact> getArtifacts( ItemSelector selector) throws ContentAccessException;
 
     /**
      * Returns the artifacts that match the given selector. It is up to the repository implementation
@@ -185,7 +186,7 @@ public interface ManagedRepositoryContent extends RepositoryContent
      * @throws ItemNotFoundException if the specified coordinates cannot be found in the repository
      * @throws ContentAccessException if the access to the underlying storage failed
      */
-    Stream<? extends Artifact> getAllArtifactStream( ItemSelector selector) throws ContentAccessException;
+    Stream<? extends Artifact> getArtifactStream( ItemSelector selector) throws ContentAccessException;
 
 
     /**
@@ -236,17 +237,6 @@ public interface ManagedRepositoryContent extends RepositoryContent
      */
     List<? extends Artifact> getArtifacts( ContentItem item) throws ContentAccessException;
 
-    /**
-     * Return all the artifacts of a given namespace and all sub namespaces that are defined under the
-     * given namespace.
-     *
-     * @param namespace the namespace, which is the parent namespace
-     * @param recurse <code>true</code>, if all sub namespaces should be searched too, otherwise <code>false</code>
-     * @return a list of artifacts or a empty list, if no artifacts are available for the specified namespace
-     */
-    List<? extends Artifact> getArtifacts( Namespace namespace, boolean recurse ) throws ContentAccessException;
-
-
     /**
      * Return a stream of artifacts that are part of the given content item. The returned stream is
      * auto closable. There is no guarantee about the order of returned artifacts.
@@ -261,21 +251,6 @@ public interface ManagedRepositoryContent extends RepositoryContent
     Stream<? extends Artifact> getArtifactStream( ContentItem item ) throws ContentAccessException;
 
 
-    /**
-     * Return a stream of all artifacts that are available for the given namespace and its sub namespaces. The artifacts
-     * are retrieved recursively. There is no guarantee about the order of returned artifacts.
-     *
-     * As the stream may access IO resources, you should always use call this method inside try-with-resources or
-     * make sure, that the stream is closed after using it.
-     *
-     * @param namespace the namespace from where the artifacts should be returned
-     * @param recurse <code>true</code>, if all sub namespaces should be searched too, otherwise <code>false</code>
-     * @return a stream of artifacts. The stream is auto closable. You should always make sure, that the stream
-     * is closed after use.
-     */
-    Stream<? extends Artifact> getArtifactStream( Namespace namespace, boolean recurse ) throws ContentAccessException;
-
-
     /**
      * Returns true, if the selector coordinates point to a existing item in the repository.
      *
index 8a4aeb05572cc85451f449da5308a19b28aef050..6bff84363f135d1b5cd8bf1112df842269e86ba9 100644 (file)
@@ -29,26 +29,86 @@ import java.util.Map;
 public interface ItemSelector
 {
 
-    String getProjectId( );
-
+    /**
+     * Selects the namespace to search for. You can use the {@link #searchSubNamespaces()} flag
+     * to decide, if only the given namespace or the namespace and all sub namespaces (if they exist) should be
+     * queried. If empty, the root namespace is searched.
+     * @return the namespace to search
+     */
     String getNamespace( );
 
+    /**
+     * Selects the project id to search for. If empty all projects are searched.
+     * @return the project id
+     */
+    String getProjectId( );
+
+    /**
+     * Selects the version to search for. If empty all versions are searched.
+     * @return the version
+     */
     String getVersion( );
 
+    /**
+     * Selects a specific artifact version. This may be different from the version, e.g.
+     * for SNAPSHOT versions. If empty, the artifact version will be ignored.
+     * @return the artifact version or empty string
+     */
     String getArtifactVersion( );
 
+    /**
+     * Returns the artifact id to search for. If empty, all artifacts are returned.
+     * @return the artifact id or a empty string
+     */
     String getArtifactId( );
 
+    /**
+     * Returns the type to search for. If empty, the type is ignored.
+     * @return the type or a empty string.
+     */
     String getType( );
 
+    /**
+     * Returns the classifier string used for querying, or empty string if no classifier.
+     * If it returns a '*' than all classifiers should be selected.
+     * @return the classifier string
+     */
     String getClassifier( );
 
+    /**
+     * Returns the attribute to search for or <code>null</code>, if the
+     * attribute key should not be used for search.
+     * @param key the attribute key
+     * @return
+     */
     String getAttribute( String key );
 
+    /**
+     * The extension of the file/asset.
+     * @return
+     */
     String getExtension( );
 
+    /**
+     * The map of attributes to search for
+     * @return
+     */
     Map<String, String> getAttributes( );
 
+    /**
+     * Returns <code>true</code>, if not only the given namespace but all sub namespaces
+     * of the given namespace should be queried too.
+     */
+    boolean searchSubNamespaces();
+
+    /**
+     * <code>true</code>, if all files/assets should be returned that match the given selector,
+     * or <code>false</code>, if only the main assets should be returned.
+     * Related assets are e.g. hash files or signature files.
+     * @return <code>true</code>, if all assets should be found otherwise <code>false</code>
+     */
+    boolean findRelatedArtifacts();
+
     default boolean hasNamespace( )
     {
         return !StringUtils.isEmpty( getNamespace( ) );
index d58769bf405a94befb458e6fe5f8d05368475a17..d247101359aef0fe2f33b8908f11dd72b40db350 100644 (file)
@@ -127,13 +127,13 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
     }
 
     @Override
-    public List<? extends Artifact> getAllArtifacts( ItemSelector selector ) throws ContentAccessException
+    public List<? extends Artifact> getArtifacts( ItemSelector selector ) throws ContentAccessException
     {
         return null;
     }
 
     @Override
-    public Stream<? extends Artifact> getAllArtifactStream( ItemSelector selector ) throws ContentAccessException
+    public Stream<? extends Artifact> getArtifactStream( ItemSelector selector ) throws ContentAccessException
     {
         return null;
     }
index d0f8b2c44d2486bda657a06eddf75bd60ae61226..55d42401904856211f8793ae989fed54cd8e95bb 100644 (file)
@@ -128,13 +128,13 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
     }
 
     @Override
-    public List<? extends Artifact> getAllArtifacts( ItemSelector selector ) throws ContentAccessException
+    public List<? extends Artifact> getArtifacts( ItemSelector selector ) throws ContentAccessException
     {
         return null;
     }
 
     @Override
-    public Stream<? extends Artifact> getAllArtifactStream( ItemSelector selector ) throws ContentAccessException
+    public Stream<? extends Artifact> getArtifactStream( ItemSelector selector ) throws ContentAccessException
     {
         return null;
     }
index b1b99086082bb8616022f7109c0ba0c5d6b945bf..09c5aab4b0866b83c231bdd088c2c6095c36178b 100644 (file)
@@ -132,13 +132,13 @@ public class ManagedRepositoryContentMock implements ManagedRepositoryContent
     }
 
     @Override
-    public List<? extends Artifact> getAllArtifacts( ItemSelector selector ) throws ContentAccessException
+    public List<? extends Artifact> getArtifacts( ItemSelector selector ) throws ContentAccessException
     {
         return null;
     }
 
     @Override
-    public Stream<? extends Artifact> getAllArtifactStream( ItemSelector selector ) throws ContentAccessException
+    public Stream<? extends Artifact> getArtifactStream( ItemSelector selector ) throws ContentAccessException
     {
         return null;
     }
index e8f49c019ce2644efc01907f04b537ed729a7559..de7de971c2b376b35e2325b38f6c8c00fddc8151 100644 (file)
@@ -516,62 +516,60 @@ public class ManagedDefaultRepositoryContent
      */
     private Predicate<StorageAsset> getFileFilterFromSelector(final ItemSelector selector) {
         Predicate<StorageAsset> p = a -> a.isLeaf( );
+        StringBuilder fileNamePattern = new StringBuilder("^" );
         if (selector.hasArtifactId()) {
-            final String pattern = selector.getArtifactId( );
-            p = p.and( a -> StringUtils.startsWithIgnoreCase( a.getName( ),  pattern ) );
+            fileNamePattern.append( Pattern.quote(selector.getArtifactId( )) ).append("-");
+        } else {
+            fileNamePattern.append("[A-Za-z0-9_\\-.]+-");
         }
         if (selector.hasArtifactVersion()) {
-            final String pattern = selector.getArtifactVersion( );
-            p = p.and( a -> StringUtils.containsIgnoreCase( a.getName( ),  pattern ) );
+            fileNamePattern.append( Pattern.quote(selector.getArtifactVersion( )) );
+        } else  {
+            fileNamePattern.append( "[A-Za-z0-9_\\-.]+" );
         }
-        if (selector.hasExtension()) {
-            final String pattern = "."+selector.getExtension( );
-            p = p.and( a -> StringUtils.endsWithIgnoreCase( a.getName( ), pattern ) );
-        } else if (selector.hasType()) {
-            final String pattern = "."+ MavenContentHelper.getArtifactExtension( selector );
-            p = p.and( a -> StringUtils.endsWithIgnoreCase( a.getName( ), pattern ) );
+        String classifier = selector.hasClassifier( ) ? selector.getClassifier( ) :
+            ( selector.hasType( ) ? MavenContentHelper.getClassifierFromType( selector.getType( ) ) : null );
+        if (classifier != null)
+        {
+            if ( "*".equals( classifier ) )
+            {
+                fileNamePattern.append( "-[A-Za-z0-9]+\\." );
+            }
+            else
+            {
+                fileNamePattern.append("-").append( Pattern.quote( classifier ) ).append( "\\." );
+            }
+        } else {
+            fileNamePattern.append( "\\." );
         }
-        if (selector.hasClassifier()) {
-            final String pattern = "-" + selector.getClassifier( ) + ".";
-            p = p.and( a -> StringUtils.containsIgnoreCase( a.getName( ), pattern ) );
-        } else if (selector.hasType()) {
-            final String pattern = "-" + MavenContentHelper.getClassifierFromType( selector.getType( ) ) + ".";
-            p = p.and( a -> StringUtils.containsIgnoreCase( a.getName( ).toLowerCase( ), pattern ) );
+        String extension = selector.hasExtension( ) ? selector.getExtension( ) :
+            ( selector.hasType( ) ? MavenContentHelper.getArtifactExtension( selector ) : null );
+        if (extension != null) {
+            fileNamePattern.append( Pattern.quote( extension ) );
+        } else {
+            fileNamePattern.append( ".*" );
         }
-        return p;
-    }
-
-    /*
-        TBD
-     */
-    @Override
-    public List<? extends Artifact> getAllArtifacts( ItemSelector selector ) throws ContentAccessException
-    {
-        return null;
+        final Pattern pattern = Pattern.compile( fileNamePattern.toString() );
+        return p.and( a -> pattern.matcher( a.getName( ) ).matches());
     }
 
-    /*
-        TBD
-     */
-    @Override
-    public Stream<? extends Artifact> getAllArtifactStream( ItemSelector selector ) throws ContentAccessException
-    {
-        return null;
-    }
 
-    /*
-        TBD
+    /**
+     * Returns all the subdirectories of the given namespace directory as project.
      */
     @Override
     public List<? extends Project> getProjects( Namespace namespace )
     {
-        return null;
+        return namespace.getAsset( ).list( ).stream( )
+            .filter( a -> a.isContainer( ) )
+            .map( a -> getProjectFromArtifactPath( a ) )
+            .collect( Collectors.toList());
     }
 
     @Override
     public List<? extends Project> getProjects( ItemSelector selector ) throws ContentAccessException, IllegalArgumentException
     {
-        return null;
+        return getProjects( getNamespace( selector ) );
     }
 
     /**
@@ -621,11 +619,12 @@ public class ManagedDefaultRepositoryContent
         }
     }
 
+
     /*
-            TBD
        */
+    TBD
+ */
     @Override
-    public List<? extends Artifact> getArtifacts( ContentItem item )
+    public List<? extends Artifact> getArtifacts( ItemSelector selector ) throws ContentAccessException
     {
         return null;
     }
@@ -634,36 +633,37 @@ public class ManagedDefaultRepositoryContent
         TBD
      */
     @Override
-    public List<? extends Artifact> getArtifacts( Namespace namespace, boolean recurse )
+    public Stream<? extends Artifact> getArtifactStream( ItemSelector selector ) throws ContentAccessException
     {
         return null;
     }
 
     /*
-        TBD
-     */
+            TBD
+         */
     @Override
-    public Stream<? extends Artifact> getArtifactStream( ContentItem item )
+    public List<? extends Artifact> getArtifacts( ContentItem item )
     {
         return null;
     }
 
+
     /*
         TBD
      */
     @Override
-    public Stream<? extends Artifact> getArtifactStream( Namespace namespace, boolean recurse )
+    public Stream<? extends Artifact> getArtifactStream( ContentItem item )
     {
         return null;
     }
 
-    /*
-        TBD
+    /**
+     * Checks, if the asset/file queried by the given selector exists.
      */
     @Override
     public boolean hasContent( ItemSelector selector )
     {
-        return false;
+        return getItem( selector ).getAsset( ).exists( );
     }
 
     /*