Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/CategoryXMLActionTest.java54
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/3-depth-category.xml18
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/CategoryParser.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteCategory.java1
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java39
5 files changed, 98 insertions, 17 deletions
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/CategoryXMLActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/CategoryXMLActionTest.java
index 0cd740547..1b069058f 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/CategoryXMLActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/CategoryXMLActionTest.java
@@ -1,11 +1,12 @@
/*******************************************************************************
-* Copyright (c) 2009, 2010 EclipseSource and others. All rights reserved. This
+* Copyright (c) 2009, 2013 EclipseSource and others. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* EclipseSource - initial API and implementation
+* Red Hat Inc. - 383795 (bundle element), 406902 (nested categories)
******************************************************************************/
package org.eclipse.equinox.p2.tests.updatesite;
@@ -169,12 +170,7 @@ public class CategoryXMLActionTest extends AbstractProvisioningTest {
}
assertNotNull("1.1", rootCategoryIu);
- IQuery<IInstallableUnit> rootCategoryMembersQuery = QueryUtil.createIUCategoryMemberQuery(rootCategoryIu);
- IQueryResult<IInstallableUnit> rootCategoryMembers = actionResult.query(rootCategoryMembersQuery, new NullProgressMonitor());
- Set<IInstallableUnit> rootCategoryMembersSet = rootCategoryMembers.toUnmodifiableSet();
- assertEquals("2.0", 1, rootCategoryMembersSet.size());
- IInstallableUnit nestedCategory = rootCategoryMembersSet.iterator().next();
- assertTrue("2.1", nestedCategory.getId().endsWith("Nested Category"));
+ IInstallableUnit nestedCategory = assertContainsAndGetIU(rootCategoryIu, "Nested Category");
IQuery<IInstallableUnit> nestedCategoryMemberQuery = QueryUtil.createIUCategoryMemberQuery(nestedCategory);
IQueryResult<IInstallableUnit> nestedCategoryMembers = actionResult.query(nestedCategoryMemberQuery, new NullProgressMonitor());
@@ -182,4 +178,48 @@ public class CategoryXMLActionTest extends AbstractProvisioningTest {
assertEquals("3.0", 1, nestedCategoryMembersSet.size());
assertEquals("3.1", "test.bundle", nestedCategoryMembersSet.iterator().next().getId());
}
+
+ public void testMultiDepthNestedInCategory() throws Exception {
+ PublisherInfo info = new PublisherInfo();
+
+ info.setMetadataRepository(metadataRepository);
+ siteLocation = TestData.getFile("updatesite", "CategoryXMLActionTest/3-depth-category.xml").toURI();
+ FeaturesAction featuresAction = new FeaturesAction(new File[] {TestData.getFile("updatesite", "CategoryXMLActionTest")});
+ BundlesAction bundlesAction = new BundlesAction(new File[] {TestData.getFile("updatesite", "CategoryXMLActionTest")});
+ MergeResultsAction publishAction = new MergeResultsAction(new IPublisherAction[] {featuresAction, bundlesAction}, IPublisherResult.MERGE_ALL_NON_ROOT);
+ publishAction.perform(info, actionResult, new NullProgressMonitor());
+
+ CategoryXMLAction action = new CategoryXMLAction(siteLocation, null);
+ action.perform(info, actionResult, getMonitor());
+
+ IQueryResult result = actionResult.query(QueryUtil.createIUCategoryQuery(), new NullProgressMonitor());
+ assertEquals("1.0", 4, queryResultSize(result));
+ IInstallableUnit rootCategoryIu = null;
+ for (Object item : result) {
+ if (((IInstallableUnit) item).getId().endsWith("Root Category")) {
+ rootCategoryIu = (IInstallableUnit) item;
+ }
+ }
+ assertNotNull("1.1", rootCategoryIu);
+
+ IInstallableUnit nestedCategoryIu = assertContainsAndGetIU(rootCategoryIu, "Nested Category");
+ IInstallableUnit nestedNestedCategoryIu = assertContainsAndGetIU(nestedCategoryIu, "Nested Nested Category");
+ IInstallableUnit nestedNestedNestedCategoryIu = assertContainsAndGetIU(nestedNestedCategoryIu, "Nested Nested Nested Category");
+
+ IQuery<IInstallableUnit> nestedNestedNestedCategoryMemberQuery = QueryUtil.createIUCategoryMemberQuery(nestedNestedNestedCategoryIu);
+ IQueryResult<IInstallableUnit> nestedNestedNestedCategoryMembers = actionResult.query(nestedNestedNestedCategoryMemberQuery, new NullProgressMonitor());
+ Set<IInstallableUnit> nestedCategoryMembersSet = nestedNestedNestedCategoryMembers.toUnmodifiableSet();
+ assertEquals("3.0", 1, nestedCategoryMembersSet.size());
+ assertEquals("3.1", "test.feature.feature.group", nestedCategoryMembersSet.iterator().next().getId());
+ }
+
+ private IInstallableUnit assertContainsAndGetIU(IInstallableUnit parentCategoryIu, String iuId) {
+ IQuery<IInstallableUnit> rootCategoryMembersQuery = QueryUtil.createIUCategoryMemberQuery(parentCategoryIu);
+ IQueryResult<IInstallableUnit> rootCategoryMembers = actionResult.query(rootCategoryMembersQuery, new NullProgressMonitor());
+ Set<IInstallableUnit> rootCategoryMembersSet = rootCategoryMembers.toUnmodifiableSet();
+ assertEquals("Unexpected multiple items under category", 1, rootCategoryMembersSet.size());
+ IInstallableUnit nestedCategoryIu = rootCategoryMembersSet.iterator().next();
+ assertTrue("Could not find IU '" + iuId + "'", nestedCategoryIu.getId().endsWith(iuId));
+ return nestedCategoryIu;
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/3-depth-category.xml b/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/3-depth-category.xml
new file mode 100644
index 000000000..263cf041b
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/3-depth-category.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site
+ mirrorsURL="http://www.eclipse.org/downloads/download.php?file=/eclipse/updates/3.4&amp;format=xml"
+ associateSitesURL="associateSites.xml">
+ <feature url="features/test.feature_1.0.0.jar" id="test.feature" version="1.0.0">>
+ <category name="Nested Nested Nested Category"/>
+ </feature>
+ <category-def name="Root Category" label="Root Category"/>
+ <category-def name="Nested Category" label="Nested Category">
+ <category name="Root Category"/>
+ </category-def>
+ <category-def name="Nested Nested Category" label="Nested Nested Category">
+ <category name="Nested Category"/>
+ </category-def>
+ <category-def name="Nested Nested Nested Category" label="Nested Nested Nested Category">
+ <category name="Nested Nested Category"/>
+ </category-def>
+</site>
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/CategoryParser.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/CategoryParser.java
index fa06c7322..88801dbfd 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/CategoryParser.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/CategoryParser.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * Copyright (c) 2000, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Red Hat Inc. - 383795 (bundle element), 406902 (nested categories)
*******************************************************************************/
package org.eclipse.equinox.internal.p2.updatesite;
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteCategory.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteCategory.java
index a98529bdc..cc56b4cec 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteCategory.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteCategory.java
@@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Red Hat Inc. - 406902 (nested categories)
*******************************************************************************/
package org.eclipse.equinox.internal.p2.updatesite;
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java
index 1a06342e4..71336f1e6 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java
@@ -8,6 +8,7 @@
* Code 9 - initial API and implementation
* IBM - ongoing development
* Sonatype, Inc. - transport split
+ * Red Hat Inc. - 383795 (bundle element)
******************************************************************************/
package org.eclipse.equinox.internal.p2.updatesite;
@@ -425,7 +426,7 @@ public class SiteXMLAction extends AbstractPublisherAction {
for (SiteCategory category : this.updateSite.getSite().getCategories()) {
nameToCategory.put(category.getName(), category);
}
- Map<SiteCategory, Set<SiteCategory>> categoryToNestedCategories = new HashMap<SiteCategory, Set<SiteCategory>>();
+ final Map<SiteCategory, Set<SiteCategory>> categoryToNestedCategories = new HashMap<SiteCategory, Set<SiteCategory>>();
for (SiteCategory category : this.updateSite.getSite().getCategories()) {
for (String parentCategoryName : category.getCategoryNames()) {
SiteCategory parentCategory = nameToCategory.get(parentCategoryName);
@@ -436,22 +437,42 @@ public class SiteXMLAction extends AbstractPublisherAction {
}
}
+ List<SiteCategory> categories = new ArrayList<SiteCategory>(Arrays.asList(this.updateSite.getSite().getCategories()));
+ categories.add(this.defaultCategory);
// sort category so they are processed in reverse order of dependency
- // category2 is nested in category1 => category2 < category1
+ // (Nested categories go first)
Comparator<SiteCategory> isNestedCategoryComparator = new Comparator<SiteCategory>() {
public int compare(SiteCategory category1, SiteCategory category2) {
- if (Arrays.asList(category1.getCategoryNames()).contains(category2.getName())) {
- // category2 is nested in category1
- return -1;
- } else if (Arrays.asList(category2.getCategoryNames()).contains(category1.getName())) {
- // category1 is nested in category2
+ Set<SiteCategory> childrenOfCategory1 = categoryToNestedCategories.get(category1);
+ Set<SiteCategory> childrenOfCategory2 = categoryToNestedCategories.get(category2);
+ if (childrenOfCategory1 != null && childrenOfCategory1.contains(category2)) {
+ // category2 nested in category1 => category2 < category1
return +1;
}
+ if (childrenOfCategory2 != null && childrenOfCategory2.contains(category1)) {
+ // category1 nested in category2 => category1 < category2
+ return -1;
+ }
+ // Then recurse in childrenCategories for transitivity
+ if (childrenOfCategory1 != null) {
+ for (SiteCategory childOfCategory1 : childrenOfCategory1) {
+ int res = this.compare(childOfCategory1, category2);
+ if (res != 0) {
+ return res;
+ }
+ }
+ }
+ if (childrenOfCategory2 != null) {
+ for (SiteCategory childOfCategory2 : childrenOfCategory2) {
+ int res = this.compare(category1, childOfCategory2);
+ if (res != 0) {
+ return res;
+ }
+ }
+ }
return 0;
}
};
- List<SiteCategory> categories = new ArrayList<SiteCategory>(Arrays.asList(this.updateSite.getSite().getCategories()));
- categories.add(this.defaultCategory);
Collections.sort(categories, isNestedCategoryComparator);
// Then create categories in the right order

Back to the top