]> source.dussan.org Git - archiva.git/commitdiff
Adding artefact type and additional tests
authorMartin Stockhammer <martin_s@apache.org>
Thu, 12 Mar 2020 18:51:35 +0000 (19:51 +0100)
committerMartin Stockhammer <martin_s@apache.org>
Thu, 12 Mar 2020 18:51:35 +0000 (19:51 +0100)
archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/ArtifactType.java [new file with mode: 0644]
archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/BaseArtifactTypes.java [new file with mode: 0644]
archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaArtifact.java
archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/builder/ArtifactOptBuilder.java
archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaItemSelectorTest.java
archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContent.java
archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/MavenContentHelper.java
archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/MavenTypes.java [new file with mode: 0644]
archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContentTest.java

index 71ef83ef0b0c06c77b60afad76e5684eba8a7a2c..a86d1c372b2e744119ed7ad0bc62e75971cfc645 100644 (file)
@@ -125,5 +125,10 @@ public interface Artifact extends ContentItem
      */
     String getContentType( );
 
+    /**
+     * Returns the type of the artifact
+     * @return
+     */
+    ArtifactType getArtifactType();
 
 }
diff --git a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/ArtifactType.java b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/ArtifactType.java
new file mode 100644 (file)
index 0000000..7e52765
--- /dev/null
@@ -0,0 +1,30 @@
+package org.apache.archiva.repository.content;
+
+/*
+ * 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.
+ */
+
+/**
+ *
+ * Type of the artifact to distinguish different flavours.
+ *
+ * @author Martin Stockhammer <martin_s@apache.org>
+ */
+public interface ArtifactType
+{
+    String name();
+}
diff --git a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/BaseArtifactTypes.java b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/BaseArtifactTypes.java
new file mode 100644 (file)
index 0000000..b1a2020
--- /dev/null
@@ -0,0 +1,35 @@
+package org.apache.archiva.repository.content;
+
+/*
+ * 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.
+ */
+
+/**
+ * Basic artifact types.
+ * <ul>
+ *  <li>{@link #MAIN}: Standard type</li>
+ *  <li>{@link #METADATA}: if this artifact represents a metadata file</li>
+ *  <li>{@link #RELATED}: artifact that is related to a main artifact</li>
+ *  <li>{@link #UNKNOWN}: Unknown type</li>
+ * </ul>
+ *
+ * @author Martin Stockhammer <martin_s@apache.org>
+ */
+public enum BaseArtifactTypes implements ArtifactType
+{
+    MAIN,RELATED,METADATA,UNKNOWN
+}
index 5d28e83b3e7bbc9fe2a7839447cb2611f8c0da79..b17a9c5afc56f997e1fe4413a131d047ed5fdd7f 100644 (file)
@@ -20,6 +20,8 @@ package org.apache.archiva.repository.content.base;
  */
 
 import org.apache.archiva.repository.content.Artifact;
+import org.apache.archiva.repository.content.ArtifactType;
+import org.apache.archiva.repository.content.BaseArtifactTypes;
 import org.apache.archiva.repository.content.Version;
 import org.apache.archiva.repository.content.base.builder.ArtifactOptBuilder;
 import org.apache.archiva.repository.content.base.builder.ArtifactVersionBuilder;
@@ -34,7 +36,7 @@ import org.apache.commons.lang3.StringUtils;
  * You have to use the builder method {@link #withAsset(StorageAsset)} to create a instance.
  * The build() method can be called after the required attributes are set.
  * <p>
- * Artifact are equal if the following coordinates match:
+ * Artifacts are equal if the following coordinates match:
  * <ul>
  *     <li>repository</li>
  *     <li>asset</li>
@@ -43,6 +45,7 @@ import org.apache.commons.lang3.StringUtils;
  *     <li>artifactVersion</li>
  *     <li>type</li>
  *     <li>classifier</li>
+ *     <li>artifactType</li>
  * </ul>
  *
  * @author Martin Stockhammer <martin_s@apache.org>
@@ -56,6 +59,7 @@ public class ArchivaArtifact extends ArchivaContentItem implements Artifact
     private String classifier;
     private String remainder;
     private String contentType;
+    private ArtifactType artifactType;
 
     private ArchivaArtifact( )
     {
@@ -105,6 +109,12 @@ public class ArchivaArtifact extends ArchivaContentItem implements Artifact
         return contentType;
     }
 
+    @Override
+    public ArtifactType getArtifactType( )
+    {
+        return artifactType;
+    }
+
 
     /**
      * Returns the builder for creating a new artifact instance. You have to fill the
@@ -132,6 +142,7 @@ public class ArchivaArtifact extends ArchivaContentItem implements Artifact
         if ( !artifactVersion.equals( that.artifactVersion ) ) return false;
         if ( !version.equals( that.version ) ) return false;
         if ( !type.equals( that.type ) ) return false;
+        if ( !artifactType.equals(that.artifactType)) return false;
         return classifier.equals( that.classifier );
     }
 
@@ -144,6 +155,7 @@ public class ArchivaArtifact extends ArchivaContentItem implements Artifact
         result = 31 * result + version.hashCode( );
         result = 31 * result + type.hashCode( );
         result = 31 * result + classifier.hashCode( );
+        result = 31 * result + artifactType.hashCode( );
         return result;
     }
 
@@ -232,6 +244,13 @@ public class ArchivaArtifact extends ArchivaContentItem implements Artifact
             return this;
         }
 
+        @Override
+        public ArtifactOptBuilder withArtifactType( ArtifactType type )
+        {
+            item.artifactType = type;
+            return this;
+        }
+
         @Override
         public ArchivaArtifact build( )
         {
@@ -256,6 +275,9 @@ public class ArchivaArtifact extends ArchivaContentItem implements Artifact
             {
                 item.remainder = "";
             }
+            if (item.artifactType==null) {
+                item.artifactType = BaseArtifactTypes.MAIN;
+            }
 
             return item;
         }
index 3ac93c16c15450a04fb14ab66028000a44c1ffb0..03ef69831fe0ee8a5c76fb542f3fb6c5887d3634 100644 (file)
@@ -18,6 +18,7 @@
 
 package org.apache.archiva.repository.content.base.builder;
 
+import org.apache.archiva.repository.content.ArtifactType;
 import org.apache.archiva.repository.content.base.ArchivaArtifact;
 
 /**
@@ -37,5 +38,7 @@ public interface ArtifactOptBuilder
 
     ArtifactOptBuilder withContentType( String contentType );
 
+    ArtifactOptBuilder withArtifactType( ArtifactType type );
+
     ArchivaArtifact build( );
 }
index 7ab3c412cff794d8c9329a8afe28c47c0081738e..2af58cb108b6ef9c9f13b587dc9ad1abc849781f 100644 (file)
@@ -39,6 +39,14 @@ class ArchivaItemSelectorTest
         assertFalse( selector.hasType( ) );
         assertFalse( selector.hasClassifier( ) );
         assertFalse( selector.hasAttributes( ) );
+
+        assertEquals( "", selector.getNamespace( ) );
+        assertEquals( "", selector.getVersion( ) );
+        assertEquals( "", selector.getArtifactId( ) );
+        assertEquals( "", selector.getArtifactVersion( ) );
+        assertEquals( "", selector.getType( ) );
+        assertEquals( "", selector.getClassifier( ) );
+        assertNotNull( selector.getAttributes( ) );
     }
 
     @Test
@@ -53,6 +61,14 @@ class ArchivaItemSelectorTest
         assertFalse( selector.hasType( ) );
         assertFalse( selector.hasClassifier( ) );
         assertFalse( selector.hasAttributes( ) );
+
+        assertEquals( "", selector.getProjectId( ) );
+        assertEquals( "", selector.getVersion( ) );
+        assertEquals( "", selector.getArtifactId( ) );
+        assertEquals( "", selector.getArtifactVersion( ) );
+        assertEquals( "", selector.getType( ) );
+        assertEquals( "", selector.getClassifier( ) );
+        assertNotNull( selector.getAttributes( ) );
     }
 
     @Test
@@ -67,6 +83,14 @@ class ArchivaItemSelectorTest
         assertFalse( selector.hasType( ) );
         assertFalse( selector.hasClassifier( ) );
         assertFalse( selector.hasAttributes( ) );
+
+
+        assertEquals( "", selector.getNamespace( ) );
+        assertEquals( "", selector.getArtifactId( ) );
+        assertEquals( "", selector.getArtifactVersion( ) );
+        assertEquals( "", selector.getType( ) );
+        assertEquals( "", selector.getClassifier( ) );
+        assertNotNull( selector.getAttributes( ) );
     }
 
     @Test
@@ -81,6 +105,14 @@ class ArchivaItemSelectorTest
         assertFalse( selector.hasType( ) );
         assertFalse( selector.hasClassifier( ) );
         assertFalse( selector.hasAttributes( ) );
+
+        assertEquals( "", selector.getNamespace( ) );
+        assertEquals( "", selector.getVersion( ) );
+        assertEquals( "", selector.getArtifactId( ) );
+        assertEquals( "", selector.getType( ) );
+        assertEquals( "", selector.getClassifier( ) );
+        assertNotNull( selector.getAttributes( ) );
+
     }
 
     @Test
@@ -96,6 +128,12 @@ class ArchivaItemSelectorTest
         assertFalse( selector.hasClassifier( ) );
         assertFalse( selector.hasAttributes( ) );
 
+        assertEquals( "", selector.getNamespace( ) );
+        assertEquals( "", selector.getVersion( ) );
+        assertEquals( "", selector.getArtifactVersion( ) );
+        assertEquals( "", selector.getType( ) );
+        assertEquals( "", selector.getClassifier( ) );
+        assertNotNull( selector.getAttributes( ) );
     }
 
     @Test
@@ -110,6 +148,13 @@ class ArchivaItemSelectorTest
         assertTrue( selector.hasType( ) );
         assertFalse( selector.hasClassifier( ) );
         assertFalse( selector.hasAttributes( ) );
+
+        assertEquals( "", selector.getNamespace( ) );
+        assertEquals( "", selector.getVersion( ) );
+        assertEquals( "", selector.getArtifactId( ) );
+        assertEquals( "", selector.getArtifactVersion( ) );
+        assertEquals( "", selector.getClassifier( ) );
+        assertNotNull( selector.getAttributes( ) );
     }
 
     @Test
@@ -124,6 +169,14 @@ class ArchivaItemSelectorTest
         assertFalse( selector.hasType( ) );
         assertTrue( selector.hasClassifier( ) );
         assertFalse( selector.hasAttributes( ) );
+
+        assertEquals( "", selector.getNamespace( ) );
+        assertEquals( "", selector.getVersion( ) );
+        assertEquals( "", selector.getArtifactId( ) );
+        assertEquals( "", selector.getArtifactVersion( ) );
+        assertEquals( "", selector.getType( ) );
+        assertNotNull( selector.getAttributes( ) );
+
     }
 
     @Test
@@ -140,6 +193,13 @@ class ArchivaItemSelectorTest
         assertFalse( selector.hasType( ) );
         assertFalse( selector.hasClassifier( ) );
         assertTrue( selector.hasAttributes( ) );
+
+        assertEquals( "", selector.getVersion( ) );
+        assertEquals( "", selector.getArtifactId( ) );
+        assertEquals( "", selector.getArtifactVersion( ) );
+        assertEquals( "", selector.getType( ) );
+        assertEquals( "", selector.getClassifier( ) );
+
     }
 
 }
\ No newline at end of file
index 427a72b3f392d8642e4e093ad8ead2e7f409b4ec..a0611b278c843a07fcdd93cbf586782e10f91734 100644 (file)
@@ -35,9 +35,11 @@ import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.content.Artifact;
+import org.apache.archiva.repository.content.ArtifactType;
 import org.apache.archiva.repository.content.ContentItem;
 import org.apache.archiva.repository.content.ItemNotFoundException;
 import org.apache.archiva.repository.content.ItemSelector;
+import org.apache.archiva.repository.content.BaseArtifactTypes;
 import org.apache.archiva.repository.content.Namespace;
 import org.apache.archiva.repository.content.Project;
 import org.apache.archiva.repository.content.Version;
@@ -56,7 +58,6 @@ import org.apache.commons.lang3.StringUtils;
 
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.naming.Name;
 import java.io.IOException;
 import java.net.URI;
 import java.nio.file.Files;
@@ -72,7 +73,6 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
 
 /**
  * ManagedDefaultRepositoryContent
@@ -320,6 +320,7 @@ public class ManagedDefaultRepositoryContent
                 .withType( info.type )
                 .withArtifactVersion( info.version )
                 .withContentType( info.contentType )
+                .withArtifactType( info.artifactType )
                 .build( )
         );
     }
@@ -397,6 +398,7 @@ public class ManagedDefaultRepositoryContent
         private String classifier;
         private String contentType;
         private StorageAsset asset;
+        private ArtifactType artifactType = BaseArtifactTypes.MAIN;
     }
 
     private ArtifactInfo getArtifactInfoFromPath(String genericVersion, StorageAsset path) {
@@ -427,18 +429,21 @@ public class ManagedDefaultRepositoryContent
                             info.remainder = classPostfix;
                         }
                     } else {
-                        log.error( "Artifact does not match the maven name pattern {}", path );
+                        log.debug( "Artifact does not match the maven name pattern {}", path );
+                        info.artifactType = BaseArtifactTypes.UNKNOWN;
                         info.classifier = "";
                         info.remainder = StringUtils.substringAfter( fileName, prefix );
                     }
                 } else {
-                    log.error( "Artifact does not match the snapshot version pattern {}", path );
+                    log.debug( "Artifact does not match the snapshot version pattern {}", path );
+                    info.artifactType = BaseArtifactTypes.UNKNOWN;
                     info.version = "";
                     info.classifier = "";
                     info.remainder = StringUtils.substringAfter( fileName, prefix );
                 }
             } else {
-                log.error( "Artifact does not match the maven name pattern: {}", path );
+                log.debug( "Artifact does not match the maven name pattern: {}", path );
+                info.artifactType = BaseArtifactTypes.UNKNOWN;
                 info.version = "";
                 info.classifier = "";
                 info.remainder = StringUtils.substringAfterLast( fileName, "." );
@@ -458,7 +463,8 @@ public class ManagedDefaultRepositoryContent
                     info.remainder = classPostfix;
                 }
             } else {
-                log.error( "Artifact does not match the version pattern {}", path );
+                log.debug( "Artifact does not match the version pattern {}", path );
+                info.artifactType = BaseArtifactTypes.UNKNOWN;
                 info.version = "";
                 info.classifier = "";
                 info.remainder = StringUtils.substringAfterLast( fileName, "." );
@@ -472,6 +478,11 @@ public class ManagedDefaultRepositoryContent
             info.contentType = "";
             //
         }
+        if (MavenContentHelper.METADATA_FILENAME.equalsIgnoreCase( fileName )) {
+            info.artifactType = BaseArtifactTypes.METADATA;
+        } else if (MavenContentHelper.METADATA_REPOSITORY_FILENAME.equalsIgnoreCase( fileName )) {
+            info.artifactType = MavenTypes.REPOSITORY_METADATA;
+        }
         return info;
 
     }
index 84192a5e72e30368c237b2c1dfc96d93d5d0dca7..70e52f6079c03ff8a1167e94261bbd51804d07ee 100644 (file)
@@ -52,6 +52,7 @@ public class MavenContentHelper
     MavenMetadataReader metadataReader;
 
     public static final String METADATA_FILENAME = "maven-metadata.xml";
+    public static final String METADATA_REPOSITORY_FILENAME = "maven-metadata-repository.xml";
 
     public MavenContentHelper() {
 
diff --git a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/MavenTypes.java b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/MavenTypes.java
new file mode 100644 (file)
index 0000000..e986039
--- /dev/null
@@ -0,0 +1,29 @@
+package org.apache.archiva.repository.maven.content;
+
+/*
+ * 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.repository.content.ArtifactType;
+
+/**
+ * @author Martin Stockhammer <martin_s@apache.org>
+ */
+public enum MavenTypes implements ArtifactType
+{
+    REPOSITORY_METADATA
+}
index c3fe7085f9f162edb0168a46248903b67a3b9d24..1ddfc0490d57476f7f013f5ab5e846a8f3b7adb1 100644 (file)
@@ -30,6 +30,8 @@ import org.apache.archiva.repository.EditableManagedRepository;
 import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.RepositoryContent;
+import org.apache.archiva.repository.content.Artifact;
+import org.apache.archiva.repository.content.BaseArtifactTypes;
 import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.content.Project;
 import org.apache.archiva.repository.content.Version;
@@ -42,6 +44,7 @@ import org.junit.Test;
 
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.jcr.Item;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.nio.file.Files;
@@ -51,8 +54,10 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import static org.junit.Assert.*;
 
@@ -451,4 +456,22 @@ public class ManagedDefaultRepositoryContentTest
         assertFalse( Files.exists( deleteRepo.resolve( "org/apache/maven/samplejar/1.0" ) ) );
 
     }
+
+    @Test
+    public void testGetArtifactStreamWithVersionSelector() {
+        ItemSelector selector = ArchivaItemSelector.builder( )
+            .withNamespace( "javax.sql" )
+            .withProjectId( "jdbc" )
+            .withVersion( "2.0" ).build();
+        Stream<? extends Artifact> stream = repoContent.newArtifactStream( selector );
+        assertNotNull( stream );
+        List<? extends Artifact> results = stream.collect( Collectors.toList( ) );
+        assertEquals( 2, results.size( ) );
+        Artifact mainArtifact = results.stream( ).filter( a -> a.getFileName( ).equals( "jdbc-2.0.jar" ) ).findFirst( ).get( );
+        assertNotNull( mainArtifact );
+        assertEquals( BaseArtifactTypes.MAIN, mainArtifact.getArtifactType( ) );
+        Artifact metaArtifact = results.stream( ).filter( a -> a.getFileName( ).equals( "maven-metadata-repository.xml" ) ).findFirst( ).get( );
+        assertNotNull( metaArtifact );
+        assertEquals( MavenTypes.REPOSITORY_METADATA, metaArtifact.getArtifactType( ) );
+    }
 }