You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2011/10/08 21:03:38 UTC

svn commit: r1180461 - in /webservices/axiom/branches/osgi-redesign/modules: axiom-api/src/main/java/org/apache/axiom/locator/ axiom-dom/src/main/resources/META-INF/ axiom-impl/src/main/resources/META-INF/

Author: veithen
Date: Sat Oct  8 19:03:38 2011
New Revision: 1180461

URL: http://svn.apache.org/viewvc?rev=1180461&view=rev
Log:
Register discovered implementations as OSGi services.

Added:
    webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/RegisteredImplementation.java   (with props)
Modified:
    webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Activator.java
    webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Implementation.java
    webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/ImplementationFactory.java
    webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/OSGiOMMetaFactoryLocator.java
    webservices/axiom/branches/osgi-redesign/modules/axiom-dom/src/main/resources/META-INF/axiom.xml
    webservices/axiom/branches/osgi-redesign/modules/axiom-impl/src/main/resources/META-INF/axiom.xml

Modified: webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Activator.java
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Activator.java?rev=1180461&r1=1180460&r2=1180461&view=diff
==============================================================================
--- webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Activator.java (original)
+++ webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Activator.java Sat Oct  8 19:03:38 2011
@@ -28,7 +28,7 @@ public class Activator implements Bundle
     private BundleTracker tracker;
 
     public void start(BundleContext context) throws Exception {
-        OSGiOMMetaFactoryLocator locator = new OSGiOMMetaFactoryLocator();
+        OSGiOMMetaFactoryLocator locator = new OSGiOMMetaFactoryLocator(context);
         OMAbstractFactory.setMetaFactoryLocator(locator);
         tracker = new BundleTracker(context, Bundle.ACTIVE, locator);
         tracker.open();

Modified: webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Implementation.java
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Implementation.java?rev=1180461&r1=1180460&r2=1180461&view=diff
==============================================================================
--- webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Implementation.java (original)
+++ webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/Implementation.java Sat Oct  8 19:03:38 2011
@@ -21,14 +21,20 @@ package org.apache.axiom.locator;
 import org.apache.axiom.om.OMMetaFactory;
 
 final class Implementation {
+    private final String name;
     private final OMMetaFactory metaFactory;
     private final Feature[] features;
     
-    Implementation(OMMetaFactory metaFactory, Feature[] features) {
+    Implementation(String name, OMMetaFactory metaFactory, Feature[] features) {
+        this.name = name;
         this.metaFactory = metaFactory;
         this.features = features;
     }
 
+    String getName() {
+        return name;
+    }
+
     OMMetaFactory getMetaFactory() {
         return metaFactory;
     }

Modified: webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/ImplementationFactory.java
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/ImplementationFactory.java?rev=1180461&r1=1180460&r2=1180461&view=diff
==============================================================================
--- webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/ImplementationFactory.java (original)
+++ webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/ImplementationFactory.java Sat Oct  8 19:03:38 2011
@@ -49,7 +49,7 @@ final class ImplementationFactory {
     
     static Implementation createDefaultImplementation(Loader loader, String className) {
         OMMetaFactory metaFactory = load(loader, className);
-        return metaFactory == null ? null : new Implementation(metaFactory,
+        return metaFactory == null ? null : new Implementation(null, metaFactory,
                 new Feature[] { new Feature(OMAbstractFactory.FEATURE_DEFAULT, Integer.MAX_VALUE) });
     }
     
@@ -110,34 +110,38 @@ final class ImplementationFactory {
     }
     
     private static Implementation parseImplementation(Loader loader, Element implementation) {
+        String name = implementation.getAttributeNS(null, "name");
+        if (name.length() == 0) {
+            log.error("Encountered " + QNAME_IMPLEMENTATION + " element without name attribute");
+            return null;
+        }
         String className = implementation.getAttributeNS(null, "metaFactory");
         if (className.length() == 0) {
             log.error("Encountered " + QNAME_IMPLEMENTATION + " element without metaFactory attribute");
             return null;
-        } else {
-            OMMetaFactory metaFactory = load(loader, className);
-            if (metaFactory == null) {
-                return null;
-            }
-            List/*<Feature>*/ features = new ArrayList();
-            Node child = implementation.getFirstChild();
-            while (child != null) {
-                if (child instanceof Element) {
-                    QName childQName = getQName(child);
-                    if (childQName.equals(QNAME_FEATURE)) {
-                        Feature feature = parseFeature((Element)child);
-                        if (feature != null) {
-                            features.add(feature);
-                        }
-                    } else {
-                        log.warn("Skipping unexpected element " + childQName + "; only "
-                                + QNAME_FEATURE + " is expected");
+        }
+        OMMetaFactory metaFactory = load(loader, className);
+        if (metaFactory == null) {
+            return null;
+        }
+        List/*<Feature>*/ features = new ArrayList();
+        Node child = implementation.getFirstChild();
+        while (child != null) {
+            if (child instanceof Element) {
+                QName childQName = getQName(child);
+                if (childQName.equals(QNAME_FEATURE)) {
+                    Feature feature = parseFeature((Element)child);
+                    if (feature != null) {
+                        features.add(feature);
                     }
+                } else {
+                    log.warn("Skipping unexpected element " + childQName + "; only "
+                            + QNAME_FEATURE + " is expected");
                 }
-                child = child.getNextSibling();
             }
-            return new Implementation(metaFactory, (Feature[])features.toArray(new Feature[features.size()]));
+            child = child.getNextSibling();
         }
+        return new Implementation(name, metaFactory, (Feature[])features.toArray(new Feature[features.size()]));
     }
 
     private static Feature parseFeature(Element feature) {

Modified: webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/OSGiOMMetaFactoryLocator.java
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/OSGiOMMetaFactoryLocator.java?rev=1180461&r1=1180460&r2=1180461&view=diff
==============================================================================
--- webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/OSGiOMMetaFactoryLocator.java (original)
+++ webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/OSGiOMMetaFactoryLocator.java Sat Oct  8 19:03:38 2011
@@ -20,16 +20,26 @@ package org.apache.axiom.locator;
 
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.List;
 
 import org.apache.axiom.om.OMMetaFactory;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
 import org.osgi.util.tracker.BundleTrackerCustomizer;
 
 final class OSGiOMMetaFactoryLocator extends PriorityBasedOMMetaFactoryLocator implements BundleTrackerCustomizer {
+    private final BundleContext apiBundleContext;
     private final List/*<Implementation>*/ implementations = new ArrayList();
     
+    OSGiOMMetaFactoryLocator(BundleContext apiBundleContext) {
+        this.apiBundleContext = apiBundleContext;
+    }
+
     // Need to synchronize access because the implementations may be reloaded concurrently
     public synchronized OMMetaFactory getOMMetaFactory(String feature) {
         return super.getOMMetaFactory(feature);
@@ -38,12 +48,24 @@ final class OSGiOMMetaFactoryLocator ext
     public Object addingBundle(Bundle bundle, BundleEvent event) {
         URL descriptorUrl = bundle.getEntry(ImplementationFactory.DESCRIPTOR_RESOURCE);
         if (descriptorUrl != null) {
-            List discoveredImplementations = ImplementationFactory.parseDescriptor(new OSGiLoader(bundle), descriptorUrl);
+            List/*<Implementation>*/ discoveredImplementations = ImplementationFactory.parseDescriptor(new OSGiLoader(bundle), descriptorUrl);
+            List/*<RegisteredImplementation>*/ registeredImplementations = new ArrayList(discoveredImplementations.size());
             synchronized (this) {
                 implementations.addAll(discoveredImplementations);
                 loadImplementations(implementations);
             }
-            return discoveredImplementations;
+            for (Iterator it = discoveredImplementations.iterator(); it.hasNext(); ) {
+                Implementation implementation = (Implementation)it.next();
+                Hashtable properties = new Hashtable();
+                properties.put("implementationName", implementation.getName());
+                // TODO: we should add the features and priorities to the properties as well
+                ServiceRegistration registration = bundle.getBundleContext().registerService(OMMetaFactory.class.getName(), implementation.getMetaFactory(), properties);
+                ServiceReference reference = registration.getReference();
+                // Let the OSGi runtime know that the axiom-api bundle is using the service
+                apiBundleContext.getService(reference);
+                registeredImplementations.add(new RegisteredImplementation(implementation, registration, reference));
+            }
+            return registeredImplementations;
         } else {
             return null;
         }
@@ -54,8 +76,15 @@ final class OSGiOMMetaFactoryLocator ext
 
     public void removedBundle(Bundle bundle, BundleEvent event, Object object) {
         if (object != null) {
+            for (Iterator it = ((List)object).iterator(); it.hasNext(); ) {
+                RegisteredImplementation registeredImplementation = (RegisteredImplementation)it.next();
+                apiBundleContext.ungetService(registeredImplementation.getReference());
+                registeredImplementation.getRegistration().unregister();
+                synchronized (this) {
+                    implementations.remove(registeredImplementation.getImplementation());
+                }
+            }
             synchronized (this) {
-                implementations.removeAll((List)object);
                 loadImplementations(implementations);
             }
         }

Added: webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/RegisteredImplementation.java
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/RegisteredImplementation.java?rev=1180461&view=auto
==============================================================================
--- webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/RegisteredImplementation.java (added)
+++ webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/RegisteredImplementation.java Sat Oct  8 19:03:38 2011
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.locator;
+
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+class RegisteredImplementation {
+    private final Implementation implementation;
+    private final ServiceRegistration registration;
+    private final ServiceReference reference;
+    
+    RegisteredImplementation(Implementation implementation,
+            ServiceRegistration registration, ServiceReference reference) {
+        this.implementation = implementation;
+        this.registration = registration;
+        this.reference = reference;
+    }
+
+    Implementation getImplementation() {
+        return implementation;
+    }
+
+    ServiceRegistration getRegistration() {
+        return registration;
+    }
+
+    ServiceReference getReference() {
+        return reference;
+    }
+}

Propchange: webservices/axiom/branches/osgi-redesign/modules/axiom-api/src/main/java/org/apache/axiom/locator/RegisteredImplementation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/branches/osgi-redesign/modules/axiom-dom/src/main/resources/META-INF/axiom.xml
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/osgi-redesign/modules/axiom-dom/src/main/resources/META-INF/axiom.xml?rev=1180461&r1=1180460&r2=1180461&view=diff
==============================================================================
--- webservices/axiom/branches/osgi-redesign/modules/axiom-dom/src/main/resources/META-INF/axiom.xml (original)
+++ webservices/axiom/branches/osgi-redesign/modules/axiom-dom/src/main/resources/META-INF/axiom.xml Sat Oct  8 19:03:38 2011
@@ -18,7 +18,7 @@
   ~ under the License.
   -->
 <implementations xmlns="http://ws.apache.org/axiom/">
-    <implementation metaFactory="org.apache.axiom.om.impl.dom.factory.OMDOMMetaFactory">
+    <implementation name="doom" metaFactory="org.apache.axiom.om.impl.dom.factory.OMDOMMetaFactory">
         <feature name="dom" priority="100"/>
     </implementation>
 </implementations>
\ No newline at end of file

Modified: webservices/axiom/branches/osgi-redesign/modules/axiom-impl/src/main/resources/META-INF/axiom.xml
URL: http://svn.apache.org/viewvc/webservices/axiom/branches/osgi-redesign/modules/axiom-impl/src/main/resources/META-INF/axiom.xml?rev=1180461&r1=1180460&r2=1180461&view=diff
==============================================================================
--- webservices/axiom/branches/osgi-redesign/modules/axiom-impl/src/main/resources/META-INF/axiom.xml (original)
+++ webservices/axiom/branches/osgi-redesign/modules/axiom-impl/src/main/resources/META-INF/axiom.xml Sat Oct  8 19:03:38 2011
@@ -18,7 +18,7 @@
   ~ under the License.
   -->
 <implementations xmlns="http://ws.apache.org/axiom/">
-    <implementation metaFactory="org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory">
+    <implementation name="llom" metaFactory="org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory">
         <feature name="default" priority="100"/>
     </implementation>
 </implementations>
\ No newline at end of file