Adding content item implementations
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaContentItem.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaContentItem.java
index b538bb1..3b89a04 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaContentItem.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaContentItem.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-import org.apache.archiva.repository.UnsupportedConversionException;
 import org.apache.archiva.repository.content.ContentItem;
 import org.apache.archiva.repository.content.Project;
 import org.apache.commons.lang3.StringUtils;
@@ -40,10 +39,14 @@
     private Map<String, String> attributes;
 
     @Override
-    public abstract  <T extends Project> T adapt( Class<T> clazz ) throws UnsupportedConversionException;
+    public <T extends Project> T adapt( Class<T> clazz ) {
+        return (T)this;
+    }
 
     @Override
-    public abstract <T extends Project> boolean supports( Class<T> clazz );
+    public <T extends Project> boolean supports( Class<T> clazz ) {
+        return clazz != null && clazz.isAssignableFrom( this.getClass() );
+    }
 
 
     /**
diff --git a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaProject.java b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaProject.java
index b2879b6..37e0474 100644
--- a/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaProject.java
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaProject.java
@@ -19,60 +19,133 @@
  * under the License.
  */
 
-import org.apache.archiva.repository.RepositoryContent;
-import org.apache.archiva.repository.UnsupportedConversionException;
+import org.apache.archiva.repository.ManagedRepositoryContent;
 import org.apache.archiva.repository.content.Project;
-
-import java.util.Map;
+import org.apache.archiva.repository.storage.StorageAsset;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * Immutable class, that represents a project.
  */
 public class ArchivaProject extends ArchivaContentItem implements Project
 {
-    String namespace;
-    String id;
-    RepositoryContent repositoryContent;
-    Map<String, String> attributes;
+    private String namespace;
+    private String id;
+    private ManagedRepositoryContent repositoryContent;
+    private StorageAsset asset;
+
+    // Setting all setters to private. Builder is the way to go.
+    private ArchivaProject() {
+
+    }
+
+
+    /**
+     * Creates the builder that allows to create a new instance.
+     * @param id the project id, must not be <code>null</code>
+     * @return a builder instance
+     */
+    public static Builder withId( String id) {
+        return new Builder( ).withId( id );
+    }
 
 
     @Override
     public String getNamespace( )
     {
-        return null;
+        return this.namespace;
     }
 
     @Override
     public String getId( )
     {
-        return null;
+        return this.id;
     }
 
     @Override
-    public RepositoryContent getRepository( )
+    public ManagedRepositoryContent getRepository( )
     {
-        return null;
+        return this.repositoryContent;
     }
 
     @Override
-    public Map<String, String> getAttributes( )
+    public StorageAsset getAsset( )
     {
-        return null;
+        return asset;
     }
 
-    @Override
-    public <T extends Project> T adapt( Class<T> clazz ) throws UnsupportedConversionException
+
+
+    /*
+     * Builder interface chaining is used to restrict mandatory attributes
+     * This interface is for the optional arguments.
+     */
+    public interface OptBuilder {
+
+        OptBuilder withAsset( StorageAsset asset );
+
+        OptBuilder withNamespace( String namespace);
+
+        OptBuilder withAttribute( String key, String value );
+
+    }
+    /*
+     * Builder classes for instantiation
+     */
+    public static final class Builder implements OptBuilder
     {
-        if (clazz != ArchivaProject.class) {
-            throw new UnsupportedConversionException( "Cannot convert to class: " + clazz );
-        } else {
-            return (T) this;
+        final private ArchivaProject project = new ArchivaProject();
+
+        private Builder( )
+        {
+
+        }
+
+        private Builder withId(String id) {
+            if ( StringUtils.isEmpty( id ) ) {
+                throw new IllegalArgumentException( "Null or empty value not allowed for id" );
+            }
+            project.id = id;
+            return this;
+        }
+
+
+        public OptBuilder withRepository( ManagedRepositoryContent repository ) {
+            project.repositoryContent = repository;
+            return this;
+        }
+
+        @Override
+        public OptBuilder withAsset( StorageAsset asset )
+        {
+            project.asset = asset;
+            return this;
+        }
+
+        public OptBuilder withNamespace( String namespace) {
+            if (namespace==null) {
+                throw new IllegalArgumentException( "Null value not allowed for namespace" );
+            }
+            project.namespace = namespace;
+            return this;
+        }
+
+        public OptBuilder withAttribute( String key, String value) {
+            project.putAttribute( key, value );
+            return this;
+        }
+
+        ArchivaProject build() {
+            if (project.namespace==null) {
+                project.namespace = "";
+            }
+            if (project.asset == null) {
+                project.asset = project.getRepository( ).getRepository( ).getAsset( "" );
+            }
+            return project;
         }
     }
 
-    @Override
-    public <T extends Project> boolean supports( Class<T> clazz )
-    {
-        return false;
-    }
+
+
 }
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
new file mode 100644
index 0000000..194f071
--- /dev/null
+++ b/archiva-modules/archiva-base/archiva-repository-layer/src/main/java/org/apache/archiva/repository/content/base/ArchivaVersion.java
@@ -0,0 +1,104 @@
+package org.apache.archiva.repository.content.base;
+
+/*
+ * 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.Project;
+import org.apache.archiva.repository.content.Version;
+import org.apache.archiva.repository.storage.StorageAsset;
+import org.apache.commons.lang3.StringUtils;
+
+public class ArchivaVersion extends ArchivaContentItem implements Version
+{
+
+    private String version;
+    private StorageAsset asset;
+    private Project project;
+
+    private ArchivaVersion() {
+
+    }
+
+    public static ProjectBuilder withVersion(String version) {
+        return new Builder( ).withVersion( version );
+    }
+
+    @Override
+    public String getVersion( )
+    {
+        return version;
+    }
+
+    @Override
+    public StorageAsset getAsset( )
+    {
+        return asset;
+    }
+
+    @Override
+    public Project getProject( )
+    {
+        return project;
+    }
+
+    public interface ProjectBuilder {
+        Builder withProject( Project project );
+    }
+
+    public static final class Builder implements ProjectBuilder {
+
+        private ArchivaVersion version  = new ArchivaVersion();
+
+        ProjectBuilder withVersion( String version )
+        {
+            if ( StringUtils.isEmpty( version ) ) {
+                throw new IllegalArgumentException( "Version parameter must not be empty or null." );
+            }
+            this.version.version = version;
+            return this;
+        }
+
+
+        @Override
+        public Builder withProject( Project project )
+        {
+            this.version.project = project;
+            return this;
+        }
+
+        public Builder withAsset( StorageAsset asset )
+        {
+            this.version.asset = asset;
+            return this;
+        }
+
+        public Builder withAttribute(String key, String value) {
+            this.version.putAttribute( key, value );
+            return this;
+        }
+
+        public ArchivaVersion build() {
+            if (this.version.asset == null) {
+                this.version.project.getRepository( ).getRepository( ).getAsset( "" );
+            }
+            return this.version;
+        }
+    }
+
+}