Author: brett
Date: Fri Nov 27 13:09:04 2009
New Revision: 884866
URL: http://svn.apache.org/viewvc?rev=884866&view=rev
Log:
[MRM-1283] moved first part of browse() functionality over to metadata
repository
Added:
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
(with props)
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionMetadata.java
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/pom.xml
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
Fri Nov 27 13:09:04 2009
@@ -19,9 +19,14 @@
* under the License.
*/
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
+import org.apache.archiva.metadata.repository.MetadataResolver;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
@@ -39,7 +44,6 @@
*
* @todo cache browsing results.
* @todo implement repository selectors (all or specific repository)
- * @todo implement security around browse (based on repository id at first)
* @plexus.component role="com.opensymphony.xwork2.Action"
role-hint="browseAction" instantiation-strategy="per-lookup"
*/
public class BrowseAction
@@ -49,22 +53,29 @@
* @plexus.requirement role-hint="default"
*/
private RepositoryBrowsing repoBrowsing;
-
+
+ /**
+ * @plexus.requirement
+ */
+ private MetadataResolver metadataResolver;
+
/**
* @plexus.requirement
*/
private UserRepositories userRepositories;
-
+
+ // TODO: eventually, move to just use the metadata directly, with minimal
JSP changes
private BrowsingResults results;
private String groupId;
private String artifactId;
-
+
private String repositoryId;
-
+
+ // TODO: eventually, move to just use the metadata directly, with minimal
JSP changes, mostly for Maven specifics
private ArchivaProjectModel sharedModel;
-
+
public String browse()
{
List<String> selectedRepos = getObservableRepos();
@@ -73,10 +84,49 @@
return GlobalResults.ACCESS_TO_NO_REPOS;
}
- this.results = repoBrowsing.getRoot( getPrincipal(), selectedRepos );
+ Set<String> namespaces = new LinkedHashSet<String>();
+ for ( String repoId : selectedRepos )
+ {
+ Collection<String> rootNamespaces =
metadataResolver.getRootNamespaces( repoId );
+ // TODO: this logic should be optional, particularly remembering
we want to keep this code simple
+ // it is located here to avoid the content repository
implementation needing to do too much for what
+ // is essentially presentation code
+ for ( String n : rootNamespaces )
+ {
+ // TODO: check performance of this
+ namespaces.add( collapseNamespaces( repoId, n ) );
+ }
+ }
+ ArrayList<String> list = new ArrayList<String>( namespaces );
+ Collections.sort( list );
+
+ this.results = new BrowsingResults();
+ results.setGroupIds( list );
+ results.setSelectedRepositoryIds( selectedRepos );
return SUCCESS;
}
+ private String collapseNamespaces( String repoId, String n )
+ {
+ Collection<String> subNamespaces = metadataResolver.getNamespaces(
repoId, n );
+ if ( subNamespaces.size() != 1 )
+ {
+ return n;
+ }
+ else
+ {
+ Collection<String> projects = metadataResolver.getProjects(
repoId, n );
+ if ( projects != null && !projects.isEmpty() )
+ {
+ return n;
+ }
+ else
+ {
+ return collapseNamespaces( repoId, n + "." +
subNamespaces.iterator().next() );
+ }
+ }
+ }
+
public String browseGroup()
{
if ( StringUtils.isEmpty( groupId ) )
@@ -92,7 +142,6 @@
return GlobalResults.ACCESS_TO_NO_REPOS;
}
-
this.results = repoBrowsing.selectGroupId( getPrincipal(),
selectedRepos, groupId );
return SUCCESS;
}
@@ -118,11 +167,11 @@
{
return GlobalResults.ACCESS_TO_NO_REPOS;
}
-
+
this.results = repoBrowsing.selectArtifactId( getPrincipal(),
selectedRepos, groupId, artifactId );
populateSharedModel();
-
+
return SUCCESS;
}
@@ -132,20 +181,20 @@
sharedModel.setGroupId( groupId );
sharedModel.setArtifactId( artifactId );
boolean isFirstVersion = true;
-
- for( String version : this.results.getVersions() )
- {
+
+ for ( String version : this.results.getVersions() )
+ {
try
{
ArchivaProjectModel model =
repoBrowsing.selectVersion( getPrincipal(),
getObservableRepos(), groupId, artifactId, version );
-
- if( model == null )
+
+ if ( model == null )
{
continue;
}
-
- if( isFirstVersion )
+
+ if ( isFirstVersion )
{
sharedModel = model;
sharedModel.setVersion( null );
@@ -157,7 +206,7 @@
{
sharedModel.setPackaging( null );
}
-
+
if ( sharedModel.getName() != null &&
!StringUtils.equalsIgnoreCase( sharedModel.getName(),
model.getName() ) )
{
@@ -171,29 +220,33 @@
}
if ( sharedModel.getIssueManagement() != null &&
model.getIssueManagement() != null &&
- !StringUtils.equalsIgnoreCase(
sharedModel.getIssueManagement().getIssueManagementUrl(),
model.getIssueManagement().getIssueManagementUrl() ) )
+ !StringUtils.equalsIgnoreCase(
sharedModel.getIssueManagement().getIssueManagementUrl(),
+
model.getIssueManagement().getIssueManagementUrl() ) )
{
sharedModel.setIssueManagement( null );
}
if ( sharedModel.getCiManagement() != null &&
model.getCiManagement() != null &&
- !StringUtils.equalsIgnoreCase(
sharedModel.getCiManagement().getCiUrl(), model.getCiManagement().getCiUrl() ) )
+ !StringUtils.equalsIgnoreCase(
sharedModel.getCiManagement().getCiUrl(),
+
model.getCiManagement().getCiUrl() ) )
{
sharedModel.setCiManagement( null );
}
- if ( sharedModel.getOrganization() != null &&
model.getOrganization() != null &&
- !StringUtils.equalsIgnoreCase(
sharedModel.getOrganization().getOrganizationName(),
model.getOrganization().getOrganizationName() ) )
+ if ( sharedModel.getOrganization() != null &&
model.getOrganization() != null &&
+ !StringUtils.equalsIgnoreCase(
sharedModel.getOrganization().getOrganizationName(),
+
model.getOrganization().getOrganizationName() ) )
{
sharedModel.setOrganization( null );
}
- if ( sharedModel.getUrl() != null &&
!StringUtils.equalsIgnoreCase( sharedModel.getUrl(), model.getUrl() ) )
+ if ( sharedModel.getUrl() != null &&
+ !StringUtils.equalsIgnoreCase( sharedModel.getUrl(),
model.getUrl() ) )
{
sharedModel.setUrl( null );
}
}
-
+
isFirstVersion = false;
}
catch ( ObjectNotFoundException e )
@@ -204,9 +257,9 @@
{
log.debug( e.getMessage(), e );
}
- }
+ }
}
-
+
private List<String> getObservableRepos()
{
try
@@ -253,15 +306,17 @@
{
return results;
}
-
- public String getRepositoryId(){
-
- return repositoryId;
- }
-
- public void setRepositoryId(String repositoryId){
-
- this.repositoryId = repositoryId;
+
+ public String getRepositoryId()
+ {
+
+ return repositoryId;
+ }
+
+ public void setRepositoryId( String repositoryId )
+ {
+
+ this.repositoryId = repositoryId;
}
public ArchivaProjectModel getSharedModel()
@@ -273,4 +328,9 @@
{
this.sharedModel = sharedModel;
}
+
+ public MetadataResolver getMetadataResolver()
+ {
+ return metadataResolver;
+ }
}
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
Fri Nov 27 13:09:04 2009
@@ -22,8 +22,10 @@
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.apache.archiva.metadata.model.ProjectMetadata;
import org.apache.archiva.metadata.model.ProjectVersionMetadata;
@@ -40,6 +42,10 @@
private Map<String, List<ProjectVersionReference>> references =
new HashMap<String, List<ProjectVersionReference>>();
+ private List<String> namespaces;
+
+ private Map<String, Collection<String>> projectsInNamespace = new
HashMap<String, Collection<String>>();
+
public ProjectMetadata getProject( String repoId, String namespace, String
projectId )
{
ProjectMetadata metadata = new ProjectMetadata();
@@ -67,10 +73,54 @@
return references.get( createMapKey( repoId, namespace, projectId,
projectVersion ) );
}
+ public Collection<String> getRootNamespaces( String repoId )
+ {
+ return getNamespaces( null );
+ }
+
+ private Collection<String> getNamespaces( String baseNamespace )
+ {
+ Set<String> namespaces = new LinkedHashSet<String>();
+ int fromIndex = baseNamespace != null ? baseNamespace.length() + 1 : 0;
+ for ( String namespace : this.namespaces )
+ {
+ if ( baseNamespace == null || namespace.startsWith( baseNamespace
+ "." ) )
+ {
+ int i = namespace.indexOf( '.', fromIndex );
+ if ( i >= 0 )
+ {
+ namespaces.add( namespace.substring( fromIndex, i ) );
+ }
+ else
+ {
+ namespaces.add( namespace.substring( fromIndex ) );
+ }
+ }
+ }
+ return namespaces;
+ }
+
+ public Collection<String> getNamespaces( String repoId, String namespace )
+ {
+ return getNamespaces( namespace );
+ }
+
+ public Collection<String> getProjects( String repoId, String namespace )
+ {
+ return projectsInNamespace.get( namespace );
+ }
+
public void setProjectVersion( String repoId, String namespace, String
projectId,
ProjectVersionMetadata versionMetadata )
{
projectVersions.put( createMapKey( repoId, namespace, projectId,
versionMetadata.getId() ), versionMetadata );
+ Collection<String> projects = projectsInNamespace.get( namespace );
+ if ( projects == null )
+ {
+ projects = new LinkedHashSet<String>();
+ projectsInNamespace.put( namespace, projects );
+ }
+ projects.add( projectId );
}
public void setArtifactVersions( String repoId, String namespace, String
projectId, String projectVersion,
@@ -89,4 +139,9 @@
{
this.references.put( createMapKey( repoId, namespace, projectId,
projectVersion ), references );
}
+
+ public void setNamespaces( List<String> namespaces )
+ {
+ this.namespaces = namespaces;
+ }
}
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java
Fri Nov 27 13:09:04 2009
@@ -24,6 +24,8 @@
import java.util.List;
import com.opensymphony.xwork2.Action;
+import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.repository.memory.TestMetadataResolver;
import org.apache.maven.archiva.database.ArchivaDAO;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
import org.apache.maven.archiva.database.ArtifactDAO;
@@ -52,7 +54,8 @@
private ArchivaDAOStub archivaDao;
private static final List<String> GROUPS =
- Arrays.asList( "org.apache.archiva", "commons-lang",
"org.apache.maven", "com.sun", "com.oracle" );
+ Arrays.asList( "org.apache.archiva", "commons-lang",
"org.apache.maven", "com.sun", "com.oracle",
+ "repeat.repeat", "org.apache", "single.group" );
public void testInstantiation()
{
@@ -61,7 +64,9 @@
public void testBrowse()
{
- archivaDao.setGroups( GROUPS );
+ metadataResolver.setNamespaces( GROUPS );
+ // add an artifact in the tree to make sure "single" is not collapsed
+ metadataResolver.setProjectVersion( TEST_REPO, "single", "single", new
ProjectVersionMetadata() );
String result = action.browse();
assertSuccessResult( result );
@@ -69,7 +74,8 @@
BrowsingResults results = action.getResults();
assertNotNull( results );
assertEquals( Arrays.asList( TEST_REPO ),
results.getSelectedRepositoryIds() );
- assertEquals( Arrays.asList( "com", "commons-lang", "org.apache" ),
results.getGroupIds() );
+ assertEquals( Arrays.asList( "com", "commons-lang", "org.apache",
"repeat.repeat", "single" ),
+ results.getGroupIds() );
assertNull( results.getArtifacts() );
assertNull( results.getSelectedArtifactId() );
assertNull( results.getSelectedGroupId() );
@@ -390,6 +396,7 @@
super.setUp();
action = (BrowseAction) lookup( Action.class, ACTION_HINT );
archivaDao = (ArchivaDAOStub) lookup( ArchivaDAO.class, "jdo" );
+ metadataResolver = (TestMetadataResolver) action.getMetadataResolver();
}
protected ArchivaProjectModel createProjectModel( String groupId, String
artifactId, String version )
Modified:
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml
(original)
+++
archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/resources/org/apache/maven/archiva/web/action/BrowseActionTest.xml
Fri Nov 27 13:09:04 2009
@@ -35,5 +35,11 @@
<role-hint>default</role-hint>
<implementation>org.apache.maven.archiva.security.UserRepositoriesStub</implementation>
</component>
+ <component>
+ <role>org.apache.archiva.metadata.repository.MetadataResolver</role>
+ <role-hint>default</role-hint>
+
<implementation>org.apache.archiva.metadata.repository.memory.TestMetadataResolver</implementation>
+ <instantiation-strategy>per-lookup</instantiation-strategy>
+ </component>
</components>
</plexus>
Modified:
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionMetadata.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionMetadata.java?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionMetadata.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-model/src/main/java/org/apache/archiva/metadata/model/ProjectVersionMetadata.java
Fri Nov 27 13:09:04 2009
@@ -43,13 +43,13 @@
private CiManagement ciManagement;
- private List<License> licenses;
+ private List<License> licenses = new ArrayList<License>();
private Map<String, ProjectVersionFacet> facets = new HashMap<String,
ProjectVersionFacet>();
- private List<MailingList> mailingLists;
+ private List<MailingList> mailingLists = new ArrayList<MailingList>();
- private List<Dependency> dependencies;
+ private List<Dependency> dependencies = new ArrayList<Dependency>();
public String getId()
{
@@ -143,10 +143,6 @@
public void addLicense( License license )
{
- if ( this.licenses == null )
- {
- this.licenses = new ArrayList<License>();
- }
this.licenses.add( license );
}
@@ -182,10 +178,6 @@
public void addMailingList( MailingList mailingList )
{
- if ( this.mailingLists == null )
- {
- this.mailingLists = new ArrayList<MailingList>();
- }
this.mailingLists.add( mailingList );
}
@@ -201,10 +193,6 @@
public void addDependency( Dependency dependency )
{
- if ( this.dependencies == null )
- {
- this.dependencies = new ArrayList<Dependency>();
- }
this.dependencies.add( dependency );
}
}
Modified:
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
Fri Nov 27 13:09:04 2009
@@ -101,4 +101,25 @@
// not passed to the storage mechanism as resolving references would
require iterating all artifacts
return metadataRepository.getProjectReferences( repoId, namespace,
projectId, projectVersion );
}
+
+ public Collection<String> getRootNamespaces( String repoId )
+ {
+ // TODO: is this assumption correct? could a storage mech. actually
know all references in a non-Maven scenario?
+ // not passed to the storage mechanism as resolving references would
require iterating all groups
+ return metadataRepository.getRootNamespaces( repoId );
+ }
+
+ public Collection<String> getNamespaces( String repoId, String namespace )
+ {
+ // TODO: is this assumption correct? could a storage mech. actually
know all references in a non-Maven scenario?
+ // not passed to the storage mechanism as resolving references would
require iterating all groups
+ return metadataRepository.getNamespaces( repoId, namespace );
+ }
+
+ public Collection<String> getProjects( String repoId, String namespace )
+ {
+ // TODO: is this assumption correct? could a storage mech. actually
know all references in a non-Maven scenario?
+ // not passed to the storage mechanism as resolving references would
require iterating all projects
+ return metadataRepository.getProjects( repoId, namespace );
+ }
}
Modified:
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
Fri Nov 27 13:09:04 2009
@@ -47,4 +47,10 @@
*/
Collection<ProjectVersionReference> getProjectReferences( String repoId,
String namespace, String projectId,
String
projectVersion );
+
+ Collection<String> getRootNamespaces( String repoId );
+
+ Collection<String> getNamespaces( String repoId, String namespace );
+
+ Collection<String> getProjects( String repoId, String namespace );
}
Modified:
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
Fri Nov 27 13:09:04 2009
@@ -281,4 +281,19 @@
{
throw new UnsupportedOperationException();
}
+
+ public Collection<String> getRootNamespaces( String repoId )
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public List<String> getNamespaces( String repoId, String namespace )
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public Collection<String> getProjects( String repoId, String namespace )
+ {
+ throw new UnsupportedOperationException();
+ }
}
Modified:
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/pom.xml
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/pom.xml?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/pom.xml
(original)
+++
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/pom.xml
Fri Nov 27 13:09:04 2009
@@ -40,5 +40,20 @@
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging-api</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-spring</artifactId>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
Modified:
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java?rev=884866&r1=884865&r2=884866&view=diff
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
(original)
+++
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/main/java/org/apache/archiva/metadata/repository/file/FileMetadataRepository.java
Fri Nov 27 13:09:04 2009
@@ -28,9 +28,11 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import org.apache.archiva.metadata.model.ArtifactMetadata;
import org.apache.archiva.metadata.model.CiManagement;
@@ -70,17 +72,30 @@
private static final Logger log = LoggerFactory.getLogger(
FileMetadataRepository.class );
+ private static final String PROJECT_METADATA_KEY = "project-metadata";
+
+ private static final String PROJECT_VERSION_METADATA_KEY =
"version-metadata";
+
+ private static final String NAMESPACE_METADATA_KEY = "namespace-metadata";
+
public void updateProject( String repoId, ProjectMetadata project )
{
+ updateProject( repoId, project.getNamespace(), project.getId() );
+ }
+
+ private void updateProject( String repoId, String namespace, String id )
+ {
// TODO: this is a more braindead implementation than we would
normally expect, for prototyping purposes
try
{
- File projectDirectory =
- new File( this.directory, repoId + "/" +
project.getNamespace() + "/" + project.getId() );
+ File namespaceDirectory = new File( this.directory, repoId + "/" +
namespace );
Properties properties = new Properties();
- properties.setProperty( "namespace", project.getNamespace() );
- properties.setProperty( "id", project.getId() );
- writeProperties( properties, projectDirectory );
+ properties.setProperty( "namespace", namespace );
+ writeProperties( properties, namespaceDirectory,
NAMESPACE_METADATA_KEY );
+
+ properties.setProperty( "id", id );
+ writeProperties( properties, new File( namespaceDirectory, id ),
PROJECT_METADATA_KEY );
+
}
catch ( IOException e )
{
@@ -92,10 +107,12 @@
public void updateProjectVersion( String repoId, String namespace, String
projectId,
ProjectVersionMetadata versionMetadata )
{
+ updateProject( repoId, namespace, projectId );
+
File directory =
new File( this.directory, repoId + "/" + namespace + "/" +
projectId + "/" + versionMetadata.getId() );
- Properties properties = readProperties( directory );
+ Properties properties = readProperties( directory,
PROJECT_VERSION_METADATA_KEY );
// remove properties that are not references or artifacts
for ( String name : properties.stringPropertyNames() )
{
@@ -167,7 +184,7 @@
try
{
- writeProperties( properties, directory );
+ writeProperties( properties, directory,
PROJECT_VERSION_METADATA_KEY );
}
catch ( IOException e )
{
@@ -181,7 +198,7 @@
{
File directory = new File( this.directory, repoId + "/" + namespace +
"/" + projectId + "/" + projectVersion );
- Properties properties = readProperties( directory );
+ Properties properties = readProperties( directory,
PROJECT_VERSION_METADATA_KEY );
int i = Integer.valueOf( properties.getProperty(
"ref:lastReferenceNum", "-1" ) ) + 1;
setProperty( properties, "ref:lastReferenceNum", Integer.toString( i )
);
setProperty( properties, "ref:reference." + i + ".namespace",
reference.getNamespace() );
@@ -191,7 +208,7 @@
try
{
- writeProperties( properties, directory );
+ writeProperties( properties, directory,
PROJECT_VERSION_METADATA_KEY );
}
catch ( IOException e )
{
@@ -202,13 +219,17 @@
private String join( Collection<String> ids )
{
- StringBuilder s = new StringBuilder();
- for ( String id : ids )
+ if ( !ids.isEmpty() )
{
- s.append( id );
- s.append( "," );
+ StringBuilder s = new StringBuilder();
+ for ( String id : ids )
+ {
+ s.append( id );
+ s.append( "," );
+ }
+ return s.substring( 0, s.length() - 1 );
}
- return s.substring( 0, s.length() - 1 );
+ return "";
}
private void setProperty( Properties properties, String name, String value
)
@@ -224,7 +245,7 @@
{
File directory = new File( this.directory, repoId + "/" + namespace +
"/" + projectId + "/" + projectVersion );
- Properties properties = readProperties( directory );
+ Properties properties = readProperties( directory,
PROJECT_VERSION_METADATA_KEY );
properties.setProperty( "artifact:updated:" + artifact.getId(),
Long.toString( artifact.getUpdated().getTime()
) );
@@ -233,7 +254,7 @@
try
{
- writeProperties( properties, directory );
+ writeProperties( properties, directory,
PROJECT_VERSION_METADATA_KEY );
}
catch ( IOException e )
{
@@ -242,13 +263,13 @@
}
}
- private Properties readProperties( File directory )
+ private Properties readProperties( File directory, String propertiesKey )
{
Properties properties = new Properties();
FileInputStream in = null;
try
{
- in = new FileInputStream( new File( directory,
"metadata.properties" ) );
+ in = new FileInputStream( new File( directory, propertiesKey +
".properties" ) );
properties.load( in );
}
catch ( FileNotFoundException e )
@@ -271,7 +292,7 @@
{
File directory = new File( this.directory, repoId + "/" + namespace +
"/" + projectId );
- Properties properties = readProperties( directory );
+ Properties properties = readProperties( directory,
PROJECT_VERSION_METADATA_KEY );
ProjectMetadata project = new ProjectMetadata();
project.setNamespace( properties.getProperty( "namespace" ) );
@@ -284,7 +305,7 @@
{
File directory = new File( this.directory, repoId + "/" + namespace +
"/" + projectId + "/" + projectVersion );
- Properties properties = readProperties( directory );
+ Properties properties = readProperties( directory,
PROJECT_VERSION_METADATA_KEY );
String id = properties.getProperty( "id" );
ProjectVersionMetadata versionMetadata = null;
if ( id != null )
@@ -443,7 +464,7 @@
{
File directory = new File( this.directory, repoId + "/" + namespace +
"/" + projectId + "/" + projectVersion );
- Properties properties = readProperties( directory );
+ Properties properties = readProperties( directory,
PROJECT_VERSION_METADATA_KEY );
List<String> versions = new ArrayList<String>();
for ( Map.Entry entry : properties.entrySet() )
@@ -462,7 +483,7 @@
{
File directory = new File( this.directory, repoId + "/" + namespace +
"/" + projectId + "/" + projectVersion );
- Properties properties = readProperties( directory );
+ Properties properties = readProperties( directory,
PROJECT_VERSION_METADATA_KEY );
int numberOfRefs = Integer.valueOf( properties.getProperty(
"ref:lastReferenceNum", "-1" ) ) + 1;
List<ProjectVersionReference> references = new
ArrayList<ProjectVersionReference>();
@@ -479,11 +500,70 @@
return references;
}
- private void writeProperties( Properties properties, File directory )
+ public Collection<String> getRootNamespaces( String repoId )
+ {
+ return getNamespaces( repoId, null );
+ }
+
+ public Collection<String> getNamespaces( String repoId, String
baseNamespace )
+ {
+ List<String> allNamespaces = new ArrayList<String>();
+ File directory = new File( this.directory, repoId );
+ File[] files = directory.listFiles();
+ if ( files != null )
+ {
+ for ( File namespace : files )
+ {
+ if ( new File( namespace, NAMESPACE_METADATA_KEY +
".properties" ).exists() )
+ {
+ allNamespaces.add( namespace.getName() );
+ }
+ }
+ }
+
+ Set<String> namespaces = new LinkedHashSet<String>();
+ int fromIndex = baseNamespace != null ? baseNamespace.length() + 1 : 0;
+ for ( String namespace : allNamespaces )
+ {
+ if ( baseNamespace == null || namespace.startsWith( baseNamespace
+ "." ) )
+ {
+ int i = namespace.indexOf( '.', fromIndex );
+ if ( i >= 0 )
+ {
+ namespaces.add( namespace.substring( fromIndex, i ) );
+ }
+ else
+ {
+ namespaces.add( namespace.substring( fromIndex ) );
+ }
+ }
+ }
+ return new ArrayList<String>( namespaces );
+ }
+
+ public Collection<String> getProjects( String repoId, String namespace )
+ {
+ List<String> projects = new ArrayList<String>();
+ File directory = new File( this.directory, repoId + "/" + namespace );
+ File[] files = directory.listFiles();
+ if ( files != null )
+ {
+ for ( File project : files )
+ {
+ if ( new File( project, PROJECT_METADATA_KEY + ".properties"
).exists() )
+ {
+ projects.add( project.getName() );
+ }
+ }
+ }
+ return projects;
+ }
+
+ private void writeProperties( Properties properties, File directory,
String propertiesKey )
throws IOException
{
directory.mkdirs();
- FileOutputStream os = new FileOutputStream( new File( directory,
"metadata.properties" ) );
+ FileOutputStream os = new FileOutputStream( new File( directory,
propertiesKey + ".properties" ) );
try
{
properties.store( os, null );
@@ -494,4 +574,8 @@
}
}
+ public void setDirectory( File directory )
+ {
+ this.directory = directory;
+ }
}
Added:
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
URL:
http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java?rev=884866&view=auto
==============================================================================
---
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
(added)
+++
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
Fri Nov 27 13:09:04 2009
@@ -0,0 +1,70 @@
+package org.apache.archiva.metadata.repository.file;
+
+import java.io.File;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.apache.archiva.metadata.model.MailingList;
+import org.apache.archiva.metadata.model.ProjectVersionMetadata;
+import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.commons.io.FileUtils;
+import org.codehaus.plexus.spring.PlexusInSpringTestCase;
+
+/*
+ * 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.
+ */
+
+public class FileMetadataRepositoryTest
+ extends PlexusInSpringTestCase
+{
+ private FileMetadataRepository repository;
+
+ private static final String TEST_REPO_ID = "test";
+
+ private static final String TEST_PROJECT = "projectId";
+
+ private static final String TEST_NAMESPACE = "namespace";
+
+ public void setUp()
+ throws Exception
+ {
+ super.setUp();
+
+ repository = (FileMetadataRepository) lookup( MetadataRepository.class
);
+ File directory = getTestFile( "target/test-repository" );
+ FileUtils.deleteDirectory( directory );
+ repository.setDirectory( directory );
+ }
+
+ public void testRootNamespaceWithNoMetadataRepository()
+ {
+ Collection<String> namespaces = repository.getRootNamespaces(
TEST_REPO_ID );
+ assertEquals( Collections.<String>emptyList(), namespaces );
+ }
+
+ public void testUpdateProjectVersionMetadataWithNoOtherArchives()
+ {
+ ProjectVersionMetadata metadata = new ProjectVersionMetadata();
+ metadata.setId( TEST_PROJECT );
+ MailingList mailingList = new MailingList();
+ mailingList.setName( "Foo List" );
+ mailingList.setOtherArchives( Collections.<String>emptyList() );
+ metadata.setMailingLists( Collections.singletonList( mailingList ) );
+ repository.updateProjectVersion( TEST_REPO_ID, TEST_NAMESPACE,
TEST_PROJECT, metadata );
+ }
+}
Propchange:
archiva/branches/MRM-1025/archiva-modules/plugins/metadata-repository-file/src/test/java/org/apache/archiva/metadata/repository/file/FileMetadataRepositoryTest.java
------------------------------------------------------------------------------
svn:eol-style = native