You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2013/10/25 14:21:42 UTC
svn commit: r1535709 - in
/sling/trunk/tooling/maven/maven-launchpad-plugin/src:
main/java/org/apache/sling/maven/projectsupport/
test/java/org/apache/sling/maven/projectsupport/ test/resources/
Author: bdelacretaz
Date: Fri Oct 25 12:21:41 2013
New Revision: 1535709
URL: http://svn.apache.org/r1535709
Log:
SLING-3205 - provide bundle resources under resources/install to support run modes
Modified:
sling/trunk/tooling/maven/maven-launchpad-plugin/src/main/java/org/apache/sling/maven/projectsupport/BundleListContentProvider.java
sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/java/org/apache/sling/maven/projectsupport/BundleListContentProviderTest.java
sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/resources/test-bundle-list.xml
Modified: sling/trunk/tooling/maven/maven-launchpad-plugin/src/main/java/org/apache/sling/maven/projectsupport/BundleListContentProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/maven/maven-launchpad-plugin/src/main/java/org/apache/sling/maven/projectsupport/BundleListContentProvider.java?rev=1535709&r1=1535708&r2=1535709&view=diff
==============================================================================
--- sling/trunk/tooling/maven/maven-launchpad-plugin/src/main/java/org/apache/sling/maven/projectsupport/BundleListContentProvider.java (original)
+++ sling/trunk/tooling/maven/maven-launchpad-plugin/src/main/java/org/apache/sling/maven/projectsupport/BundleListContentProvider.java Fri Oct 25 12:21:41 2013
@@ -26,6 +26,7 @@ import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
@@ -45,6 +46,10 @@ import org.apache.sling.maven.projectsup
*/
abstract class BundleListContentProvider implements LaunchpadContentProvider {
+ public static final String INSTALL_PATH_PREFIX = "resources/install";
+ public static final int BOOTSTRAP_DEF_START_LEVEL = -1;
+ public static final int ACTUAL_BOOTSTRAP_START_LEVEL = 1;
+
private final File resourceProviderRoot;
private final static List<String> EMPTY_STRING_LIST = Collections.emptyList();
@@ -55,11 +60,10 @@ abstract class BundleListContentProvider
private Iterator<String> handleBundlePathRoot(String path) {
final Set<String> levels = new HashSet<String>();
for (final StartLevel level : getInitializedBundleList().getStartLevels()) {
- // we treat the boot level as level 1
- if ( level.getStartLevel() == -1 ) {
- levels.add(BUNDLE_PATH_PREFIX + "/1/");
- } else {
- levels.add(BUNDLE_PATH_PREFIX + "/" + level.getLevel() + "/");
+ // Include only bootstrap bundles here, with start level 1.
+ // Other bundles go under the install folder, to support run modes
+ if( level.getStartLevel() == BOOTSTRAP_DEF_START_LEVEL) {
+ levels.add(BUNDLE_PATH_PREFIX + "/" + ACTUAL_BOOTSTRAP_START_LEVEL + "/");
}
}
return levels.iterator();
@@ -88,31 +92,53 @@ abstract class BundleListContentProvider
}
}
- private Iterator<String> handleBundlePathFolder(String path) {
+ private Iterator<String> handleBundlesSubfolder(String path) {
+ Iterator<String> result = null;
final String startLevelInfo = path.substring(BUNDLE_PATH_PREFIX.length() + 1);
try {
final int startLevel = Integer.parseInt(startLevelInfo);
+
+ // To be consistent with handleBundlePathRoot, consider only level 1 which
+ // is assigned to bootstrap bundles
+ if(startLevel == ACTUAL_BOOTSTRAP_START_LEVEL) {
+ final List<String> bundles = new ArrayList<String>();
+ addBundles(bundles, ACTUAL_BOOTSTRAP_START_LEVEL, null);
+ addBundles(bundles, BOOTSTRAP_DEF_START_LEVEL, null);
+ result = bundles.iterator();
+ }
- final List<String> bundles = new ArrayList<String>();
- for (final StartLevel level : getInitializedBundleList().getStartLevels()) {
- if (level.getStartLevel() == startLevel || (startLevel == 1 && level.getStartLevel() == -1)) {
- for (final Bundle bundle : level.getBundles()) {
- final ArtifactDefinition d = new ArtifactDefinition(bundle, startLevel);
- try {
- final Artifact artifact = getArtifact(d);
- bundles.add(artifact.getFile().toURI().toURL().toExternalForm());
- } catch (Exception e) {
- getLog().error("Unable to resolve artifact ", e);
- }
+ } catch (NumberFormatException e) {
+ getLog().warn("Invalid start level " + startLevelInfo + " in path " + path);
+ }
+
+ return result;
+ }
+
+ private void addBundles(Collection<String> bundles, int startLevel, String runMode) {
+ for (final StartLevel level : getInitializedBundleList().getStartLevels()) {
+ if(level.getStartLevel() == startLevel) {
+ for (final Bundle bundle : level.getBundles()) {
+ if(!runModeMatches(bundle, runMode)) {
+ continue;
+ }
+ final ArtifactDefinition d = new ArtifactDefinition(bundle, startLevel);
+ try {
+ final Artifact artifact = getArtifact(d);
+ bundles.add(artifact.getFile().toURI().toURL().toExternalForm());
+ } catch (Exception e) {
+ getLog().error("Unable to resolve artifact ", e);
}
}
}
- return bundles.iterator();
-
- } catch (NumberFormatException e) {
- // we ignore this
}
- return null;
+ }
+
+ private boolean runModeMatches(Bundle b, String runMode) {
+ if(runMode == null || runMode.length() == 0) {
+ return b.getRunModes() == null || b.getRunModes().length() == 0;
+ } else {
+ return b.getRunModes() != null && b.getRunModes().contains(runMode);
+ }
}
private Iterator<String> handleResourcesRoot() {
@@ -120,8 +146,81 @@ abstract class BundleListContentProvider
subDirs.add(BUNDLE_PATH_PREFIX);
subDirs.add(CONFIG_PATH_PREFIX);
subDirs.add("resources/corebundles");
+ subDirs.add(INSTALL_PATH_PREFIX);
+
+ // Compute the set of run modes in our bundles
+ final Set<String> runModes = new HashSet<String>();
+ for (final StartLevel level : getInitializedBundleList().getStartLevels()) {
+ for(Bundle bundle : level.getBundles()) {
+ final String modes = bundle.getRunModes();
+ if(modes != null && modes.length() > 0) {
+ for(String m : modes.split(",")) {
+ runModes.add("." + m);
+ }
+ }
+ }
+ }
+
+ // Add one install subdir per run mode
+ for(String m : runModes) {
+ subDirs.add(INSTALL_PATH_PREFIX + m);
+ }
return subDirs.iterator();
}
+
+ /** Add one folder per child, using given path as prefix, for start
+ * levels which actually provide bundles for the given run mode.
+ */
+ private void addStartLevelSubdirs(Collection<String> children, String path, String runMode) {
+ for (final StartLevel level : getInitializedBundleList().getStartLevels()) {
+ final List<String> bundles = new ArrayList<String>();
+ addBundles(bundles, level.getStartLevel(), runMode);
+ if(!bundles.isEmpty()) {
+ int folderLevel = level.getStartLevel();
+ if(folderLevel== BOOTSTRAP_DEF_START_LEVEL) {
+ folderLevel = ACTUAL_BOOTSTRAP_START_LEVEL;
+ }
+ children.add(path + "/" + folderLevel);
+ }
+ }
+ }
+
+ private Iterator<String> handleInstallPath(String path) {
+ // Path is like
+ // bundles/install.runMode/12
+ // or a subset of that.
+ // Extract optional run mode and start level from that
+ if(path.endsWith("/")) {
+ path = path.substring(0, path.length() - 1);
+ }
+ final String [] parts = path.substring(INSTALL_PATH_PREFIX.length()).split("/");
+ if (parts.length > 2){
+ throw new IllegalStateException("Cannot parse path " + path);
+ }
+ final String runMode = parts[0].length() == 0 ? null : parts[0].substring(1);
+ final String startLevelInfo = parts.length > 1 ? parts[1] : null;
+ Set<String> result = new HashSet<String>();
+
+ if(runMode == null && startLevelInfo == null) {
+ // Root folder: add one subdir per start level that provides bundles
+ addStartLevelSubdirs(result, INSTALL_PATH_PREFIX, null);
+
+ } else if(startLevelInfo == null) {
+ // The root of a run mode folder - one subdir per start
+ // level which actually provides bundles
+ addStartLevelSubdirs(result, path, runMode);
+
+ } else {
+ // A folder that contains bundles
+ try {
+ addBundles(result, Integer.parseInt(startLevelInfo), runMode);
+ } catch (NumberFormatException e) {
+ getLog().warn("Invalid start level info " + startLevelInfo + " in path " + path);
+ }
+ }
+
+ return result.iterator();
+ }
public Iterator<String> getChildren(String path) {
Iterator<String> result = null;
@@ -132,11 +231,17 @@ abstract class BundleListContentProvider
} else if (path.equals(CONFIG_PATH_PREFIX)) {
result = handleConfigPath();
} else if (path.startsWith(BUNDLE_PATH_PREFIX)) {
- result = handleBundlePathFolder(path);
+ result = handleBundlesSubfolder(path);
+ } else if (path.startsWith(INSTALL_PATH_PREFIX)) {
+ result = handleInstallPath(path);
} else if (path.equals("resources") ) {
result = handleResourcesRoot();
+ } else if (path.startsWith("file:") ) {
+ // Client looks for files under a file - we have none,
+ // as our file URLs point to Maven artifacts
+ result = EMPTY_STRING_LIST.iterator();
} else {
- getLog().warn("un-handlable " + getClass().getSimpleName() + " path: " + path);
+ getLog().warn("BundleListContentProvider cannot handle path: " + path);
}
return result;
Modified: sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/java/org/apache/sling/maven/projectsupport/BundleListContentProviderTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/java/org/apache/sling/maven/projectsupport/BundleListContentProviderTest.java?rev=1535709&r1=1535708&r2=1535709&view=diff
==============================================================================
--- sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/java/org/apache/sling/maven/projectsupport/BundleListContentProviderTest.java (original)
+++ sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/java/org/apache/sling/maven/projectsupport/BundleListContentProviderTest.java Fri Oct 25 12:21:41 2013
@@ -27,6 +27,7 @@ import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import org.apache.maven.artifact.Artifact;
@@ -48,7 +49,7 @@ public class BundleListContentProviderTe
private static BundleList bundleList;
public static final String TEST_BUNDLE_LIST = "test-bundle-list.xml";
- public static final int BUNDLES_IN_TEST_BUNDLE_LIST = 11;
+ public static final int BUNDLES_IN_TEST_BUNDLE_LIST = 13;
private LaunchpadContentProvider provider;
private File resourceProviderRoot;
@@ -114,7 +115,7 @@ public class BundleListContentProviderTe
Artifact getArtifact(ArtifactDefinition def) throws MojoExecutionException {
final Artifact a = Mockito.mock(Artifact.class);
final String fakeName = new StringBuilder()
- .append("/")
+ .append("/FAKE_BUNDLE/")
.append(def.getArtifactId())
.append("/")
.append(def.getStartLevel())
@@ -138,14 +139,17 @@ public class BundleListContentProviderTe
if(expected.length == 0) {
assertTrue("Expecting no children for " + path, it == null || !it.hasNext());
} else {
+ assertNotNull("Expecting non-null iterator for " + path, it);
while(it.hasNext()) {
kids.add(it.next());
}
for(String exp : expected) {
- assertTrue("Expecting " + exp + " in children of " + path + " (result=" + kids + ")", kids.contains(exp));
+ assertTrue("Expecting " + exp + " in children of " + path + " (result=" + kids + ")",
+ kids.contains(exp));
}
}
- assertEquals("Expecting the correct number of children for " + path, expected.length, kids.size());
+ assertEquals("Expecting the correct number of children for " + path + " (result=" + kids + ")",
+ expected.length, kids.size());
}
@Test
@@ -162,16 +166,53 @@ public class BundleListContentProviderTe
assertChildren("resources",
"resources/bundles",
"resources/corebundles",
- "resources/config");
+ "resources/config",
+ "resources/install",
+ "resources/install.dev",
+ "resources/install.test",
+ "resources/install.oak",
+ "resources/install.jackrabbit");
}
@Test
public void testBundles() {
assertChildren("resources/bundles",
- "resources/bundles/0/",
- "resources/bundles/1/",
- "resources/bundles/5/",
- "resources/bundles/15/");
+ "resources/bundles/1/");
+ }
+
+ @Test
+ public void testInstall() {
+ assertChildren("resources/install",
+ "resources/install/0",
+ "resources/install/1",
+ "resources/install/5",
+ "resources/install/15");
+ }
+
+ @Test
+ public void testInstallDev() {
+ assertChildren("resources/install.dev",
+ "resources/install.dev/0",
+ "resources/install.dev/5");
+ }
+
+ @Test
+ public void testInstallTest() {
+ assertChildren("resources/install.test",
+ "resources/install.test/0",
+ "resources/install.test/5");
+ }
+
+ @Test
+ public void testInstallOak() {
+ assertChildren("resources/install.oak",
+ "resources/install.oak/15");
+ }
+
+ @Test
+ public void testInstallJackrabbit() {
+ assertChildren("resources/install.jackrabbit",
+ "resources/install.jackrabbit/15");
}
@Test
@@ -194,34 +235,68 @@ public class BundleListContentProviderTe
}
@Test
- public void testBundles0() {
- assertChildren("resources/bundles/0",
- "file:/commons-io/0/null",
- "file:/commons-fileupload/0/null",
- "file:/commons-collections/0/null",
- "file:/org.apache.sling.installer.provider.jcr/0/test,dev");
+ public void testIgnoredNonBootstrapBundles() {
+ // All these start levels do not provide resources/bundles anymore - moved to resources/install
+ for(int i=0; i <= 30; i++) {
+ if(i == 1) {
+ continue;
+ }
+ final String path ="resources/bundles/" + i;
+ assertNull("Expecting no resources under " + path, provider.getChildren(path));
+ }
+ }
+
+ @Test
+ public void testInstall0() {
+ assertChildren("resources/install/0",
+ "file:/FAKE_BUNDLE/commons-io/0/null",
+ "file:/FAKE_BUNDLE/commons-fileupload/0/null",
+ "file:/FAKE_BUNDLE/commons-collections/0/null");
}
@Test
- public void testBundles1() {
+ public void testBootstrapBundles() {
assertChildren("resources/bundles/1",
- "file:/slf4j-api/1/null",
- "file:/org.apache.sling.commons.log/1/null");
+ "file:/FAKE_BUNDLE/slf4j-api/-1/null",
+ "file:/FAKE_BUNDLE/org.apache.sling.commons.log/-1/null");
+ }
+
+ @Test
+ public void testInstall5() {
+ assertChildren("resources/install/5",
+ "file:/FAKE_BUNDLE/five.norunmode/5/null");
}
@Test
- public void testBundles5() {
- assertChildren("resources/bundles/5",
- "file:/org.apache.sling.extensions.webconsolebranding/5/dev",
- "file:/org.apache.sling.extensions.webconsolesecurityprovider/5/test");
+ public void testInstall5Dev() {
+ assertChildren("resources/install.dev/5",
+ "file:/FAKE_BUNDLE/org.apache.sling.extensions.webconsolebranding/5/dev");
}
@Test
- public void testBundles15() {
- assertChildren("resources/bundles/15",
- "file:/org.apache.sling.jcr.oak.server/15/oak",
- "file:/guava/15/jackrabbit",
- "file:/jsr305/15/oak,jackrabbit");
+ public void testInstall5Test() {
+ assertChildren("resources/install.test/5",
+ "file:/FAKE_BUNDLE/org.apache.sling.extensions.webconsolesecurityprovider/5/test");
+ }
+
+ @Test
+ public void testInstall15() {
+ assertChildren("resources/install/15",
+ "file:/FAKE_BUNDLE/fifteen.norunmode/15/null");
+ }
+
+ @Test
+ public void testInstall15Oak() {
+ assertChildren("resources/install.oak/15",
+ "file:/FAKE_BUNDLE/org.apache.sling.jcr.oak.server/15/oak",
+ "file:/FAKE_BUNDLE/jsr305/15/oak,jackrabbit");
+ }
+
+ @Test
+ public void testInstall15Jackrabbit() {
+ assertChildren("resources/install.jackrabbit/15",
+ "file:/FAKE_BUNDLE/guava/15/jackrabbit",
+ "file:/FAKE_BUNDLE/jsr305/15/oak,jackrabbit");
}
@Test
@@ -271,4 +346,39 @@ public class BundleListContentProviderTe
assertNull(provider.getChildren("/FOO/bar"));
}
+ @Test
+ public void testAllBundlesFound() {
+ final List<String> allResources = new LinkedList<String>();
+ addRecursively(allResources, "resources");
+ final List<String> bundles = new LinkedList<String>();
+ for(String r : allResources) {
+ if(r.contains("FAKE_BUNDLE")) {
+ bundles.add(r);
+ }
+ }
+
+ // Bundles that have two run modes appear in two folders, we have two of those
+ // with two run modes each
+ final int expected = BUNDLES_IN_TEST_BUNDLE_LIST + 2;
+ assertEquals("Expecting the exact number of test bundles to be found", expected, bundles.size());
+ }
+
+ @Test
+ public void testFile() {
+ assertChildren("file:/something");
+ }
+
+ private void addRecursively(List<String> resources, String path) {
+ if(path.endsWith("/")) {
+ path = path.substring(0, path.length() - 1);
+ }
+ resources.add(path);
+ final Iterator<String> it = provider.getChildren(path);
+ if(it != null) {
+ while(it.hasNext()) {
+ addRecursively(resources, it.next());
+ }
+ }
+ }
+
}
Modified: sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/resources/test-bundle-list.xml
URL: http://svn.apache.org/viewvc/sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/resources/test-bundle-list.xml?rev=1535709&r1=1535708&r2=1535709&view=diff
==============================================================================
--- sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/resources/test-bundle-list.xml (original)
+++ sling/trunk/tooling/maven/maven-launchpad-plugin/src/test/resources/test-bundle-list.xml Fri Oct 25 12:21:41 2013
@@ -51,6 +51,11 @@
<version>1.0.0</version>
<runModes>test</runModes>
</bundle>
+ <bundle>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>five.norunmode</artifactId>
+ <version>1.0.0</version>
+ </bundle>
</startLevel>
<startLevel level="15">
@@ -72,5 +77,10 @@
<version>2.0.0</version>
<runModes>oak,jackrabbit</runModes>
</bundle>
+ <bundle>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>fifteen.norunmode</artifactId>
+ <version>1.0.0</version>
+ </bundle>
</startLevel>
</bundles>