This is an automated email from the ASF dual-hosted git repository.

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva.git


The following commit(s) were added to refs/heads/master by this push:
     new 311fe09  Refactoring to new content API
311fe09 is described below

commit 311fe09dd61c4ac09789ed052006395e5df02785
Author: Martin Stockhammer <[email protected]>
AuthorDate: Sat Jun 6 20:02:53 2020 +0200

    Refactoring to new content API
---
 .../src/main/java/SimpleArtifactConsumer.java      |   9 +-
 .../consumers/core/MetadataUpdaterConsumer.java    |  19 +-
 .../core/repository/AbstractRepositoryPurge.java   |   6 +-
 .../CleanupReleasedSnapshotsRepositoryPurge.java   |  46 +--
 .../core/repository/DaysOldRepositoryPurge.java    |   8 +-
 .../repository/RetentionCountRepositoryPurge.java  |  10 +-
 .../repository/BaseRepositoryContentLayout.java    |  13 +-
 .../archiva/repository/LayoutRuntimeException.java |  40 +++
 .../archiva/repository/RepositoryContent.java      |   4 +-
 .../archiva/repository/content/Artifact.java       |  12 +
 .../archiva/repository/content/Namespace.java      |   2 +-
 .../apache/archiva/repository/content/Version.java |   9 +-
 .../repository/content/base/ArchivaArtifact.java   |  17 +-
 .../content/base/ArchivaItemSelector.java          |  12 +-
 .../repository/content/base/ArchivaNamespace.java  |   2 +-
 .../repository/content/base/ArchivaVersion.java    |   8 +-
 .../repository/content/base/BaseContentItem.java   |   1 -
 .../repository/metadata/base/MetadataTools.java    |   4 +-
 .../content/base/ArchivaNamespaceTest.java         |   6 +-
 .../content/base/ArchivaVersionTest.java           |   4 +-
 .../mock/ManagedRepositoryContentMock.java         |   6 +
 .../scanner/mock/ManagedRepositoryContentMock.java |   6 +
 .../mock/ManagedRepositoryContentMock.java         |   6 +
 .../content/ManagedDefaultRepositoryContent.java   | 376 ++++++++++++++-------
 .../content/AbstractRepositoryContentTest.java     |   4 +-
 .../ManagedDefaultRepositoryContentTest.java       |  19 +-
 .../rest/services/utils/ArtifactBuilder.java       |   4 +-
 .../archiva/webdav/ArchivaDavResourceFactory.java  |   2 +-
 28 files changed, 436 insertions(+), 219 deletions(-)

diff --git 
a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/main/java/SimpleArtifactConsumer.java
 
b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/main/java/SimpleArtifactConsumer.java
index f1a219b..8387941 100644
--- 
a/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/main/java/SimpleArtifactConsumer.java
+++ 
b/archiva-modules/archiva-base/archiva-consumers/archiva-consumer-archetype/src/main/resources/archetype-resources/src/main/java/SimpleArtifactConsumer.java
@@ -36,6 +36,8 @@ import org.apache.archiva.repository.LayoutException;
 import org.apache.archiva.repository.ManagedRepository;
 import org.apache.archiva.repository.BaseRepositoryContentLayout;
 import org.apache.archiva.repository.RepositoryContentFactory;
+import org.apache.archiva.repository.content.Artifact;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Scope;
@@ -126,10 +128,9 @@ public class SimpleArtifactConsumer
         {
             ManagedRepositoryContent repositoryContent = 
repository.getContent();
             BaseRepositoryContentLayout layout = repositoryContent.getLayout( 
BaseRepositoryContentLayout.class );
-            ArtifactReference artifact = 
repositoryContent.toArtifactReference( path );
-
-            repositorySession.getRepository().getArtifacts( repositorySession, 
repository.getId(), artifact.getGroupId(),
-                                                            
artifact.getArtifactId(), artifact.getVersion() );
+            Artifact artifact = layout.getArtifact( path );
+            repositorySession.getRepository().getArtifacts( repositorySession, 
repository.getId(), artifact.getNamespace().getId(),
+                                                            artifact.getId(), 
artifact.getVersion().getId() );
         }
         catch ( LayoutException | MetadataResolutionException  e )
         {
diff --git 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/MetadataUpdaterConsumer.java
 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/MetadataUpdaterConsumer.java
index 9c0aeb7..cbe3dc5 100644
--- 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/MetadataUpdaterConsumer.java
+++ 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/MetadataUpdaterConsumer.java
@@ -24,7 +24,6 @@ import org.apache.archiva.configuration.FileTypes;
 import org.apache.archiva.consumers.AbstractMonitoredConsumer;
 import org.apache.archiva.consumers.ConsumerException;
 import org.apache.archiva.consumers.KnownRepositoryContentConsumer;
-import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.model.ProjectReference;
 import org.apache.archiva.model.VersionedReference;
 import org.apache.archiva.repository.ManagedRepositoryContent;
@@ -34,6 +33,7 @@ import 
org.apache.archiva.repository.BaseRepositoryContentLayout;
 import org.apache.archiva.repository.RepositoryException;
 import org.apache.archiva.repository.RepositoryNotFoundException;
 import org.apache.archiva.repository.RepositoryRegistry;
+import org.apache.archiva.repository.content.Artifact;
 import org.apache.archiva.repository.metadata.base.MetadataTools;
 import org.apache.archiva.repository.metadata.RepositoryMetadataException;
 import org.apache.archiva.repository.storage.StorageAsset;
@@ -174,7 +174,8 @@ public class MetadataUpdaterConsumer
         {
             try
             {
-                ArtifactReference artifact = repository.toArtifactReference( 
path );
+                BaseRepositoryContentLayout layout = repository.getLayout( 
BaseRepositoryContentLayout.class );
+                Artifact artifact = layout.getArtifact( path );
                 updateVersionMetadata( artifact, path );
                 updateProjectMetadata( artifact, path );
             }
@@ -192,11 +193,11 @@ public class MetadataUpdaterConsumer
         processFile( path );
     }
 
-    private void updateProjectMetadata( ArtifactReference artifact, String 
path )
+    private void updateProjectMetadata( Artifact artifact, String path )
     {
         ProjectReference projectRef = new ProjectReference( );
-        projectRef.setGroupId( artifact.getGroupId( ) );
-        projectRef.setArtifactId( artifact.getArtifactId( ) );
+        projectRef.setGroupId( artifact.getNamespace( ).getId() );
+        projectRef.setArtifactId( artifact.getId( ) );
 
         try
         {
@@ -221,12 +222,12 @@ public class MetadataUpdaterConsumer
         }
     }
 
-    private void updateVersionMetadata( ArtifactReference artifact, String 
path )
+    private void updateVersionMetadata( Artifact artifact, String path )
     {
         VersionedReference versionRef = new VersionedReference( );
-        versionRef.setGroupId( artifact.getGroupId( ) );
-        versionRef.setArtifactId( artifact.getArtifactId( ) );
-        versionRef.setVersion( artifact.getVersion( ) );
+        versionRef.setGroupId( artifact.getNamespace( ).getId() );
+        versionRef.setArtifactId( artifact.getId( ) );
+        versionRef.setVersion( artifact.getVersion( ).getId() );
 
         try
         {
diff --git 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
index 72cf81a..e676e0b 100644
--- 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
+++ 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/AbstractRepositoryPurge.java
@@ -192,8 +192,8 @@ public abstract class AbstractRepositoryPurge
             Map<String, Collection<ArtifactMetadata>> metaResolved = new 
HashMap<>( );
             for ( Artifact reference : references )
             {
-                String baseVersion = reference.getVersion( ).getVersion( );
-                String namespace = reference.getVersion( ).getProject( 
).getNamespace( ).getNamespace( );
+                String baseVersion = reference.getVersion( ).getId( );
+                String namespace = reference.getVersion( ).getProject( 
).getNamespace( ).getId( );
                 // Needed for tracking in the hashmap
                 String metaBaseId = reference.toKey();
 
@@ -214,7 +214,7 @@ public abstract class AbstractRepositoryPurge
                 for ( RepositoryListener listener : listeners )
                 {
                     listener.deleteArtifact( metadataRepository, 
repository.getId( ), namespace,
-                        reference.getId( ), reference.getVersion( 
).getVersion(),
+                        reference.getId( ), reference.getVersion( ).getId(),
                             artifactFile.getName( ));
                 }
                 if (reference.exists())
diff --git 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java
 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java
index f9dca99..efa7e3c 100644
--- 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java
+++ 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/CleanupReleasedSnapshotsRepositoryPurge.java
@@ -34,6 +34,7 @@ import 
org.apache.archiva.repository.BaseRepositoryContentLayout;
 import org.apache.archiva.repository.ReleaseScheme;
 import org.apache.archiva.repository.RepositoryRegistry;
 import org.apache.archiva.metadata.audit.RepositoryListener;
+import org.apache.archiva.repository.content.Artifact;
 import org.apache.archiva.repository.content.ItemNotFoundException;
 import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.content.Project;
@@ -101,17 +102,18 @@ public class CleanupReleasedSnapshotsRepositoryPurge
                 return;
             }
 
-            ArtifactReference artifactRef = repository.toArtifactReference( 
path );
+            Artifact artifactRef = layout.getArtifact( path );
+            // ArtifactReference artifactRef = repository.toArtifactReference( 
path );
 
-            if ( !VersionUtil.isSnapshot( artifactRef.getVersion( ) ) )
+            if ( !VersionUtil.isSnapshot( artifactRef.getVersion().getId( ) ) )
             {
                 // Nothing to do here, not a snapshot, skip it.
                 return;
             }
 
             ItemSelector projectSelector = ArchivaItemSelector.builder( )
-                .withNamespace( artifactRef.getGroupId( ) )
-                .withProjectId( artifactRef.getArtifactId( ) )
+                .withNamespace( artifactRef.getNamespace( ).getId() )
+                .withProjectId( artifactRef.getId( ) )
                 .build();
 
 
@@ -128,9 +130,9 @@ public class CleanupReleasedSnapshotsRepositoryPurge
                     Project proj = repoContent.getProject( projectSelector );
                     for ( Version version : repoContent.getVersions( proj ) )
                     {
-                        if ( !VersionUtil.isSnapshot( version.getVersion() ) )
+                        if ( !VersionUtil.isSnapshot( version.getId() ) )
                         {
-                            releasedVersions.add( version.getVersion() );
+                            releasedVersions.add( version.getId() );
                         }
                     }
                 }
@@ -142,19 +144,19 @@ public class CleanupReleasedSnapshotsRepositoryPurge
             boolean needsMetadataUpdate = false;
 
             VersionedReference versionRef = new VersionedReference( );
-            versionRef.setGroupId( artifactRef.getGroupId( ) );
-            versionRef.setArtifactId( artifactRef.getArtifactId( ) );
+            versionRef.setGroupId( artifactRef.getNamespace( ).getId() );
+            versionRef.setArtifactId( artifactRef.getId( ) );
 
             ArchivaItemSelector.Builder versionSelectorBuilder = 
ArchivaItemSelector.builder( )
-                .withNamespace( artifactRef.getGroupId( ) )
-                .withProjectId( artifactRef.getArtifactId( ) )
-                .withArtifactId( artifactRef.getArtifactId( ) );
+                .withNamespace( artifactRef.getNamespace().getId() )
+                .withProjectId( artifactRef.getId( ) )
+                .withArtifactId( artifactRef.getId( ) );
 
             MetadataRepository metadataRepository = 
repositorySession.getRepository( );
 
-            if ( releasedVersions.contains( VersionUtil.getReleaseVersion( 
artifactRef.getVersion( ) ) ) )
+            if ( releasedVersions.contains( VersionUtil.getReleaseVersion( 
artifactRef.getVersion().getId( ) ) ) )
             {
-                ArchivaItemSelector selector = 
versionSelectorBuilder.withVersion( artifactRef.getVersion( ) ).build( );
+                ArchivaItemSelector selector = 
versionSelectorBuilder.withVersion( artifactRef.getVersion().getId( ) ).build( 
);
                 Version version = layout.getVersion( selector );
                 if (version.exists())
                 {
@@ -162,12 +164,12 @@ public class CleanupReleasedSnapshotsRepositoryPurge
                 }
                 for ( RepositoryListener listener : listeners )
                 {
-                    listener.deleteArtifact( metadataRepository, 
repository.getId( ), artifactRef.getGroupId( ),
-                        artifactRef.getArtifactId( ), artifactRef.getVersion( 
),
+                    listener.deleteArtifact( metadataRepository, 
repository.getId( ), artifactRef.getNamespace().getId(),
+                        artifactRef.getId( ), artifactRef.getVersion().getId( 
),
                         artifactFile.getName() );
                 }
                 metadataRepository.removeProjectVersion( repositorySession, 
repository.getId( ),
-                    artifactRef.getGroupId( ), artifactRef.getArtifactId( ), 
artifactRef.getVersion( ) );
+                    artifactRef.getNamespace().getId(), artifactRef.getId( ), 
artifactRef.getVersion().getId() );
 
                 needsMetadataUpdate = true;
             }
@@ -201,16 +203,16 @@ public class CleanupReleasedSnapshotsRepositoryPurge
      * -> not sure what needs to be changed here.
      */
     @SuppressWarnings( "deprecation" )
-    private void updateMetadata( ArtifactReference artifact )
+    private void updateMetadata( Artifact artifact )
     {
         VersionedReference versionRef = new VersionedReference( );
-        versionRef.setGroupId( artifact.getGroupId( ) );
-        versionRef.setArtifactId( artifact.getArtifactId( ) );
-        versionRef.setVersion( artifact.getVersion( ) );
+        versionRef.setGroupId( artifact.getNamespace().getId( ) );
+        versionRef.setArtifactId( artifact.getId( ) );
+        versionRef.setVersion( artifact.getVersion().getId( ) );
 
         ProjectReference projectRef = new ProjectReference( );
-        projectRef.setGroupId( artifact.getGroupId( ) );
-        projectRef.setArtifactId( artifact.getArtifactId( ) );
+        projectRef.setGroupId( artifact.getNamespace().getId( ) );
+        projectRef.setArtifactId( artifact.getId( ) );
 
         try
         {
diff --git 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurge.java
 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurge.java
index 7238fd8..fb42390 100644
--- 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurge.java
+++ 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/DaysOldRepositoryPurge.java
@@ -89,9 +89,9 @@ public class DaysOldRepositoryPurge
                 olderThanThisDate.add( Calendar.DATE, -retentionPeriod );
 
                 ArchivaItemSelector selector = ArchivaItemSelector.builder( )
-                    .withNamespace( artifactItem.getVersion( ).getProject( 
).getNamespace( ).getNamespace( ) )
+                    .withNamespace( artifactItem.getVersion( ).getProject( 
).getNamespace( ).getId( ) )
                     .withProjectId( artifactItem.getVersion( ).getProject( 
).getId( ) )
-                    .withVersion( artifactItem.getVersion( ).getVersion( ) )
+                    .withVersion( artifactItem.getVersion( ).getId( ) )
                     .withClassifier( "*" )
                     .includeRelatedArtifacts( )
                     .build( );
@@ -116,9 +116,9 @@ public class DaysOldRepositoryPurge
 
 
                 ArchivaItemSelector.Builder artifactSelectorBuilder = 
ArchivaItemSelector.builder( )
-                    .withNamespace( artifactItem.getVersion( ).getProject( 
).getNamespace( ).getNamespace( ) )
+                    .withNamespace( artifactItem.getVersion( ).getProject( 
).getNamespace( ).getId( ) )
                     .withProjectId( artifactItem.getVersion( ).getProject( 
).getId( ) )
-                    .withVersion( artifactItem.getVersion( ).getVersion( ) )
+                    .withVersion( artifactItem.getVersion( ).getId( ) )
                     .withArtifactId( artifactItem.getId() )
                     .withClassifier( "*" )
                     .includeRelatedArtifacts( );
diff --git 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java
 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java
index be10380..ec3a242 100644
--- 
a/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java
+++ 
b/archiva-modules/archiva-base/archiva-consumers/archiva-core-consumers/src/main/java/org/apache/archiva/consumers/core/repository/RetentionCountRepositoryPurge.java
@@ -68,13 +68,13 @@ public class RetentionCountRepositoryPurge
                     return;
                 }
 
-                if ( VersionUtil.isSnapshot( artifact.getVersion( 
).getVersion() ) )
+                if ( VersionUtil.isSnapshot( artifact.getVersion( ).getId() ) )
                 {
                     ArchivaItemSelector selector = 
ArchivaItemSelector.builder( )
-                        .withNamespace( artifact.getVersion( ).getProject( 
).getNamespace( ).getNamespace( ) )
+                        .withNamespace( artifact.getVersion( ).getProject( 
).getNamespace( ).getId( ) )
                         .withProjectId( artifact.getVersion( ).getProject( 
).getId( ) )
                         .withArtifactId( artifact.getId( ) )
-                        .withVersion( artifact.getVersion( ).getVersion( ) )
+                        .withVersion( artifact.getVersion( ).getId( ) )
                         .withClassifier( "*" )
                         .includeRelatedArtifacts()
                         .build( );
@@ -98,12 +98,12 @@ public class RetentionCountRepositoryPurge
                     }
 
                     ArchivaItemSelector.Builder selectorBuilder = 
ArchivaItemSelector.builder( )
-                        .withNamespace( artifact.getVersion( ).getProject( 
).getNamespace( ).getNamespace( ) )
+                        .withNamespace( artifact.getVersion( ).getProject( 
).getNamespace( ).getId( ) )
                         .withProjectId( artifact.getVersion( ).getProject( 
).getId( ) )
                         .withArtifactId( artifact.getId( ) )
                         .withClassifier( "*" )
                         .includeRelatedArtifacts()
-                        .withVersion( artifact.getVersion( ).getVersion( ) );
+                        .withVersion( artifact.getVersion( ).getId( ) );
                     int countToPurge = versions.size( ) - retentionCount;
                     Set<Artifact> artifactsToDelete = new HashSet<>( );
                     for ( String version : versions )
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/BaseRepositoryContentLayout.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/BaseRepositoryContentLayout.java
index 71562b1..2aeb645 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/BaseRepositoryContentLayout.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/BaseRepositoryContentLayout.java
@@ -138,8 +138,16 @@ public interface BaseRepositoryContentLayout extends 
ManagedRepositoryContentLay
      * @throws IllegalArgumentException if the selector coordinates do not 
specify a artifact
      * @throws ContentAccessException if the access to the underlying storage 
failed
      */
-    Artifact getArtifact(ItemSelector selector) throws ContentAccessException;
+    Artifact getArtifact(ItemSelector selector) throws ContentAccessException, 
IllegalArgumentException;
 
+    /**
+     * Returns the artifact at the given path
+     * @param path the path to the artifact
+     * @return the artifact instance
+     * @throws LayoutException if the path does not point to a artifact
+     * @throws ContentAccessException if the access to the underlying storage 
failed
+     */
+    Artifact getArtifact( String path ) throws LayoutException, 
ContentAccessException;
 
     /**
      * Returns the artifacts that match the given selector. It is up to the 
repository implementation
@@ -162,10 +170,11 @@ public interface BaseRepositoryContentLayout extends 
ManagedRepositoryContentLay
      *
      * @param selector the selector for the artifacts
      * @return a stream with artifact elements.
+     * @throws IllegalArgumentException if the selector is not valid for the 
layout
      * @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> newArtifactStream( ItemSelector selector) 
throws ContentAccessException;
+    Stream<? extends Artifact> newArtifactStream( ItemSelector selector) 
throws ContentAccessException, IllegalArgumentException;
 
 
     /**
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/LayoutRuntimeException.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/LayoutRuntimeException.java
new file mode 100644
index 0000000..9abc5e0
--- /dev/null
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/LayoutRuntimeException.java
@@ -0,0 +1,40 @@
+package org.apache.archiva.repository;
+
+/*
+ * 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.common.ArchivaException;
+
+/**
+ * LayoutException 
+ *
+ *
+ */
+public class LayoutRuntimeException extends RuntimeException
+{
+    public LayoutRuntimeException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+    public LayoutRuntimeException( String message )
+    {
+        super( message );
+    }
+}
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
index 5de655d..fd92be1 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/RepositoryContent.java
@@ -20,8 +20,6 @@ package org.apache.archiva.repository;
  */
 
 import org.apache.archiva.model.ArtifactReference;
-import org.apache.archiva.model.VersionedReference;
-import org.apache.archiva.repository.content.ContentItem;
 import org.apache.archiva.repository.content.ItemSelector;
 
 
@@ -33,7 +31,7 @@ public interface RepositoryContent
 
 
     /**
-     * Given a repository relative path to a filename, return the {@link 
VersionedReference} object suitable for the path.
+     * Given a repository relative path to a filename, return the {@link 
ArtifactReference} object suitable for the path.
      *
      * @param path the path relative to the repository base dir for the 
artifact.
      * @return the {@link ArtifactReference} representing the path.  (or null 
if path cannot be converted to
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
index 0bb7e84..693b696 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Artifact.java
@@ -61,6 +61,18 @@ public interface Artifact extends DataItem
     String getArtifactVersion( );
 
     /**
+     * Returns the project this artifact is attached to
+     * @return the project
+     */
+    Project getProject();
+
+    /**
+     * Returns the namespace this artifact is attached to
+     * @return the namespace object
+     */
+    Namespace getNamespace();
+
+    /**
      * Returns the attached version this artifact is part of.
      *
      * @return the version object
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Namespace.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Namespace.java
index d31aeed..fe21c98 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Namespace.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Namespace.java
@@ -53,7 +53,7 @@ public interface Namespace extends ContentItem
      *
      * @return the unique name of the namespace
      */
-    String getNamespace( );
+    String getId( );
 
     /**
      * Returns the elements that represent the path to the namespace.
diff --git 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Version.java
 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Version.java
index 071ef5b..d5441ae 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Version.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-api/src/main/java/org/apache/archiva/repository/content/Version.java
@@ -30,12 +30,13 @@ import java.util.List;
  */
 public interface Version extends ContentItem
 {
+
     /**
      * Returns the version string.
      *
      * @return the version string
      */
-    String getVersion( );
+    String getId( );
 
     /**
      * Returns the version segments. E.g. for 1.3.4 it will return 
["1","3"."4"]
@@ -45,6 +46,12 @@ public interface Version extends ContentItem
     List<String> getVersionSegments( );
 
     /**
+     * Returns the namespace this version is attached to
+     * @return the namespace instance
+     */
+    Namespace getNamespace();
+
+    /**
      * Returns the project this version is attached to.
      *
      * @return the project instance. Will never return <code>null</code>
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaArtifact.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaArtifact.java
index b65fa74..cf0ead9 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaArtifact.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaArtifact.java
@@ -22,6 +22,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.Namespace;
+import org.apache.archiva.repository.content.Project;
 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;
@@ -114,6 +116,17 @@ public class ArchivaArtifact extends BaseContentItem 
implements Artifact
         return artifactType;
     }
 
+    @Override
+    public Namespace getNamespace( )
+    {
+        return version.getProject( ).getNamespace( );
+    }
+
+    @Override
+    public Project getProject( )
+    {
+        return version.getProject( );
+    }
 
     /**
      * Returns the builder for creating a new artifact instance. You have to 
fill the
@@ -186,9 +199,9 @@ public class ArchivaArtifact extends BaseContentItem 
implements Artifact
     {
         StringBuilder key = new StringBuilder();
 
-        key.append( defaultString( 
getVersion().getProject().getNamespace().getNamespace() )).append( ":" );
+        key.append( defaultString( 
getVersion().getProject().getNamespace().getId() )).append( ":" );
         key.append( defaultString( getId() ) ).append( ":" );
-        key.append( defaultString( getVersion().getVersion() ) ).append( ":" );
+        key.append( defaultString( getVersion().getId() ) ).append( ":" );
         key.append( defaultString( getArtifactVersion( ) ) ).append( ":" );
         key.append( defaultString( getClassifier() ) ).append( ":" );
         key.append( defaultString( getRemainder() ) );
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaItemSelector.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaItemSelector.java
index 73b730c..cb50630 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaItemSelector.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaItemSelector.java
@@ -67,21 +67,21 @@ public class ArchivaItemSelector implements ItemSelector
         public Builder withItem( ContentItem item ) {
             if (item instanceof Namespace ) {
                 Namespace ns = (Namespace) item;
-                selector.namespace = ns.getNamespace();
+                selector.namespace = ns.getId();
             } else if (item instanceof Project ) {
                 Project proj = (Project)item;
-                selector.namespace = proj.getNamespace( ).getNamespace( );
+                selector.namespace = proj.getNamespace( ).getId( );
                 selector.projectId = proj.getId( );
             } else if (item instanceof Version) {
                 Version version = (Version)item;
-                selector.namespace = version.getProject( ).getNamespace( 
).getNamespace( );
+                selector.namespace = version.getProject( ).getNamespace( 
).getId( );
                 selector.projectId = version.getProject( ).getId( );
-                selector.version = version.getVersion( );
+                selector.version = version.getId( );
             } else if (item instanceof Artifact ) {
                 Artifact artifact = (Artifact)item;
-                selector.namespace = artifact.getVersion( ).getProject( 
).getNamespace( ).getNamespace( );
+                selector.namespace = artifact.getVersion( ).getProject( 
).getNamespace( ).getId( );
                 selector.projectId = artifact.getVersion( ).getProject( 
).getId( );
-                selector.version = artifact.getVersion( ).getVersion( );
+                selector.version = artifact.getVersion( ).getId( );
                 selector.artifactId = artifact.getId( );
                 selector.artifactVersion = artifact.getArtifactVersion( );
                 selector.extension = artifact.getExtension( );
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaNamespace.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaNamespace.java
index 9982ea0..1cd744a 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaNamespace.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaNamespace.java
@@ -50,7 +50,7 @@ public class ArchivaNamespace extends BaseContentItem 
implements Namespace
     }
 
     @Override
-    public String getNamespace( )
+    public String getId( )
     {
         return namespace;
     }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
index e462116..a146dd1 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
@@ -20,6 +20,7 @@ package org.apache.archiva.repository.content.base;
  */
 
 import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.archiva.repository.content.Namespace;
 import org.apache.archiva.repository.content.Project;
 import org.apache.archiva.repository.content.Version;
 import org.apache.archiva.repository.content.base.builder.VersionOptBuilder;
@@ -80,7 +81,7 @@ public class ArchivaVersion extends BaseContentItem 
implements Version
     }
 
     @Override
-    public String getVersion( )
+    public String getId( )
     {
         return version;
     }
@@ -91,6 +92,11 @@ public class ArchivaVersion extends BaseContentItem 
implements Version
         return project;
     }
 
+    @Override
+    public Namespace getNamespace( )
+    {
+        return project.getNamespace( );
+    }
 
     @Override
     public boolean equals( Object o )
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/BaseContentItem.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/BaseContentItem.java
index 69c7545..2be5937 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/BaseContentItem.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/BaseContentItem.java
@@ -40,7 +40,6 @@ public abstract class BaseContentItem implements ContentItem
     protected StorageAsset asset;
     private Map<String, String> attributes;
     private Map<Class<?>, ContentItem> characteristics  = new HashMap<>(  );
-    private Set<Class<?>> failedConversions = new HashSet<>(  );
 
     @Override
     public <T extends ContentItem> T adapt( Class<T> clazz ) throws 
ItemConversionException
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/base/MetadataTools.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/base/MetadataTools.java
index 3a02bbe..ce82fa1 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/base/MetadataTools.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/metadata/base/MetadataTools.java
@@ -21,7 +21,6 @@ package org.apache.archiva.repository.metadata.base;
 
 import org.apache.archiva.checksum.ChecksumAlgorithm;
 import org.apache.archiva.checksum.ChecksummedFile;
-import org.apache.archiva.common.utils.PathUtil;
 import org.apache.archiva.common.utils.VersionComparator;
 import org.apache.archiva.common.utils.VersionUtil;
 import org.apache.archiva.configuration.ArchivaConfiguration;
@@ -66,7 +65,6 @@ import javax.inject.Named;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -552,7 +550,7 @@ public class MetadataTools
         {
             Project project = layout.getProject( selector );
             allVersions = layout.getVersions( project ).stream()
-            .map( v -> v.getVersion() ).collect( Collectors.toSet());
+            .map( v -> v.getId() ).collect( Collectors.toSet());
         }
         catch ( org.apache.archiva.repository.ContentAccessException e )
         {
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaNamespaceTest.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaNamespaceTest.java
index 93774bd..cddffac 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaNamespaceTest.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaNamespaceTest.java
@@ -53,7 +53,7 @@ class ArchivaNamespaceTest extends ContentItemTest
         assertNotNull( result );
         assertEquals( this.repository, result.getRepository( ) );
         assertEquals( this.asset, result.getAsset( ) );
-        assertEquals( "test.1d.d", result.getNamespace( ) );
+        assertEquals( "test.1d.d", result.getId( ) );
         assertNotNull( result.getAttributes( ) );
         assertEquals( 0, result.getAttributes( ).size( ) );
         assertArrayEquals( new String[]{ "test", "1d", "d" }, 
result.getNamespacePath().toArray() );
@@ -69,7 +69,7 @@ class ArchivaNamespaceTest extends ContentItemTest
         assertNotNull( result );
         assertEquals( this.repository, result.getRepository( ) );
         assertEquals( this.asset, result.getAsset( ) );
-        assertEquals( "test.1d..d.", result.getNamespace( ) );
+        assertEquals( "test.1d..d.", result.getId( ) );
         assertNotNull( result.getAttributes( ) );
         assertEquals( 0, result.getAttributes( ).size( ) );
         assertArrayEquals( new String[]{ "test", "1d", "","d" }, 
result.getNamespacePath().toArray() );
@@ -87,7 +87,7 @@ class ArchivaNamespaceTest extends ContentItemTest
         assertNotNull( result );
         assertEquals( this.repository, result.getRepository( ) );
         assertEquals( this.asset, result.getAsset( ) );
-        assertEquals( "test.1d.d/abc/def", result.getNamespace( ) );
+        assertEquals( "test.1d.d/abc/def", result.getId( ) );
         assertNotNull( result.getAttributes( ) );
         assertEquals( 0, result.getAttributes( ).size( ) );
         assertArrayEquals( new String[]{ "test.1d.d", "abc", "def" }, 
result.getNamespacePath().toArray() );
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaVersionTest.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaVersionTest.java
index 151bb23..799e477 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaVersionTest.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/content/base/ArchivaVersionTest.java
@@ -55,8 +55,8 @@ class ArchivaVersionTest extends ContentItemTest
         assertEquals( asset, item.getAsset( ) );
         assertNotNull( item.getProject( ) );
         assertEquals( project, item.getProject( ) );
-        assertNotNull( item.getVersion( ) );
-        assertEquals( "3.4.5", item.getVersion( ) );
+        assertNotNull( item.getId( ) );
+        assertEquals( "3.4.5", item.getId( ) );
         assertNotNull( item.getVersionSegments( ) );
         assertArrayEquals( new String[]{"3", "4", "5"}, 
item.getVersionSegments( ).toArray( ) );
     }
diff --git 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
index 83bddf8..bab8373 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-layer/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
@@ -148,6 +148,12 @@ public class ManagedRepositoryContentMock implements 
BaseRepositoryContentLayout
     }
 
     @Override
+    public Artifact getArtifact( String path ) throws LayoutException, 
ContentAccessException
+    {
+        return null;
+    }
+
+    @Override
     public List<? extends Artifact> getArtifacts( ItemSelector selector ) 
throws ContentAccessException
     {
         return null;
diff --git 
a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
 
b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
index 1a96707..5deb975 100644
--- 
a/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
+++ 
b/archiva-modules/archiva-base/archiva-repository-scanner/src/test/java/org/apache/archiva/repository/scanner/mock/ManagedRepositoryContentMock.java
@@ -159,6 +159,12 @@ public class ManagedRepositoryContentMock implements 
BaseRepositoryContentLayout
     }
 
     @Override
+    public Artifact getArtifact( String path ) throws LayoutException, 
ContentAccessException
+    {
+        return null;
+    }
+
+    @Override
     public List<? extends Artifact> getArtifacts( ItemSelector selector ) 
throws ContentAccessException
     {
         return null;
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
 
b/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
index d00159f..c59bfad 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-proxy/src/test/java/org/apache/archiva/repository/mock/ManagedRepositoryContentMock.java
@@ -172,6 +172,12 @@ public class ManagedRepositoryContentMock implements 
BaseRepositoryContentLayout
     }
 
     @Override
+    public Artifact getArtifact( String path ) throws LayoutException, 
ContentAccessException
+    {
+        return null;
+    }
+
+    @Override
     public List<? extends Artifact> getArtifacts( ItemSelector selector ) 
throws ContentAccessException
     {
         return null;
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContent.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContent.java
index 662a3c8..319eaa7 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContent.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/main/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContent.java
@@ -24,15 +24,14 @@ import org.apache.archiva.configuration.FileTypes;
 import org.apache.archiva.metadata.maven.MavenMetadataReader;
 import org.apache.archiva.metadata.repository.storage.RepositoryPathTranslator;
 import org.apache.archiva.model.ArtifactReference;
-import org.apache.archiva.model.VersionedReference;
+import org.apache.archiva.repository.BaseRepositoryContentLayout;
 import org.apache.archiva.repository.ContentAccessException;
-import org.apache.archiva.repository.ContentNotFoundException;
 import org.apache.archiva.repository.EditableManagedRepository;
-import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.ItemDeleteStatus;
 import org.apache.archiva.repository.LayoutException;
+import org.apache.archiva.repository.LayoutRuntimeException;
 import org.apache.archiva.repository.ManagedRepository;
-import org.apache.archiva.repository.BaseRepositoryContentLayout;
+import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.ManagedRepositoryContentLayout;
 import org.apache.archiva.repository.content.Artifact;
 import org.apache.archiva.repository.content.ArtifactType;
@@ -65,9 +64,10 @@ import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.regex.Matcher;
@@ -315,7 +315,14 @@ public class ManagedDefaultRepositoryContent
     public Namespace getNamespace( final ItemSelector namespaceSelector ) 
throws ContentAccessException, IllegalArgumentException
     {
         StorageAsset nsPath = getAsset( namespaceSelector.getNamespace() );
-        return getNamespaceFromPath( nsPath );
+        try
+        {
+            return getNamespaceFromPath( nsPath );
+        }
+        catch ( LayoutException e )
+        {
+            throw new IllegalArgumentException( "Not a valid selector " + 
e.getMessage( ), e );
+        }
     }
 
 
@@ -327,7 +334,14 @@ public class ManagedDefaultRepositoryContent
             throw new IllegalArgumentException( "Project id must be set" );
         }
         final StorageAsset path = getAsset( selector.getNamespace( ), 
selector.getProjectId( ) );
-        return getProjectFromPath( path );
+        try
+        {
+            return getProjectFromPath( path );
+        }
+        catch ( LayoutException e )
+        {
+            throw new IllegalArgumentException( "Not a valid selector " + 
e.getMessage( ), e );
+        }
     }
 
 
@@ -343,12 +357,19 @@ public class ManagedDefaultRepositoryContent
             throw new IllegalArgumentException( "Version must be set" );
         }
         final StorageAsset path = getAsset( selector.getNamespace( ), 
selector.getProjectId( ), selector.getVersion( ) );
-        return getVersionFromPath( path );
+        try
+        {
+            return getVersionFromPath( path );
+        }
+        catch ( LayoutException e )
+        {
+            throw new IllegalArgumentException( "Not a valid selector " + 
e.getMessage( ), e );
+        }
     }
 
 
     public Artifact createArtifact( final StorageAsset artifactPath, final 
ItemSelector selector,
-                                    final String classifier, final String 
extension )
+                                    final String classifier )
     {
         Version version = getVersion( selector );
         ArtifactOptBuilder builder = 
org.apache.archiva.repository.content.base.ArchivaArtifact.withAsset( 
artifactPath )
@@ -363,23 +384,42 @@ public class ManagedDefaultRepositoryContent
         return builder.build( );
     }
 
-    public Namespace getNamespaceFromArtifactPath( final StorageAsset 
artifactPath )
+    public Namespace getNamespaceFromArtifactPath( final StorageAsset 
artifactPath ) throws LayoutException
     {
+        if (artifactPath == null) {
+            throw new LayoutException( "Path null is not valid for artifact" );
+        }
         final StorageAsset namespacePath = artifactPath.getParent( 
).getParent( ).getParent( );
         return getNamespaceFromPath( namespacePath );
     }
 
-    public Namespace getNamespaceFromPath( final StorageAsset nsPath )
+    public Namespace getNamespaceFromPath( final StorageAsset nsPath ) throws 
LayoutException
     {
-        ContentItem item = itemMap.computeIfAbsent( nsPath,
-            path -> createNamespaceFromPath( nsPath ) );
+        if (nsPath == null) {
+            throw new LayoutException( "Path null is not valid for namespace" 
);
+        }
+
+        ContentItem item;
+        try
+        {
+            item = itemMap.computeIfAbsent( nsPath,
+                path -> createNamespaceFromPath( nsPath ) );
+        }
+        catch ( LayoutRuntimeException e )
+        {
+            throw new LayoutException( e.getMessage( ), e.getCause() );
+        }
         if (!item.hasCharacteristic( Namespace.class )) {
             item.setCharacteristic( Namespace.class, createNamespaceFromPath( 
nsPath ) );
         }
         return item.adapt( Namespace.class );
     }
 
-    public Namespace createNamespaceFromPath( final StorageAsset 
namespacePath) {
+    public Namespace createNamespaceFromPath( final StorageAsset 
namespacePath) throws LayoutRuntimeException
+    {
+        if (namespacePath == null) {
+            throw new LayoutRuntimeException( "Path null is not valid for 
namespace" );
+        }
         final String namespace = 
MavenContentHelper.getNamespaceFromNamespacePath( namespacePath );
         return ArchivaNamespace.withRepository( this )
             .withAsset( namespacePath )
@@ -387,67 +427,148 @@ public class ManagedDefaultRepositoryContent
             .build( );
     }
 
-    private Project getProjectFromPath( final StorageAsset path )
+    private Project getProjectFromPath( final StorageAsset path ) throws 
LayoutException
     {
-        ContentItem item = itemMap.computeIfAbsent( path, projectPath ->
-                createProjectFromPath( projectPath )
-        );
+        if (path == null) {
+            throw new LayoutException( "Path null is not valid for project" );
+        }
+        ContentItem item;
+        try
+        {
+            item = itemMap.computeIfAbsent( path, this::createProjectFromPath 
);
+        }
+        catch ( LayoutRuntimeException e )
+        {
+            throw new LayoutException( e.getMessage( ), e.getCause( ) );
+        }
         if (!item.hasCharacteristic( Project.class )) {
             item.setCharacteristic( Project.class, createProjectFromPath( path 
) );
         }
         return item.adapt( Project.class );
     }
 
-    private Project createProjectFromPath( final StorageAsset projectPath ) {
-        Namespace namespace = getNamespaceFromPath( projectPath.getParent( ) );
+    private Project createProjectFromPath( final StorageAsset projectPath ) 
throws LayoutRuntimeException
+    {
+        if (projectPath==null) {
+            throw new LayoutRuntimeException( "Path null is not valid for 
project" );
+        }
+        Namespace namespace;
+        try
+        {
+            namespace = getNamespaceFromPath( projectPath.getParent( ) );
+        }
+        catch ( LayoutException e )
+        {
+            throw new LayoutRuntimeException( e.getMessage( ), e.getCause() );
+        }
         return ArchivaProject.withRepository( this ).withAsset( projectPath )
             .withNamespace( namespace )
             .withId( projectPath.getName( ) ).build( );
     }
 
-    private Project getProjectFromArtifactPath( final StorageAsset 
artifactPath )
+    private Project getProjectFromArtifactPath( final StorageAsset 
artifactPath ) throws LayoutException
     {
+        if (artifactPath == null) {
+            throw new LayoutException( "Path null is not valid for artifact" );
+        }
         final StorageAsset projectPath = artifactPath.getParent( ).getParent( 
);
         return getProjectFromPath( projectPath );
     }
 
-    private Version getVersionFromArtifactPath( final StorageAsset 
artifactPath )
+    private Version getVersionFromArtifactPath( final StorageAsset 
artifactPath ) throws LayoutException
     {
+        if (artifactPath==null) {
+            throw new LayoutException( "Path null is not valid for version" );
+        }
         final StorageAsset versionPath = artifactPath.getParent( );
         return getVersionFromPath( versionPath );
     }
 
-    private Version getVersionFromPath( StorageAsset path )
+    private Version getVersionFromPath( StorageAsset path ) throws 
LayoutException
     {
-        ContentItem item = itemMap.computeIfAbsent( path, versionPath ->
-            createVersionFromPath( versionPath )
-        );
+        if (path==null) {
+            throw new LayoutException( "Path null is not valid for version" );
+        }
+        ContentItem item;
+        try
+        {
+            item = itemMap.computeIfAbsent( path, this::createVersionFromPath 
);
+        }
+        catch ( LayoutRuntimeException e )
+        {
+            throw new LayoutException( e.getMessage( ), e.getCause( ) );
+        }
         if (!item.hasCharacteristic( Version.class )) {
             item.setCharacteristic( Version.class, createVersionFromPath( path 
) );
         }
         return item.adapt( Version.class );
     }
 
-    private Version createVersionFromPath(StorageAsset path) {
-        Project proj = getProjectFromPath( path.getParent( ) );
+    private Version createVersionFromPath(StorageAsset path) throws 
LayoutRuntimeException
+    {
+        if (path==null) {
+            throw new LayoutRuntimeException( "Path null is not valid for 
version" );
+        }
+        Project proj;
+        try
+        {
+            proj = getProjectFromPath( path.getParent( ) );
+        }
+        catch ( LayoutException e )
+        {
+            throw new LayoutRuntimeException( e.getMessage( ), e );
+        }
         return ArchivaVersion.withRepository( this ).withAsset( path )
             .withProject( proj ).withVersion(path.getName()).build();
     }
 
-    private Artifact getArtifactFromPath( final StorageAsset artifactPath )
+    private Optional<Artifact> getOptionalArtifactFromPath( final StorageAsset 
artifactPath) {
+        try
+        {
+            return Optional.of( getArtifactFromPath( artifactPath ) );
+        }
+        catch ( LayoutException e )
+        {
+            log.error( "Could not get artifact from path {}", 
artifactPath.getPath( ) );
+            return Optional.empty( );
+        }
+    }
+
+    private Artifact getArtifactFromPath( final StorageAsset artifactPath ) 
throws LayoutException
     {
-        DataItem item = dataItemMap.computeIfAbsent( artifactPath, 
myArtifactPath ->
-            createArtifactFromPath( myArtifactPath )
-        );
+        if (artifactPath==null) {
+            throw new LayoutException( "Path null is not valid for artifact" );
+        }
+        DataItem item;
+        try
+        {
+            item = dataItemMap.computeIfAbsent( artifactPath, 
this::createArtifactFromPath );
+        }
+        catch ( LayoutRuntimeException e )
+        {
+            throw new LayoutException( e.getMessage( ), e.getCause() );
+        }
         if (!item.hasCharacteristic( Artifact.class )) {
             item.setCharacteristic( Artifact.class, createArtifactFromPath( 
artifactPath ) );
         }
         return item.adapt( Artifact.class );
     }
 
-    private Artifact createArtifactFromPath( final StorageAsset artifactPath ) 
{
-        final Version version = getVersionFromArtifactPath( artifactPath );
-        final ArtifactInfo info = getArtifactInfoFromPath( version.getVersion( 
), artifactPath );
+    private Artifact createArtifactFromPath( final StorageAsset artifactPath ) 
throws LayoutRuntimeException
+    {
+        if (artifactPath==null) {
+            throw new LayoutRuntimeException( "Path null is not valid for 
artifact" );
+        }
+        final Version version;
+        try
+        {
+            version = getVersionFromArtifactPath( artifactPath );
+        }
+        catch ( LayoutException e )
+        {
+            throw new LayoutRuntimeException( e.getMessage( ), e );
+        }
+        final ArtifactInfo info = getArtifactInfoFromPath( version.getId( ), 
artifactPath );
         return 
org.apache.archiva.repository.content.base.ArchivaArtifact.withAsset( 
artifactPath )
             .withVersion( version )
             .withId( info.id )
@@ -474,7 +595,6 @@ public class ManagedDefaultRepositoryContent
 
     private DataItem getDataItemFromPath( final StorageAsset artifactPath )
     {
-        final String extension = StringUtils.substringAfterLast( 
artifactPath.getName( ), "." );
         final String contentType = getContentType( artifactPath );
         return dataItemMap.computeIfAbsent( artifactPath, myArtifactPath ->
             
org.apache.archiva.repository.content.base.ArchivaDataItem.withAsset( 
artifactPath )
@@ -511,7 +631,7 @@ public class ManagedDefaultRepositoryContent
     }
 
     // Simple object to hold artifact information
-    private class ArtifactInfo
+    private static class ArtifactInfo
     {
         private String id;
         private String version;
@@ -690,7 +810,21 @@ public class ManagedDefaultRepositoryContent
         final String fileName = MavenContentHelper.getArtifactFileName( 
artifactId, artifactVersion, classifier, extension );
         final StorageAsset path = getAsset( selector.getNamespace( ), 
selector.getProjectId( ),
             selector.getVersion( ), fileName );
-        return getArtifactFromPath( path );
+        try
+        {
+            return getArtifactFromPath( path );
+        }
+        catch ( LayoutException e )
+        {
+            throw new IllegalArgumentException( "The selector is not valid " + 
e.getMessage( ), e );
+        }
+    }
+
+    @Override
+    public Artifact getArtifact( String path ) throws LayoutException, 
ContentAccessException
+    {
+        StorageAsset asset = getAssetByPath( path );
+        return getArtifactFromPath( asset );
     }
 
     /**
@@ -700,8 +834,19 @@ public class ManagedDefaultRepositoryContent
     public List<? extends Project> getProjects( Namespace namespace )
     {
         return namespace.getAsset( ).list( ).stream( )
-            .filter( a -> a.isContainer( ) )
-            .map( a -> getProjectFromPath( a ) )
+            .filter( StorageAsset::isContainer )
+            .map( a -> {
+                try
+                {
+                    return getProjectFromPath( a );
+                }
+                catch ( LayoutException e )
+                {
+                    log.error( "Not a valid project path " + a.getPath( ), e );
+                    return null;
+                }
+            } )
+            .filter( Objects::nonNull )
             .collect( Collectors.toList( ) );
     }
 
@@ -720,8 +865,8 @@ public class ManagedDefaultRepositoryContent
     @Override
     public List<? extends Version> getVersions( final Project project )
     {
-        StorageAsset asset = getAsset( project.getNamespace( ).getNamespace( 
), project.getId( ) );
-        return asset.list( ).stream( ).filter( a -> a.isContainer( ) )
+        StorageAsset asset = getAsset( project.getNamespace( ).getId( ), 
project.getId( ) );
+        return asset.list( ).stream( ).filter( StorageAsset::isContainer )
             .map( a -> ArchivaVersion.withAsset( a )
                 .withProject( project )
                 .withVersion( a.getName( ) ).build( ) )
@@ -750,7 +895,18 @@ public class ManagedDefaultRepositoryContent
             final StorageAsset asset = getAsset( selector.getNamespace( ), 
selector.getProjectId( ), selector.getVersion( ) );
             return asset.list( ).stream( ).map( a -> getArtifactInfoFromPath( 
selector.getVersion( ), a ) )
                 .filter( ai -> StringUtils.isNotEmpty( ai.version ) )
-                .map( v -> getVersionFromArtifactPath( v.asset ) )
+                .map( v -> {
+                    try
+                    {
+                        return getVersionFromArtifactPath( v.asset );
+                    }
+                    catch ( LayoutException e )
+                    {
+                        log.error( "Could not get version from asset " + 
v.asset.getPath( ) );
+                        return null;
+                    }
+                } )
+                .filter( Objects::nonNull )
                 .distinct( )
                 .collect( Collectors.toList( ) );
         }
@@ -779,8 +935,18 @@ public class ManagedDefaultRepositoryContent
         }
         else
         {
-            return project.getAsset( ).list( ).stream( ).map( a -> 
getVersionFromPath( a ) )
-                .flatMap( v -> v.getAsset( ).list( ).stream( ).map( a -> 
getArtifactInfoFromPath( v.getVersion( ), a ) ) )
+            return project.getAsset( ).list( ).stream( ).map( a -> {
+                try
+                {
+                    return getVersionFromPath( a );
+                }
+                catch ( LayoutException e )
+                {
+                    log.error( "Could not get version from path " + a.getPath( 
) );
+                    return null;
+                }
+            } ).filter( Objects::nonNull )
+                .flatMap( v -> v.getAsset( ).list( ).stream( ).map( a -> 
getArtifactInfoFromPath( v.getId( ), a ) ) )
                 .filter( ai -> StringUtils.isNotEmpty( ai.version ) )
                 .map( v -> v.version )
                 .distinct( )
@@ -811,7 +977,7 @@ public class ManagedDefaultRepositoryContent
      */
     private Predicate<StorageAsset> getArtifactFileFilterFromSelector( final 
ItemSelector selector )
     {
-        Predicate<StorageAsset> p = a -> a.isLeaf( );
+        Predicate<StorageAsset> p = StorageAsset::isLeaf;
         StringBuilder fileNamePattern = new StringBuilder( "^" );
         if ( selector.hasArtifactId( ) )
         {
@@ -921,16 +1087,18 @@ public class ManagedDefaultRepositoryContent
         {
             return getAsset( selector.getNamespace( ), projectId, 
selector.getVersion( ) )
                 .list( ).stream( ).filter( filter )
-                .map( this::getArtifactFromPath );
+                .map( this::getOptionalArtifactFromPath )
+                .filter( Optional::isPresent ).map( Optional::get );
         }
         else if ( projectId != null )
         {
             final StorageAsset projDir = getAsset( selector.getNamespace( ), 
projectId );
             return projDir.list( ).stream( )
-                .map( a -> a.isContainer( ) ? a.list( ) : Arrays.asList( a ) )
+                .map( a -> a.isContainer( ) ? a.list( ) : 
Collections.singletonList( a ) )
                 .flatMap( List::stream )
                 .filter( filter )
-                .map( this::getArtifactFromPath );
+                .map( this::getOptionalArtifactFromPath )
+                .filter( Optional::isPresent ).map( Optional::get );
         }
         else
         {
@@ -939,19 +1107,20 @@ public class ManagedDefaultRepositoryContent
             {
                 return StorageUtil.newAssetStream( namespaceDir, true )
                     .filter( filter )
-                    .map( this::getArtifactFromPath );
-
+                    .map( this::getOptionalArtifactFromPath )
+                    .filter( Optional::isPresent ).map( Optional::get );
             }
             else
             {
                 // We descend into 2 subdirectories (project and version)
                 return namespaceDir.list( ).stream( )
-                    .map( a -> a.isContainer( ) ? a.list( ) : Arrays.asList( a 
) )
+                    .map( a -> a.isContainer( ) ? a.list( ) : 
Collections.singletonList( a ) )
                     .flatMap( List::stream )
-                    .map( a -> a.isContainer( ) ? a.list( ) : Arrays.asList( a 
) )
+                    .map( a -> a.isContainer( ) ? a.list( ) : 
Collections.singletonList( a ) )
                     .flatMap( List::stream )
                     .filter( filter )
-                    .map( this::getArtifactFromPath );
+                    .map( this::getOptionalArtifactFromPath )
+                    .filter( Optional::isPresent ).map( Optional::get );
             }
         }
     }
@@ -974,26 +1143,26 @@ public class ManagedDefaultRepositoryContent
     /**
      * Returns all artifacts
      *
-     * @param item
-     * @return
-     * @throws ContentAccessException
+     * @param item the namespace to search for artifacts
+     * @return the stream of artifacts
+     * @throws ContentAccessException if the access to the underlying storage 
failed
      */
     public Stream<? extends Artifact> newArtifactStream( Namespace item ) 
throws ContentAccessException
     {
-        return newArtifactStream( ArchivaItemSelector.builder( 
).withNamespace( item.getNamespace( ) ).build( ) );
+        return newArtifactStream( ArchivaItemSelector.builder( 
).withNamespace( item.getId( ) ).build( ) );
     }
 
     public Stream<? extends Artifact> newArtifactStream( Project item ) throws 
ContentAccessException
     {
-        return newArtifactStream( ArchivaItemSelector.builder( 
).withNamespace( item.getNamespace( ).getNamespace( ) )
+        return newArtifactStream( ArchivaItemSelector.builder( 
).withNamespace( item.getNamespace( ).getId( ) )
             .withProjectId( item.getId( ) ).build( ) );
     }
 
     public Stream<? extends Artifact> newArtifactStream( Version item ) throws 
ContentAccessException
     {
-        return newArtifactStream( ArchivaItemSelector.builder( 
).withNamespace( item.getProject( ).getNamespace( ).getNamespace( ) )
+        return newArtifactStream( ArchivaItemSelector.builder( 
).withNamespace( item.getProject( ).getNamespace( ).getId( ) )
             .withProjectId( item.getProject( ).getId( ) )
-            .withVersion( item.getVersion( ) ).build( ) );
+            .withVersion( item.getId( ) ).build( ) );
     }
 
     /**
@@ -1002,7 +1171,7 @@ public class ManagedDefaultRepositoryContent
      *
      * @param item the artifact
      * @return the stream of artifacts
-     * @throws ContentAccessException
+     * @throws ContentAccessException if access to the underlying storage 
failed
      */
     public Stream<? extends Artifact> newArtifactStream( Artifact item ) 
throws ContentAccessException
     {
@@ -1011,15 +1180,25 @@ public class ManagedDefaultRepositoryContent
         final Predicate<StorageAsset> filter = ( StorageAsset a ) ->
             a.getName( ).startsWith( fileName + "." );
         return v.getAsset( ).list( ).stream( ).filter( filter )
-            .map( a -> getArtifactFromPath( a ) );
+            .map( a -> {
+                try
+                {
+                    return getArtifactFromPath( a );
+                }
+                catch ( LayoutException e )
+                {
+                    log.error( "Not a valid artifact path " + a.getPath( ), e 
);
+                    return null;
+                }
+            } ).filter( Objects::nonNull );
     }
 
     /**
      * Returns the stream of artifacts that are children of the given item.
      *
      * @param item the item from where the artifacts should be returned
-     * @return
-     * @throws ContentAccessException
+     * @return the stream of artifacts
+     * @throws ContentAccessException if access to the underlying storage 
failed
      */
     @Override
     public Stream<? extends Artifact> newArtifactStream( ContentItem item ) 
throws ContentAccessException
@@ -1173,7 +1352,6 @@ public class ManagedDefaultRepositoryContent
                     .map( this::getItemFromPath );
             }
         }
-        ;
         return StorageUtil.newAssetStream( startDir, parallel )
             .filter( filter )
             .map( this::getItemFromPath );
@@ -1201,7 +1379,7 @@ public class ManagedDefaultRepositoryContent
         if (item.getAsset().isLeaf()) {
             return Collections.emptyList( );
         } else {
-            return item.getAsset( ).list( ).stream( ).map( a -> 
getItemFromPath( a ) ).collect( Collectors.toList( ) );
+            return item.getAsset( ).list( ).stream( ).map( 
this::getItemFromPath ).collect( Collectors.toList( ) );
         }
     }
 
@@ -1462,70 +1640,6 @@ public class ManagedDefaultRepositoryContent
         }
     }
 
-
-    /**
-     * Get the first Artifact found in the provided VersionedReference 
location.
-     *
-     * @param reference the reference to the versioned reference to search 
within
-     * @return the ArtifactReference to the first artifact located within the 
versioned reference. or null if
-     * no artifact was found within the versioned reference.
-     * @throws java.io.IOException if the versioned reference is invalid 
(example: doesn't exist, or isn't a directory)
-     * @throws LayoutException
-     */
-    private ArtifactReference getFirstArtifact( VersionedReference reference )
-        throws ContentNotFoundException, LayoutException, IOException
-    {
-        try ( Stream<ArtifactReference> stream = newArtifactStream( reference 
) )
-        {
-            return stream.findFirst( ).orElse( null );
-        }
-        catch ( RuntimeException e )
-        {
-            throw new ContentNotFoundException( e.getMessage( ), e.getCause( ) 
);
-        }
-    }
-
-    private Stream<ArtifactReference> newArtifactStream( VersionedReference 
reference ) throws ContentNotFoundException, LayoutException, IOException
-    {
-        final Path repoBase = getRepoDir( );
-        String path = toMetadataPath( reference );
-        Path versionDir = repoBase.resolve( path ).getParent( );
-        if ( !Files.exists( versionDir ) )
-        {
-            throw new ContentNotFoundException( "Unable to gather the list of 
artifacts on a non-existant directory: "
-                + versionDir.toAbsolutePath( ) );
-        }
-
-        if ( !Files.isDirectory( versionDir ) )
-        {
-            throw new ContentNotFoundException(
-                "Unable to gather the list of snapshot versions on a 
non-directory: " + versionDir.toAbsolutePath( ) );
-        }
-        return Files.list( versionDir ).filter( Files::isRegularFile )
-            .map( p -> repoBase.relativize( p ).toString( ) )
-            .filter( p -> !filetypes.matchesDefaultExclusions( p ) )
-            .filter( filetypes::matchesArtifactPattern )
-            .map( this::toArtifactRef );
-    }
-
-    private boolean hasArtifact( VersionedReference reference )
-
-    {
-        try ( Stream<ArtifactReference> stream = newArtifactStream( reference 
) )
-        {
-            return stream.anyMatch( e -> true );
-        }
-        catch ( ContentNotFoundException e )
-        {
-            return false;
-        }
-        catch ( LayoutException | IOException e )
-        {
-            // We throw the runtime exception for better stream handling
-            throw new RuntimeException( e );
-        }
-    }
-
     public void setFiletypes( FileTypes filetypes )
     {
         this.filetypes = filetypes;
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/AbstractRepositoryContentTest.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/AbstractRepositoryContentTest.java
index f1a6444..c3c987f 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/AbstractRepositoryContentTest.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/AbstractRepositoryContentTest.java
@@ -584,7 +584,7 @@ public abstract class AbstractRepositoryContentTest
             {
                 ns = getManaged( ).getLayout( 
BaseRepositoryContentLayout.class ).getNamespace( expectedArtifact );
                 assertNotNull( ns );
-                assertEquals( groupId, ns.getNamespace( ) );
+                assertEquals( groupId, ns.getId( ) );
             }
             if ( StringUtils.isNotEmpty( artifactId ) )
             {
@@ -597,7 +597,7 @@ public abstract class AbstractRepositoryContentTest
             {
                 ver = getManaged( ).getLayout( 
BaseRepositoryContentLayout.class ).getVersion( expectedArtifact );
                 assertNotNull( ver );
-                assertEquals( version, ver.getVersion( ) );
+                assertEquals( version, ver.getId( ) );
                 assertEquals( pr, ver.getProject( ) );
             }
             Artifact artifact = getManaged( ).getLayout( 
BaseRepositoryContentLayout.class ).getArtifact( expectedArtifact );
diff --git 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContentTest.java
 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContentTest.java
index 39be5fa..f751abb 100644
--- 
a/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContentTest.java
+++ 
b/archiva-modules/archiva-maven/archiva-maven-repository/src/test/java/org/apache/archiva/repository/maven/content/ManagedDefaultRepositoryContentTest.java
@@ -203,7 +203,7 @@ public class ManagedDefaultRepositoryContentTest
             .withVersion( version )
             .build( );
         List<String> versions = repoContent.getVersions( selector ).stream()
-            .map(v -> v.getVersion()).sorted( comparator ).collect( 
Collectors.toList());
+            .map(v -> v.getId()).sorted( comparator ).collect( 
Collectors.toList());
         assertArrayEquals( expectedVersions, versions.toArray( ) );
 
 
@@ -512,12 +512,12 @@ public class ManagedDefaultRepositoryContentTest
         assertNotNull( artifact );
         assertEquals( "pom", artifact.getExtension( ) );
         assertEquals( BaseArtifactTypes.MAIN, artifact.getDataType( ) );
-        assertEquals( "1.3-SNAPSHOT", artifact.getVersion( ).getVersion( ) );
+        assertEquals( "1.3-SNAPSHOT", artifact.getVersion( ).getId( ) );
         assertEquals( "1.3-20070725.210059-1", artifact.getArtifactVersion( ) 
);
         assertEquals( ".pom", artifact.getRemainder( ) );
         assertEquals( "axis2", artifact.getId( ) );
         assertEquals( "axis2", artifact.getVersion( ).getProject( ).getId( ) );
-        assertEquals( "org.apache.axis2", artifact.getVersion( ).getProject( 
).getNamespace( ).getNamespace( ) );
+        assertEquals( "org.apache.axis2", artifact.getVersion( ).getProject( 
).getNamespace( ).getId( ) );
         assertEquals( "", artifact.getClassifier( ) );
         assertEquals( "pom", artifact.getType( ) );
 
@@ -528,12 +528,12 @@ public class ManagedDefaultRepositoryContentTest
         assertNotNull( artifact );
         assertEquals( "md5", artifact.getExtension( ) );
         assertEquals( BaseArtifactTypes.RELATED, artifact.getDataType( ) );
-        assertEquals( "1.3-SNAPSHOT", artifact.getVersion( ).getVersion( ) );
+        assertEquals( "1.3-SNAPSHOT", artifact.getVersion( ).getId( ) );
         assertEquals( "1.3-20070725.210059-1", artifact.getArtifactVersion( ) 
);
         assertEquals( ".pom.md5", artifact.getRemainder( ) );
         assertEquals( "axis2", artifact.getId( ) );
         assertEquals( "axis2", artifact.getVersion( ).getProject( ).getId( ) );
-        assertEquals( "org.apache.axis2", artifact.getVersion( ).getProject( 
).getNamespace( ).getNamespace( ) );
+        assertEquals( "org.apache.axis2", artifact.getVersion( ).getProject( 
).getNamespace( ).getId( ) );
         assertEquals( "", artifact.getClassifier( ) );
         assertEquals( "md5", artifact.getType( ) );
 
@@ -543,7 +543,7 @@ public class ManagedDefaultRepositoryContentTest
             .findFirst( ).get( );
         assertNotNull( artifact );
         assertEquals( BaseArtifactTypes.METADATA, artifact.getDataType( ) );
-        assertEquals( "1.3-SNAPSHOT", artifact.getVersion( ).getVersion( ) );
+        assertEquals( "1.3-SNAPSHOT", artifact.getVersion( ).getId( ) );
         assertEquals( "xml", artifact.getExtension( ) );
     }
 
@@ -920,7 +920,7 @@ public class ManagedDefaultRepositoryContentTest
         ContentItem item = result.get( 39 );
         Version version = item.adapt( Version.class );
         assertNotNull( version );
-        assertEquals( "1.3-SNAPSHOT", version.getVersion( ) );
+        assertEquals( "1.3-SNAPSHOT", version.getId( ) );
         Project project = result.get( 40 ).adapt( Project.class );
         assertNotNull( project );
         assertEquals( "axis2", project.getId( ) );
@@ -1115,11 +1115,12 @@ public class ManagedDefaultRepositoryContentTest
     }
 
     @Test
-    public void testGetNamespaceFromPath() {
+    public void testGetNamespaceFromPath() throws LayoutException
+    {
         StorageAsset path = repoContent.getRepository( ).getAsset( 
"/org/apache/axis2" );
         Namespace ns = repoContent.getNamespaceFromPath( path );
         assertNotNull( ns );
-        assertEquals( "org.apache.axis2", ns.getNamespace( ) );
+        assertEquals( "org.apache.axis2", ns.getId( ) );
 
     }
 
diff --git 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java
 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java
index 6b48247..051adde 100644
--- 
a/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java
+++ 
b/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/utils/ArtifactBuilder.java
@@ -21,11 +21,9 @@ package org.apache.archiva.rest.services.utils;
 import org.apache.archiva.maven2.model.Artifact;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.maven.model.MavenArtifactFacet;
-import org.apache.archiva.model.ArtifactReference;
 import org.apache.archiva.repository.BaseRepositoryContentLayout;
 import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.LayoutException;
-import org.apache.archiva.repository.content.ItemSelector;
 import org.apache.archiva.repository.content.base.ArchivaItemSelector;
 import org.apache.archiva.repository.storage.StorageAsset;
 import org.apache.archiva.repository.storage.util.StorageUtil;
@@ -104,7 +102,7 @@ public class ArtifactBuilder
 
         String extension = repoArtifact.getExtension();
 
-        Artifact artifact = new Artifact( repoArtifact.getVersion( 
).getProject( ).getNamespace( ).getNamespace( ), repoArtifact.getId( ), 
repoArtifact.getArtifactVersion( ) );
+        Artifact artifact = new Artifact( repoArtifact.getVersion( 
).getProject( ).getNamespace( ).getId( ), repoArtifact.getId( ), 
repoArtifact.getArtifactVersion( ) );
         artifact.setRepositoryId( artifactMetadata.getRepositoryId() );
         artifact.setClassifier( classifier );
         artifact.setPackaging( type );
diff --git 
a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
 
b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
index 093830b..8528b65 100644
--- 
a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
+++ 
b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResourceFactory.java
@@ -656,7 +656,7 @@ public class ArchivaDavResourceFactory
                         BaseRepositoryContentLayout layout = 
managedRepositoryContent.getLayout( BaseRepositoryContentLayout.class );
                         ContentItem artifactItem = 
managedRepositoryContent.toItem( resourcePath );
                         artifact = layout.adaptItem( Artifact.class, 
artifactItem );
-                        if ( !VersionUtil.isSnapshot( 
artifact.getVersion().getVersion() ) )
+                        if ( !VersionUtil.isSnapshot( 
artifact.getVersion().getId() ) )
                         {
                             // check if artifact already exists and if 
artifact re-deployment to the repository is allowed
                             if ( artifactItem.exists()

Reply via email to