]> source.dussan.org Git - archiva.git/commitdiff
[MRM-1283] collapse groups properly across multiple repositories
authorBrett Porter <brett@apache.org>
Thu, 24 Dec 2009 01:58:25 +0000 (01:58 +0000)
committerBrett Porter <brett@apache.org>
Thu, 24 Dec 2009 01:58:25 +0000 (01:58 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/MRM-1025@893683 13f79535-47bb-0310-9956-ffa450edef68

archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java

index 086c3ab3ecde095fcc5b4f7be5d72a4c4749eb3b..ba0eeeb156b03b29a07fce1c9172d754396d84ae 100644 (file)
@@ -69,26 +69,33 @@ public class BrowseAction
         }
 
         Set<String> namespaces = new LinkedHashSet<String>();
+
+        // 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
+        Set<String> namespacesToCollapse = 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 ) );
-            }
+            namespacesToCollapse.addAll( metadataResolver.getRootNamespaces( repoId ) );
+        }
+
+        for ( String n : namespacesToCollapse )
+        {
+            // TODO: check performance of this
+            namespaces.add( collapseNamespaces( selectedRepos, n ) );
         }
 
         this.namespaces = getSortedList( namespaces );
         return SUCCESS;
     }
 
-    private String collapseNamespaces( String repoId, String n )
+    private String collapseNamespaces( Collection<String> repoIds, String n )
     {
-        Collection<String> subNamespaces = metadataResolver.getNamespaces( repoId, n );
+        Set<String> subNamespaces = new LinkedHashSet<String>();
+        for ( String repoId : repoIds )
+        {
+            subNamespaces.addAll( metadataResolver.getNamespaces( repoId, n ) );
+        }
         if ( subNamespaces.size() != 1 )
         {
             if ( log.isDebugEnabled() )
@@ -99,19 +106,19 @@ public class BrowseAction
         }
         else
         {
-            Collection<String> projects = metadataResolver.getProjects( repoId, n );
-            if ( projects != null && !projects.isEmpty() )
+            for ( String repoId : repoIds )
             {
-                if ( log.isDebugEnabled() )
+                Collection<String> projects = metadataResolver.getProjects( repoId, n );
+                if ( projects != null && !projects.isEmpty() )
                 {
-                    log.debug( n + " is not collapsible as it has projects" );
+                    if ( log.isDebugEnabled() )
+                    {
+                        log.debug( n + " is not collapsible as it has projects" );
+                    }
+                    return n;
                 }
-                return n;
-            }
-            else
-            {
-                return collapseNamespaces( repoId, n + "." + subNamespaces.iterator().next() );
             }
+            return collapseNamespaces( repoIds, n + "." + subNamespaces.iterator().next() );
         }
     }
 
@@ -130,23 +137,26 @@ public class BrowseAction
             return GlobalResults.ACCESS_TO_NO_REPOS;
         }
 
-        Set<String> namespaces = new LinkedHashSet<String>();
         Set<String> projects = new LinkedHashSet<String>();
+
+        Set<String> namespacesToCollapse = new LinkedHashSet<String>();
         for ( String repoId : selectedRepos )
         {
-            Collection<String> childNamespaces = metadataResolver.getNamespaces( repoId, groupId );
-            // 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 : childNamespaces )
-            {
-                // TODO: check performance of this
-                namespaces.add( collapseNamespaces( repoId, groupId + "." + n ) );
-            }
+            namespacesToCollapse.addAll( metadataResolver.getNamespaces( repoId, groupId ) );
 
             projects.addAll( metadataResolver.getProjects( repoId, groupId ) );
         }
 
+        // 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
+        Set<String> namespaces = new LinkedHashSet<String>();
+        for ( String n : namespacesToCollapse )
+        {
+            // TODO: check performance of this
+            namespaces.add( collapseNamespaces( selectedRepos, groupId + "." + n ) );
+        }
+
         this.namespaces = getSortedList( namespaces );
         this.projectIds = getSortedList( projects );
         return SUCCESS;
index 71bd1fa984e31d639552754d29011cc22d2dc1ce..052ad0fc2157d947c3192febd313e61b2309f564 100644 (file)
@@ -43,7 +43,7 @@ public class TestMetadataResolver
     private Map<String, List<ProjectVersionReference>> references =
         new HashMap<String, List<ProjectVersionReference>>();
 
-    private List<String> namespaces;
+    private Map<String, List<String>> namespaces = new HashMap<String, List<String>>();
 
     private Map<String, Collection<String>> projectsInNamespace = new HashMap<String, Collection<String>>();
 
@@ -77,14 +77,14 @@ public class TestMetadataResolver
 
     public Collection<String> getRootNamespaces( String repoId )
     {
-        return getNamespaces( null );
+        return getNamespaces( repoId, null );
     }
 
-    private Collection<String> getNamespaces( String baseNamespace )
+    public Collection<String> getNamespaces( String repoId, String baseNamespace )
     {
         Set<String> namespaces = new LinkedHashSet<String>();
         int fromIndex = baseNamespace != null ? baseNamespace.length() + 1 : 0;
-        for ( String namespace : this.namespaces )
+        for ( String namespace : this.namespaces.get( repoId ) )
         {
             if ( baseNamespace == null || namespace.startsWith( baseNamespace + "." ) )
             {
@@ -102,11 +102,6 @@ public class TestMetadataResolver
         return namespaces;
     }
 
-    public Collection<String> getNamespaces( String repoId, String namespace )
-    {
-        return getNamespaces( namespace );
-    }
-
     public Collection<String> getProjects( String repoId, String namespace )
     {
         Collection<String> list = projectsInNamespace.get( namespace );
@@ -167,8 +162,8 @@ public class TestMetadataResolver
         this.references.put( createMapKey( repoId, namespace, projectId, projectVersion ), references );
     }
 
-    public void setNamespaces( List<String> namespaces )
+    public void setNamespaces( String repoId, List<String> namespaces )
     {
-        this.namespaces = namespaces;
+        this.namespaces.put( repoId, namespaces );
     }
 }
index a2cdb6fd079fdb35bb39ad3313e724a1ab35463a..c80cb3e3e78dc106eb9f83b3c0cfbb773a780ad6 100644 (file)
@@ -38,6 +38,8 @@ public class BrowseActionTest
         Arrays.asList( "org.apache.archiva", "commons-lang", "org.apache.maven", "com.sun", "com.oracle",
                        "repeat.repeat" );
 
+    private static final String OTHER_TEST_REPO = "other-repo";
+
     public void testInstantiation()
     {
         assertFalse( action == lookup( Action.class, ACTION_HINT ) );
@@ -45,7 +47,7 @@ public class BrowseActionTest
 
     public void testBrowse()
     {
-        metadataResolver.setNamespaces( GROUPS );
+        metadataResolver.setNamespaces( TEST_REPO, GROUPS );
 
         String result = action.browse();
         assertSuccessResult( result );
@@ -120,7 +122,7 @@ public class BrowseActionTest
         String selectedGroupId = "org";
         List<String> groups = Arrays.asList( "org.apache.archiva", "org.apache.maven" );
 
-        metadataResolver.setNamespaces( groups );
+        metadataResolver.setNamespaces( TEST_REPO, groups );
         action.setGroupId( selectedGroupId );
         String result = action.browseGroup();
         assertSuccessResult( result );
@@ -141,7 +143,7 @@ public class BrowseActionTest
         String selectedGroupId = "org.apache";
         List<String> groups = Arrays.asList( "org.apache.archiva", "org.apache.maven" );
 
-        metadataResolver.setNamespaces( groups );
+        metadataResolver.setNamespaces( TEST_REPO, groups );
         metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, artifacts, new ProjectVersionMetadata() );
         action.setGroupId( selectedGroupId );
         String result = action.browseGroup();
@@ -161,7 +163,7 @@ public class BrowseActionTest
     {
         List<String> groups = Arrays.asList( "org.apache.archiva", "org.apache" );
 
-        metadataResolver.setNamespaces( groups );
+        metadataResolver.setNamespaces( TEST_REPO, groups );
         // add an artifact in the tree to make sure "single" is not collapsed
         metadataResolver.setProjectVersion( TEST_REPO, "org.apache", "apache", new ProjectVersionMetadata() );
 
@@ -178,13 +180,36 @@ public class BrowseActionTest
         assertNull( action.getSharedModel() );
     }
 
+    public void testBrowseWithCollapsedGroupsAndArtifactsAcrossRepositories()
+    {
+        setObservableRepos( Arrays.asList( TEST_REPO, OTHER_TEST_REPO ) );
+
+        metadataResolver.setNamespaces( TEST_REPO, Arrays.asList( "org.apache.archiva", "org.apache" ) );
+        metadataResolver.setNamespaces( OTHER_TEST_REPO, Arrays.asList( "org.codehaus.plexus", "org.codehaus" ) );
+
+        // add an artifact in the tree to make sure "single" is not collapsed
+        metadataResolver.setProjectVersion( TEST_REPO, "org.apache", "apache", new ProjectVersionMetadata() );
+
+        String result = action.browse();
+        assertSuccessResult( result );
+
+        assertEquals( Collections.singletonList( "org" ), action.getNamespaces() );
+        assertNull( action.getProjectIds() );
+        assertNull( action.getProjectVersions() );
+
+        assertNull( action.getGroupId() );
+        assertNull( action.getArtifactId() );
+        assertNull( action.getRepositoryId() );
+        assertNull( action.getSharedModel() );
+    }
+
     public void testBrowseGroupWithCollapsedGroupsAndArtifacts()
     {
         String artifacts = "apache";
         String selectedGroupId = "org.apache";
         List<String> groups = Arrays.asList( "org.apache.archiva", "org.apache" );
 
-        metadataResolver.setNamespaces( groups );
+        metadataResolver.setNamespaces( TEST_REPO, groups );
         // add an artifact in the tree to make sure "single" is not collapsed
         metadataResolver.setProjectVersion( TEST_REPO, "org.apache", "apache", new ProjectVersionMetadata() );