You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gg...@apache.org on 2016/11/18 16:58:33 UTC

[3/4] camel git commit: [CAMEL-10476] Provide initial configadmin configuration in camel:run scenario

[CAMEL-10476] Provide initial configadmin configuration in camel:run scenario

(cherry picked from commit 35a8fb65ce2f4feffe0b663d4ed48fdf00e98f44)


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d35f61c2
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d35f61c2
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d35f61c2

Branch: refs/heads/camel-2.17.x
Commit: d35f61c20cd0a14ebf4eaea3f4c5d050c6ffeb2e
Parents: a41e734
Author: Grzegorz Grzybek <gr...@gmail.com>
Authored: Fri Nov 18 17:04:55 2016 +0100
Committer: Grzegorz Grzybek <gr...@gmail.com>
Committed: Fri Nov 18 17:38:50 2016 +0100

----------------------------------------------------------------------
 .../test/blueprint/CamelBlueprintHelper.java    | 76 +++++++++++++++-----
 .../org/apache/camel/test/blueprint/Main.java   | 15 +++-
 .../apache/camel/test/blueprint/MainTest.java   | 56 ++++++++++++++-
 3 files changed, 127 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/d35f61c2/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintHelper.java b/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintHelper.java
index b291644..90f23bb 100644
--- a/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintHelper.java
+++ b/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/CamelBlueprintHelper.java
@@ -108,18 +108,38 @@ public final class CamelBlueprintHelper {
     public static BundleContext createBundleContext(String name, String descriptors, boolean includeTestBundle,
                                                     String bundleFilter, String testBundleVersion, String testBundleDirectives,
                                                     String[] ... configAdminPidFiles) throws Exception {
+        return createBundleContext(name, descriptors, includeTestBundle,
+                bundleFilter, testBundleVersion, testBundleDirectives,
+                null,
+                configAdminPidFiles);
+    }
+
+    public static BundleContext createBundleContext(String name, String descriptors, boolean includeTestBundle,
+                                                    String bundleFilter, String testBundleVersion, String testBundleDirectives,
+                                                    ClassLoader loader,
+                                                    String[] ... configAdminPidFiles) throws Exception {
         TinyBundle bundle = null;
+        TinyBundle configAdminInitBundle = null;
 
         if (includeTestBundle) {
             // add ourselves as a bundle
             bundle = createTestBundle(testBundleDirectives == null ? name : name + ';' + testBundleDirectives,
-                    testBundleVersion, descriptors, configAdminPidFiles);
+                    testBundleVersion, descriptors);
+        }
+        if (configAdminPidFiles != null) {
+            configAdminInitBundle = createConfigAdminInitBundle(configAdminPidFiles);
         }
 
-        return createBundleContext(name, bundleFilter, bundle);
+        return createBundleContext(name, bundleFilter, bundle, configAdminInitBundle, loader);
     }
 
     public static BundleContext createBundleContext(String name, String bundleFilter, TinyBundle bundle) throws Exception {
+        return createBundleContext(name, bundleFilter, bundle, null,null);
+    }
+
+    public static BundleContext createBundleContext(String name, String bundleFilter,
+                                                    TinyBundle bundle, TinyBundle configAdminInitBundle,
+                                                    ClassLoader loader) throws Exception {
         // ensure felix-connect stores bundles in an unique target directory
         String uid = "" + System.currentTimeMillis();
         String tempDir = "target/bundles/" + uid;
@@ -133,12 +153,17 @@ public final class CamelBlueprintHelper {
 
         List<BundleDescriptor> bundles = new LinkedList<>();
 
+        if (configAdminInitBundle != null) {
+            String jarName = "configAdminInitBundle-" + uid + ".jar";
+            bundles.add(getBundleDescriptor("target/test-bundles/" + jarName, configAdminInitBundle));
+        }
+
         if (bundle != null) {
             String jarName = name.toLowerCase(Locale.ENGLISH) + "-" + uid + ".jar";
             bundles.add(getBundleDescriptor("target/test-bundles/" + jarName, bundle));
         }
 
-        List<BundleDescriptor> bundleDescriptors = getBundleDescriptors(bundleFilter);
+        List<BundleDescriptor> bundleDescriptors = getBundleDescriptors(bundleFilter, loader);
         // let's put configadmin before blueprint.core
         int idx1 = -1;
         int idx2 = -1;
@@ -261,7 +286,7 @@ public final class CamelBlueprintHelper {
     }
 
     public static <T> T getOsgiService(BundleContext bundleContext, Class<T> type, String filter, long timeout) {
-        ServiceTracker tracker = null;
+        ServiceTracker<T, T> tracker = null;
         try {
             String flt;
             if (filter != null) {
@@ -274,7 +299,7 @@ public final class CamelBlueprintHelper {
                 flt = "(" + Constants.OBJECTCLASS + "=" + type.getName() + ")";
             }
             Filter osgiFilter = FrameworkUtil.createFilter(flt);
-            tracker = new ServiceTracker(bundleContext, osgiFilter, null);
+            tracker = new ServiceTracker<T, T>(bundleContext, osgiFilter, null);
             tracker.open(true);
             // Note that the tracker is not closed to keep the reference
             // This is buggy, as the service reference may change i think
@@ -331,20 +356,20 @@ public final class CamelBlueprintHelper {
         if (runAndWait != null) {
             runAndWait.run();
         }
-        latch.await(CamelBlueprintHelper.DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
+        boolean found = latch.await(CamelBlueprintHelper.DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS);
         registration.unregister();
 
+        if (!found) {
+            throw new RuntimeException("Gave up waiting for BlueprintContainer from bundle \"" + symbolicName + "\"");
+        }
+
         if (pThrowable[0] != null) {
             throw new RuntimeException(pThrowable[0].getMessage(), pThrowable[0]);
         }
     }
 
-    protected static TinyBundle createTestBundle(String name, String version, String descriptors, String[] ... configAdminPidFiles) throws IOException {
+    protected static TinyBundle createConfigAdminInitBundle(String[] ... configAdminPidFiles) throws IOException {
         TinyBundle bundle = TinyBundles.newBundle();
-        for (URL url : getBlueprintDescriptors(descriptors)) {
-            LOG.info("Using Blueprint XML file: " + url.getFile());
-            bundle.add("OSGI-INF/blueprint/blueprint-" + url.getFile().replace("/", "-"), url);
-        }
         StringWriter configAdminInit = null;
         for (String[] configAdminPidFile : configAdminPidFiles) {
             if (configAdminPidFile == null) {
@@ -362,12 +387,28 @@ public final class CamelBlueprintHelper {
         bundle.add(Util.class);
         bundle.set("Manifest-Version", "2")
                 .set("Bundle-ManifestVersion", "2")
-                .set("Bundle-SymbolicName", name)
-                .set("Bundle-Version", version)
+                .set("Bundle-SymbolicName", "ConfigAdminInit")
+                .set("Bundle-Version", BUNDLE_VERSION)
                 .set("Bundle-Activator", TestBundleActivator.class.getName());
+
         if (configAdminInit != null) {
             bundle.set("X-Camel-Blueprint-ConfigAdmin-Init", configAdminInit.toString());
         }
+
+        return bundle;
+    }
+
+    protected static TinyBundle createTestBundle(String name, String version, String descriptors) throws IOException {
+        TinyBundle bundle = TinyBundles.newBundle();
+        for (URL url : getBlueprintDescriptors(descriptors)) {
+            LOG.info("Using Blueprint XML file: " + url.getFile());
+            bundle.add("OSGI-INF/blueprint/blueprint-" + url.getFile().replace("/", "-"), url);
+        }
+        bundle.set("Manifest-Version", "2")
+                .set("Bundle-ManifestVersion", "2")
+                .set("Bundle-SymbolicName", name)
+                .set("Bundle-Version", version);
+
         return bundle;
     }
 
@@ -401,8 +442,8 @@ public final class CamelBlueprintHelper {
      * @return List pointers to OSGi bundles.
      * @throws Exception If looking up the bundles fails.
      */
-    private static List<BundleDescriptor> getBundleDescriptors(final String bundleFilter) throws Exception {
-        return new ClasspathScanner().scanForBundles(bundleFilter);
+    private static List<BundleDescriptor> getBundleDescriptors(final String bundleFilter, ClassLoader loader) throws Exception {
+        return new ClasspathScanner().scanForBundles(bundleFilter, loader);
     }
 
     /**
@@ -414,10 +455,9 @@ public final class CamelBlueprintHelper {
      */
     protected static Collection<URL> getBlueprintDescriptors(String descriptors) throws FileNotFoundException, MalformedURLException {
         List<URL> answer = new ArrayList<URL>();
-        String descriptor = descriptors;
-        if (descriptor != null) {
+        if (descriptors != null) {
             // there may be more resources separated by comma
-            Iterator<Object> it = ObjectHelper.createIterator(descriptor);
+            Iterator<Object> it = ObjectHelper.createIterator(descriptors);
             while (it.hasNext()) {
                 String s = (String) it.next();
                 LOG.trace("Resource descriptor: {}", s);

http://git-wip-us.apache.org/repos/asf/camel/blob/d35f61c2/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java
----------------------------------------------------------------------
diff --git a/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java b/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java
index a0be881..3cd8c30 100644
--- a/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java
+++ b/components/camel-test-blueprint/src/main/java/org/apache/camel/test/blueprint/Main.java
@@ -42,6 +42,9 @@ public class Main extends MainSupport {
     private String configAdminPid;
     private String configAdminFileName;
 
+    // ClassLoader used to scan for bundles in CamelBlueprintHelper.createBundleContext()
+    private ClassLoader loader;
+
     public Main() {
 
         addOption(new ParameterOption("ac", "applicationContext",
@@ -141,8 +144,13 @@ public class Main extends MainSupport {
     }
 
     protected BundleContext createBundleContext(String name, String[] ... configAdminPidFiles) throws Exception {
+        return createBundleContext(name, loader, configAdminPidFiles);
+    }
+
+    protected BundleContext createBundleContext(String name, ClassLoader loader, String[] ... configAdminPidFiles) throws Exception {
         return CamelBlueprintHelper.createBundleContext(name, descriptors, isIncludeSelfAsBundle(),
-                CamelBlueprintHelper.BUNDLE_FILTER, CamelBlueprintHelper.BUNDLE_VERSION, null, configAdminPidFiles);
+                CamelBlueprintHelper.BUNDLE_FILTER, CamelBlueprintHelper.BUNDLE_VERSION, null,
+                loader, configAdminPidFiles);
     }
 
     @Override
@@ -193,4 +201,9 @@ public class Main extends MainSupport {
     public void setConfigAdminFileName(String fileName) {
         this.configAdminFileName = fileName;
     }
+
+    public void setLoader(ClassLoader loader) {
+        this.loader = loader;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d35f61c2/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MainTest.java
----------------------------------------------------------------------
diff --git a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MainTest.java b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MainTest.java
index c7a093f..eb48a1c 100644
--- a/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MainTest.java
+++ b/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/MainTest.java
@@ -17,15 +17,30 @@
 package org.apache.camel.test.blueprint;
 
 
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.StringWriter;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.Arrays;
+
+import org.apache.aries.util.io.IOUtils;
 import org.apache.camel.ProducerTemplate;
+import org.apache.camel.util.FileUtil;
+import org.apache.felix.connect.felix.framework.util.Util;
 import org.junit.Test;
+import org.ops4j.io.FileUtils;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundle;
+import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 
 public class MainTest {
-    
+
+    private static final String SYMBOLIC_NAME = "testMainWithoutIncludingTestBundle";
+
     @Test
     public void testMyMain() throws Exception {
         Main main = new Main();
@@ -48,4 +63,43 @@ public class MainTest {
         main.stop();
     }
 
+    @Test
+    public void testMainWithoutIncludingTestBundle() throws Exception {
+        TinyBundle bundle = TinyBundles.newBundle();
+        bundle.add("OSGI-INF/blueprint/camel.xml", getClass().getResourceAsStream("main-loadfile.xml"));
+        bundle.set("Manifest-Version", "2")
+                .set("Bundle-ManifestVersion", "2")
+                .set("Bundle-SymbolicName", SYMBOLIC_NAME)
+                .set("Bundle-Version", "1.0.0");
+        File tb = File.createTempFile(SYMBOLIC_NAME + "-", ".jar", new File("target"));
+        FileOutputStream out = new FileOutputStream(tb);
+        IOUtils.copy(bundle.build(), out);
+        out.close();
+
+        // simulate `camel:run` which is run after packaging the artifact, so a "bundle" (location with
+        // META-INF/MANIFEST.MF) is detected in target/classes
+        URLClassLoader loader = new URLClassLoader(new URL[] { tb.toURI().toURL() }, getClass().getClassLoader());
+
+        Main main = new Main();
+        main.setLoader(loader);
+        // bundle name will be used as filter for blueprint container filter
+        main.setBundleName(SYMBOLIC_NAME);
+        // don't include test bundle (which is what `mvn camel:run` actually does)
+        main.setIncludeSelfAsBundle(false);
+        // don't setup the blueprint file here - it'll be picked up from a bundle on classpath
+        //main.setDescriptors("none!");
+        // set the configAdmin persistent id
+        main.setConfigAdminPid("stuff");
+        // set the configAdmin persistent file name
+        main.setConfigAdminFileName("src/test/resources/etc/stuff.cfg");
+        main.doStart();
+
+        ProducerTemplate template = main.getCamelTemplate();
+        assertNotNull("We should get the template here", template);
+
+        String result = template.requestBody("direct:start", "hello", String.class);
+        assertEquals("Get a wrong response", "Bye hello", result);
+        main.stop();
+    }
+
 }