Author: oching
Date: Mon Jun  7 07:40:26 2010
New Revision: 952127

URL: http://svn.apache.org/viewvc?rev=952127&view=rev
Log:
[MRM-1362] Add simple 'CRUD' pages for project-level metadata along with a 
"generic metadata" plugin 
o removed project metadata custom tag
o enable delete of generic metadata properties
o added unit tests for adding and deleting properties
o clear facet properties read from file before doing the update so that removed 
facet properties are not retained when updating project version metadata

Removed:
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/ProjectMetadataTag.java
Modified:
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/projectMetadata.jspf
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld
    
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
    
archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
    
archiva/trunk/archiva-modules/plugins/generic-metadata-support/src/main/java/org/apache/archiva/metadata/generic/GenericMetadataFacet.java
    
archiva/trunk/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
 Mon Jun  7 07:40:26 2010
@@ -24,7 +24,6 @@ import com.opensymphony.xwork2.Validatea
 import org.apache.archiva.metadata.generic.GenericMetadataFacet;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.Dependency;
-import org.apache.archiva.metadata.model.License;
 import org.apache.archiva.metadata.model.MailingList;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
@@ -57,6 +56,7 @@ import java.util.Map;
  * @plexus.component role="com.opensymphony.xwork2.Action" 
role-hint="showArtifactAction"
  *                   instantiation-strategy="per-lookup"
  */
+...@suppresswarnings( "serial" )
 public class ShowArtifactAction
     extends AbstractRepositoryBasedAction
     implements Validateable
@@ -105,13 +105,9 @@ public class ShowArtifactAction
     private Map<String, List<ArtifactDownloadInfo>> artifacts;
 
     private boolean dependencyTree = false;
-
-    private ProjectVersionMetadata projectMetadata;
-
+    
     private String deleteItem;
 
-    private String itemValue;
-
     private Map<String, String> genericMetadata;
 
     private String propertyName;
@@ -335,114 +331,69 @@ public class ShowArtifactAction
 
         genericMetadata.put( propertyName, propertyValue );
 
-        GenericMetadataFacet genericMetadataFacet = new GenericMetadataFacet();
-        genericMetadataFacet.fromProperties( genericMetadata );
-
-        // add updated facet
-        projectMetadata.addFacet( genericMetadataFacet );
-
-        metadataRepository.updateProjectVersion( repositoryId, groupId, 
artifactId, projectMetadata );
+        updateProjectMetadata( projectMetadata );
 
         projectMetadata = getProjectVersionMetadata();
 
         genericMetadata = projectMetadata.getFacet( 
GenericMetadataFacet.FACET_ID ).toProperties();
 
         model = projectMetadata;
-
+        
         propertyName = "";
         propertyValue = "";
 
         return SUCCESS;
     }
 
-    public String updateProjectMetadata()
-    {
-        metadataRepository.updateProjectVersion( repositoryId, groupId, 
artifactId, projectMetadata );
-
-        return SUCCESS;
-    }
-
     public String deleteMetadataEntry()
     {
-        projectMetadata = getProjectVersionMetadata();
-
-        if ( !StringUtils.isEmpty( deleteItem ) && !StringUtils.isEmpty( 
itemValue ) )
+        ProjectVersionMetadata projectMetadata = getProjectVersionMetadata();
+        String errorMsg = null;
+       
+        if ( projectMetadata == null )
         {
-            if ( "dependency".equals( deleteItem ) )
-            {
-                removeDependency();
-            }
-            else if ( "mailingList".equals( deleteItem ) )
-            {
-                removeMailingList();
-            }
-            else if ( "license".equals( deleteItem ) )
-            {
-                removeLicense();
-            }
-
-            deleteItem = "";
-            itemValue = "";
+            addActionError( errorMsg != null ? errorMsg : "Artifact not found" 
);
+            return ERROR;
         }
 
-        return updateProjectMetadata();
-    }
-
-    private void removeDependency()
-    {
-        List<Dependency> dependencies = projectMetadata.getDependencies();
-        List<Dependency> newDependencies = new ArrayList<Dependency>();
-
-        if ( dependencies != null )
-        {
-            for ( Dependency dependency : dependencies )
+        if ( projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ) != null 
)
+        {         
+            genericMetadata = projectMetadata.getFacet( 
GenericMetadataFacet.FACET_ID ).toProperties();
+            
+            if ( !StringUtils.isEmpty( deleteItem ) )
             {
-                if ( !StringUtils.equals( itemValue, 
dependency.getArtifactId() ) )
-                {
-                    newDependencies.add( dependency );
-                }
-            }
-        }
+                genericMetadata.remove( deleteItem );
+                
+                updateProjectMetadata( projectMetadata );
+                
+                projectMetadata = getProjectVersionMetadata();
 
-        projectMetadata.setDependencies( newDependencies );
-    }
+                genericMetadata = projectMetadata.getFacet( 
GenericMetadataFacet.FACET_ID ).toProperties();
 
-    private void removeMailingList()
-    {
-        List<MailingList> mailingLists = projectMetadata.getMailingLists();
-        List<MailingList> newMailingLists = new ArrayList<MailingList>();
+                model = projectMetadata;
 
-        if ( mailingLists != null )
-        {
-            for ( MailingList mailingList : mailingLists )
-            {
-                if ( !StringUtils.equals( itemValue, mailingList.getName() ) )
-                {
-                    newMailingLists.add( mailingList );
-                }
+                addActionMessage( "Property successfully deleted." );          
      
             }
+            
+            deleteItem = "";           
+        }
+        else
+        {
+            addActionError( errorMsg != null ? errorMsg : "No generic metadata 
facet for this artifact." );
+            return ERROR;
         }
 
-        projectMetadata.setMailingLists( newMailingLists );
+        return SUCCESS;
     }
 
-    private void removeLicense()
+    private void updateProjectMetadata( ProjectVersionMetadata projectMetadata 
)
     {
-        List<License> licenses = projectMetadata.getLicenses();
-        List<License> newLicenses = new ArrayList<License>();
-
-        if ( licenses != null )
-        {
-            for ( License license : licenses )
-            {
-                if ( !StringUtils.equals( itemValue, license.getName() ) )
-                {
-                    newLicenses.add( license );
-                }
-            }
-        }
-
-        projectMetadata.setLicenses( newLicenses );
+        GenericMetadataFacet genericMetadataFacet = new GenericMetadataFacet();
+        genericMetadataFacet.fromProperties( genericMetadata );
+        
+        projectMetadata.addFacet( genericMetadataFacet );
+        
+        metadataRepository.updateProjectVersion( repositoryId, groupId, 
artifactId, projectMetadata );        
     }
 
     @Override
@@ -538,37 +489,17 @@ public class ShowArtifactAction
     {
         return artifacts.keySet();
     }
-
-    public void setRepositoryFactory( RepositoryContentFactory 
repositoryFactory )
-    {
-        this.repositoryFactory = repositoryFactory;
-    }
-
+    
     public boolean isDependencyTree()
     {
         return dependencyTree;
     }
 
-    public ProjectVersionMetadata getProjectMetadata()
-    {
-        return projectMetadata;
-    }
-
-    public void setProjectMetadata( ProjectVersionMetadata projectMetadata )
-    {
-        this.projectMetadata = projectMetadata;
-    }
-
     public void setDeleteItem( String deleteItem )
     {
         this.deleteItem = deleteItem;
     }
 
-    public void setItemValue( String itemValue )
-    {
-        this.itemValue = itemValue;
-    }
-
     public Map<String, String> getGenericMetadata()
     {
         return genericMetadata;
@@ -598,6 +529,16 @@ public class ShowArtifactAction
     {
         this.propertyValue = propertyValue;
     }
+    
+    public void setRepositoryFactory( RepositoryContentFactory 
repositoryFactory )
+    {
+        this.repositoryFactory = repositoryFactory;
+    }
+
+    public void setMetadataRepository( MetadataRepository metadataRepository )
+    {
+        this.metadataRepository = metadataRepository;
+    }
 
     // TODO: move this into the artifact metadata itself via facets where 
necessary
 

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
 Mon Jun  7 07:40:26 2010
@@ -228,10 +228,8 @@
     </action>
 
     <action name="deleteMetadataEntry" class="showArtifactAction" 
method="deleteMetadataEntry">
-      <result name="success" type="redirect-action">
-        <param name="actionName">showProjectMetadata</param>
-        <param name="namespace">/</param>
-      </result>
+      <result name="input">/WEB-INF/jsp/showArtifact.jsp</result>
+      <result name="success">/WEB-INF/jsp/showArtifact.jsp</result>
     </action>
 
   </package>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/projectMetadata.jspf
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/projectMetadata.jspf?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/projectMetadata.jspf
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/projectMetadata.jspf
 Mon Jun  7 07:40:26 2010
@@ -42,7 +42,7 @@
           </td>
           <td>
             <s:textfield name="propertyValue" size="30" required="true"/>
-          </td>
+          </td>          
           <td align="right">
             <s:submit value="Add"/>
           </td>
@@ -60,26 +60,21 @@
   
     <c:if test="${!empty genericMetadata}">
       <ul>
-        <c:forEach var="prop" items="${genericMetadata}">
-         <li>${prop.key}=${prop.value}</li> 
+        <c:forEach var="prop" items="${genericMetadata}">          
+         <c:url var="deletePropertyUrl" 
value="showProjectMetadata!deleteMetadataEntry.action">
+           <c:param name="groupId" value="${groupId}"/>
+           <c:param name="artifactId" value="${artifactId}"/>
+           <c:param name="version" value="${version}"/>
+           <c:param name="deleteItem" value="${prop.key}"/>
+          </c:url>
+         <li>${prop.key}=${prop.value} 
+           <a href="${deletePropertyUrl}">
+              <img src="<c:url value="/images/icons/delete.gif" />" 
alt="Delete" width="12" length="12"/>
+            </a>
+          </li>
         </c:forEach> 
       </ul>
     </c:if>  
-  </div>
-  
-  
-  <p>
-    <s:if test="hasActionMessages()">
-      <div id="messages">
-        <s:actionmessage/>
-      </div>
-    </s:if>
-    <s:if test="hasActionErrors()">
-      <div id="messages">
-        <s:actionerror/>
-      </div>
-    </s:if>
-  </p>
-  
-  <%-- <archiva:project-metadata object="${projectMetadata}" 
groupId="${groupId}" artifactId="${artifactId}" version="${version}" /> --%>
+  </div>  
+   
 </div>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp
 Mon Jun  7 07:40:26 2010
@@ -249,6 +249,11 @@
         <s:actionmessage />
       </div>
     </s:if>
+    <s:if test="hasActionErrors()">
+      <div id="messages">
+        <s:actionerror/>
+      </div>
+    </s:if>
   </div>
 </div>
 </body>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld
 Mon Jun  7 07:40:26 2010
@@ -110,45 +110,4 @@
 
    </tag>
    
-   <tag>
-
-      <name>project-metadata</name>
-      
<tag-class>org.apache.maven.archiva.web.tags.ProjectMetadataTag</tag-class>
-      <body-content>empty</body-content>
-      <description><![CDATA[Render the project metadata tree from the provided 
ProjectMetadataVersion object]]></description>
-
-      <attribute>
-        <name>object</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-        
-        <description><![CDATA[The Object to Render]]></description>
-      </attribute>
-
-      <attribute>
-        <name>groupId</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-        
-        <description><![CDATA[The groupId]]></description>
-      </attribute>
-      
-      <attribute>
-        <name>artifactId</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-        
-        <description><![CDATA[The artifactId]]></description>
-      </attribute>
-
-      <attribute>
-        <name>version</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-        
-        <description><![CDATA[The version]]></description>
-      </attribute>
-   
-   </tag>
-   
 </taglib>

Modified: 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
 Mon Jun  7 07:40:26 2010
@@ -27,9 +27,14 @@ import org.apache.archiva.metadata.model
 import org.apache.archiva.metadata.model.MailingList;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
+import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.file.FileMetadataRepository;
 import org.apache.archiva.metadata.repository.memory.TestMetadataResolver;
 import 
org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet;
 import org.apache.maven.archiva.common.utils.VersionUtil;
+import org.apache.maven.archiva.configuration.ArchivaConfiguration;
+import org.apache.maven.archiva.configuration.Configuration;
+import org.apache.maven.archiva.configuration.DefaultArchivaConfiguration;
 import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
 import org.apache.maven.archiva.repository.RepositoryContentFactory;
@@ -395,7 +400,62 @@ public class ShowArtifactActionTest
         assertNull( action.getMailingLists() );
         assertTrue( action.getArtifacts().isEmpty() );
     }
+    
+    public void testAddAndDeleteMetadataProperty()
+    {
+        ProjectVersionMetadata versionMetadata = createProjectModel( 
TEST_VERSION );
+        
+        metadataResolver.setProjectVersion( TEST_REPO, TEST_GROUP_ID, 
TEST_ARTIFACT_ID, versionMetadata );
+
+        setActionParameters();
+        action.setPropertyName( "foo" );
+        action.setPropertyValue( "bar" );
+        action.setRepositoryId( TEST_REPO );
 
+        String result = action.addMetadataProperty();
+
+        assertActionSuccess( action, result );
+        assertActionParameters( action );
+        
+        Map<String, String> genericMetadata = action.getGenericMetadata();
+        assertNotNull( genericMetadata.get( 
TEST_GENERIC_METADATA_PROPERTY_NAME ) );
+        assertEquals( genericMetadata.get( TEST_GENERIC_METADATA_PROPERTY_NAME 
), TEST_GENERIC_METADATA_PROPERTY_VALUE );
+        
+        assertNotNull( genericMetadata.get( "foo" ) );
+        assertEquals( "bar", genericMetadata.get( "foo" ) );
+        
+        assertEquals( TEST_REPO, action.getRepositoryId() );
+        assertNotNull( action.getModel() );
+        assertNull( action.getDependees() );
+        assertNull( action.getDependencies() );
+        assertNull( action.getMailingLists() );
+        assertTrue( action.getArtifacts().isEmpty() );  
+        
+        // test delete property
+        setActionParameters();
+        action.setDeleteItem( "foo" );
+        
+        result = action.deleteMetadataEntry();
+        
+        assertEquals( Action.SUCCESS, result );
+        assertActionParameters( action );
+        assertTrue( !action.getActionMessages().isEmpty() );
+        assertTrue( action.getActionMessages().contains( "Property 
successfully deleted." ) );
+        
+        genericMetadata = action.getGenericMetadata();
+        assertNotNull( genericMetadata.get( 
TEST_GENERIC_METADATA_PROPERTY_NAME ) );
+        assertEquals( genericMetadata.get( TEST_GENERIC_METADATA_PROPERTY_NAME 
), TEST_GENERIC_METADATA_PROPERTY_VALUE );
+        
+        assertNull( genericMetadata.get( "foo" ) );
+        
+        assertEquals( TEST_REPO, action.getRepositoryId() );
+        assertNotNull( action.getModel() );
+        assertNull( action.getDependees() );
+        assertNull( action.getDependencies() );
+        assertNull( action.getMailingLists() );
+        assertTrue( action.getArtifacts().isEmpty() );
+    }
+    
     private void assertArtifacts( List<ArtifactMetadata> expectedArtifacts,
                                   Map<String, 
List<ShowArtifactAction.ArtifactDownloadInfo>> artifactMap )
     {
@@ -575,10 +635,25 @@ public class ShowArtifactActionTest
         ManagedRepositoryConfiguration config = new 
ManagedRepositoryConfiguration();
         config.setId( TEST_REPO );
         config.setLocation( getTestFile( "target/test-repo" 
).getAbsolutePath() );
+        
         ManagedRepositoryContent content = new 
ManagedDefaultRepositoryContent();
         content.setRepository( config );
         factory.getManagedRepositoryContent( TEST_REPO );
+        
+        FileMetadataRepository metadataRepo = ( FileMetadataRepository ) 
lookup( MetadataRepository.class );
+        MockControl archivaConfigControl = MockControl.createControl( 
ArchivaConfiguration.class );
+        ArchivaConfiguration archivaConfig = (ArchivaConfiguration) 
archivaConfigControl.getMock();
+        
+        Configuration configuration = new Configuration();
+        configuration.addManagedRepository( config );
+        metadataRepo.setConfiguration( archivaConfig );
+        archivaConfig.getConfiguration();
+        
+        action.setMetadataRepository( metadataRepo );
+        
+        archivaConfigControl.setDefaultReturnValue( configuration );        
         control.setDefaultReturnValue( content );
         control.replay();
+        archivaConfigControl.replay();
     }
 }

Modified: 
archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
 (original)
+++ 
archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
 Mon Jun  7 07:40:26 2010
@@ -164,7 +164,41 @@ public abstract class AbstractMetadataRe
         metadata = repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, 
TEST_PROJECT, TEST_PROJECT_VERSION );
         assertEquals( Collections.<String>emptyList(), new ArrayList<String>( 
metadata.getFacetIds() ) );
     }
+    
+    public void 
testUpdateProjectVersionMetadataWithExistingFacetsFacetPropertyWasRemoved()
+        throws MetadataResolutionException
+    {
+        ProjectVersionMetadata metadata = new ProjectVersionMetadata();
+        metadata.setId( TEST_PROJECT_VERSION );
+        
+        Map<String, String> additionalProps = new HashMap<String,String>();
+        additionalProps.put( "deleteKey", "deleteValue" );
+        
+        MetadataFacet facet = new TestMetadataFacet( TEST_FACET_ID, "baz", 
additionalProps );
+        metadata.addFacet( facet );
+        repository.updateProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, 
TEST_PROJECT, metadata );
+
+        metadata = repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, 
TEST_PROJECT, TEST_PROJECT_VERSION );
+        assertEquals( Collections.singleton( TEST_FACET_ID ), 
metadata.getFacetIds() );
+        
+        TestMetadataFacet testFacet = (TestMetadataFacet) metadata.getFacet( 
TEST_FACET_ID );
+        Map<String, String> facetProperties = testFacet.toProperties();
+        
+        assertEquals( "deleteValue", facetProperties.get( "deleteKey" ) );
+        
+        facetProperties.remove( "deleteKey" );
+        
+        TestMetadataFacet newTestFacet = new TestMetadataFacet( TEST_FACET_ID, 
testFacet.getValue(), facetProperties );        
+        metadata.addFacet( newTestFacet );
+        
+        repository.updateProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, 
TEST_PROJECT, metadata );
 
+        metadata = repository.getProjectVersion( TEST_REPO_ID, TEST_NAMESPACE, 
TEST_PROJECT, TEST_PROJECT_VERSION );
+        assertEquals( Collections.singleton( TEST_FACET_ID ), 
metadata.getFacetIds() );
+        testFacet = (TestMetadataFacet) metadata.getFacet( TEST_FACET_ID );
+        assertFalse( testFacet.toProperties().containsKey( "deleteKey" ) );
+    }
+    
     public void testUpdateArtifactMetadataWithExistingFacets()
     {
         ArtifactMetadata metadata = createArtifact();
@@ -313,7 +347,7 @@ public abstract class AbstractMetadataRe
     {
         repository.removeMetadataFacet( TEST_REPO_ID, UNKNOWN, TEST_NAME );
     }
-
+        
     public void testGetArtifacts()
     {
         ArtifactMetadata artifact1 = createArtifact();
@@ -613,6 +647,10 @@ public abstract class AbstractMetadataRe
         implements MetadataFacet
     {
         private String testFacetId;
+        
+        private Map<String, String> additionalProps;        
+
+        private String value;
 
         private TestMetadataFacet( String value )
         {
@@ -625,8 +663,12 @@ public abstract class AbstractMetadataRe
             this.value = value;
             testFacetId = facetId;
         }
-
-        private String value;
+        
+        private TestMetadataFacet( String facetId, String value, Map<String, 
String> additionalProps )
+        {
+            this( facetId, value );
+            this.additionalProps = additionalProps;            
+        }
 
         public String getFacetId()
         {
@@ -639,10 +681,24 @@ public abstract class AbstractMetadataRe
         }
 
         public Map<String, String> toProperties()
-        {
+        {            
             if ( value != null )
             {
-                return Collections.singletonMap( "foo", value );
+                if( additionalProps == null )
+                {
+                    return Collections.singletonMap( "foo", value );
+                }
+                else
+                {
+                    Map<String, String> props = new HashMap<String, String>();
+                    props.put( "foo", value );
+                    
+                    for( String key : additionalProps.keySet() )
+                    {
+                        props.put( key, additionalProps.get( key ) );
+                    }
+                    return props;
+                }
             }
             else
             {
@@ -657,13 +713,25 @@ public abstract class AbstractMetadataRe
             {
                 this.value = value;
             }
+               
+            properties.remove( "foo" );
+            
+            if( additionalProps == null )
+            {
+                additionalProps = new HashMap<String, String>();
+            }
+            
+            for( String key: properties.keySet() )
+            {
+                additionalProps.put( key, properties.get( key ) );
+            }
         }
 
         public String getValue()
         {
             return value;
         }
-
+        
         @Override
         public String toString()
         {

Modified: 
archiva/trunk/archiva-modules/plugins/generic-metadata-support/src/main/java/org/apache/archiva/metadata/generic/GenericMetadataFacet.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/plugins/generic-metadata-support/src/main/java/org/apache/archiva/metadata/generic/GenericMetadataFacet.java?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/plugins/generic-metadata-support/src/main/java/org/apache/archiva/metadata/generic/GenericMetadataFacet.java
 (original)
+++ 
archiva/trunk/archiva-modules/plugins/generic-metadata-support/src/main/java/org/apache/archiva/metadata/generic/GenericMetadataFacet.java
 Mon Jun  7 07:40:26 2010
@@ -19,7 +19,6 @@ package org.apache.archiva.metadata.gene
  * under the License.
  */
 
-import java.util.HashMap;
 import java.util.Map;
 import java.util.TreeMap;
 

Modified: 
archiva/trunk/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
URL: 
http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java?rev=952127&r1=952126&r2=952127&view=diff
==============================================================================
--- 
archiva/trunk/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
 (original)
+++ 
archiva/trunk/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
 Mon Jun  7 07:40:26 2010
@@ -140,6 +140,9 @@ public class FileMetadataRepository
             {
                 properties.remove( name );
             }
+            
+            // clear the facet contents so old properties are no longer written
+            clearMetadataFacetProperties( versionMetadata, properties );
         }
         properties.setProperty( "id", versionMetadata.getId() );
         setProperty( properties, "name", versionMetadata.getName() );
@@ -224,6 +227,27 @@ public class FileMetadataRepository
             }
         }
     }
+    
+    private void clearMetadataFacetProperties( ProjectVersionMetadata 
versionMetadata, Properties properties )
+    {
+        List<Object> propsToRemove = new ArrayList<Object>();
+        for ( MetadataFacet facet : versionMetadata.getFacetList() )
+        {
+            for ( Object key : properties.keySet() )
+            {
+                String keyString = ( String ) key;
+                if( keyString.startsWith( facet.getFacetId() + ":" ) )
+                {
+                    propsToRemove.add( key );
+                }
+            }
+        }
+        
+        for( Object key : propsToRemove )
+        {
+            properties.remove( key );
+        }
+    }
 
     public void updateProjectReference( String repoId, String namespace, 
String projectId, String projectVersion,
                                         ProjectVersionReference reference )


Reply via email to