MEECROWAVE-201 ensure client and server buses can be shared

git-svn-id: https://svn.apache.org/repos/asf/openwebbeans/meecrowave/trunk@1862453 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java b/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java
index 3dbefdb..98fccbb 100644
--- a/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java
+++ b/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java
@@ -276,6 +276,9 @@
 
         final AtomicReference<Runnable> releaseSCI = new AtomicReference<>();
         final ServletContainerInitializer meecrowaveInitializer = (c, ctx1) -> {
+            ctx1.setAttribute("meecrowave.configuration", configuration);
+            ctx1.setAttribute("meecrowave.instance", Meecrowave.this);
+
             new OWBAutoSetup().onStartup(c, ctx1);
             if (Cxfs.IS_PRESENT) {
                 new CxfCdiAutoSetup().onStartup(c, ctx1);
@@ -355,8 +358,6 @@
                     ctx.getResources().setCachingAllowed(configuration.webResourceCached);
                     break;
                 case Lifecycle.BEFORE_INIT_EVENT:
-                    ctx.getServletContext().setAttribute("meecrowave.configuration", configuration);
-                    ctx.getServletContext().setAttribute("meecrowave.instance", Meecrowave.this);
                     if (configuration.loginConfig != null) {
                         ctx.setLoginConfig(configuration.loginConfig.build());
                     }
@@ -808,6 +809,10 @@
         }
     }
 
+    public ConfigurableBus getClientBus() {
+        return clientBus;
+    }
+
     /**
      * Store away the current system property for restoring it later
      * during shutdown.
diff --git a/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java b/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java
index ecdb2c4..cf73320 100644
--- a/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java
+++ b/meecrowave-core/src/main/java/org/apache/meecrowave/cxf/MeecrowaveBus.java
@@ -39,23 +39,32 @@
 @Typed({MeecrowaveBus.class, Bus.class})
 @ApplicationScoped
 public class MeecrowaveBus implements Bus, ClassUnwrapper {
-    private final ConfigurableBus delegate = new ConfigurableBus();
+    private final ConfigurableBus delegate;
 
     protected MeecrowaveBus() {
-        // no-op: for proxies
+        delegate= null;
     }
 
     @Inject
     public MeecrowaveBus(final ServletContext context) {
-        setProperty(ClassUnwrapper.class.getName(), this);
-
         final ClassLoader appLoader = context.getClassLoader();
-        setExtension(appLoader, ClassLoader.class); // ServletController locks on the classloader otherwise
 
+        final Meecrowave meecrowave = Meecrowave.class.cast(context.getAttribute("meecrowave.instance"));
         final Meecrowave.Builder builder = Meecrowave.Builder.class.cast(context.getAttribute("meecrowave.configuration"));
-        if (builder != null && builder.isJaxrsProviderSetup()) {
-            delegate.initProviders(builder, appLoader);
+        if (meecrowave.getClientBus() == null) {
+            delegate = new ConfigurableBus();
+            if (builder != null && builder.isJaxrsProviderSetup()) {
+                delegate.initProviders(builder, appLoader);
+            }
+        } else {
+            delegate = meecrowave.getClientBus();
+            if (builder != null && !builder.isInitializeClientBus() && builder.isJaxrsProviderSetup()) {
+                delegate.initProviders(builder, appLoader);
+            }
         }
+
+        setProperty(ClassUnwrapper.class.getName(), this);
+        setExtension(appLoader, ClassLoader.class); // ServletController locks on the classloader otherwise
     }
 
 
diff --git a/meecrowave-core/src/test/java/org/apache/meecrowave/johnzon/JohnzonBufferTest.java b/meecrowave-core/src/test/java/org/apache/meecrowave/johnzon/JohnzonBufferTest.java
index 4b709a3..c84a11f 100644
--- a/meecrowave-core/src/test/java/org/apache/meecrowave/johnzon/JohnzonBufferTest.java
+++ b/meecrowave-core/src/test/java/org/apache/meecrowave/johnzon/JohnzonBufferTest.java
@@ -40,7 +40,7 @@
                         .request(MediaType.APPLICATION_JSON)
                         .get(String.class);
                 assertEquals("{\"isbn\":\"dummyisbn\"}", jsonResponse);
-                //X TODO work in progress! assertEquals(1, DebugJohnzonBufferStrategy.getCounter());
+                assertEquals(3, DebugJohnzonBufferStrategy.getCounter()); // reader fact -> parser fact (2 buffers) + writer -> generator (1 buffer)
             } finally {
                 client.close();
             }