You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by cs...@apache.org on 2012/01/16 16:43:59 UTC
svn commit: r1232037 -
/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/
Author: cschneider
Date: Mon Jan 16 15:43:58 2012
New Revision: 1232037
URL: http://svn.apache.org/viewvc?rev=1232037&view=rev
Log:
CXF-3983 Backport to 2.5.x
Added:
cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java
- copied, changed from r1231980, cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiExtensionLocator.java
cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFExtensionBundleListener.java
cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGIBusListener.java
cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiBeanLocator.java
cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/WorkQueueSingleConfig.java
Removed:
cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiExtensionLocator.java
Modified:
cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/ManagedWorkQueueList.java
Copied: cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java (from r1231980, cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiExtensionLocator.java)
URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java?p2=cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java&p1=cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiExtensionLocator.java&r1=1231980&r2=1232037&rev=1232037&view=diff
==============================================================================
--- cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiExtensionLocator.java (original)
+++ cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFActivator.java Mon Jan 16 15:43:58 2012
@@ -19,101 +19,78 @@
package org.apache.cxf.bus.osgi;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Dictionary;
-import java.util.Enumeration;
import java.util.List;
import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.logging.Logger;
-import org.apache.cxf.Bus;
import org.apache.cxf.bus.extension.Extension;
-import org.apache.cxf.bus.extension.ExtensionFragmentParser;
-import org.apache.cxf.bus.extension.ExtensionManagerImpl;
import org.apache.cxf.bus.extension.ExtensionRegistry;
-import org.apache.cxf.buslifecycle.BusCreationListener;
-import org.apache.cxf.buslifecycle.BusLifeCycleListener;
-import org.apache.cxf.buslifecycle.BusLifeCycleManager;
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.configuration.ConfiguredBeanLocator;
-import org.apache.cxf.endpoint.ClientLifeCycleListener;
-import org.apache.cxf.endpoint.ClientLifeCycleManager;
-import org.apache.cxf.endpoint.ServerLifeCycleListener;
-import org.apache.cxf.endpoint.ServerLifeCycleManager;
-import org.apache.cxf.workqueue.AutomaticWorkQueueImpl;
-import org.apache.cxf.workqueue.WorkQueueManager;
-import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
import org.osgi.framework.Constants;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
-import org.osgi.framework.SynchronousBundleListener;
-import org.osgi.framework.Version;
import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ManagedService;
import org.osgi.service.cm.ManagedServiceFactory;
import org.osgi.util.tracker.ServiceTracker;
/**
- *
+ * Is called in OSGi on start and stop of the cxf bundle.
+ * Manages
+ * - CXFBundleListener
+ * - Attaching ManagedWorkqueues tio config admin service
+ * - OsgiBusListener
*/
-public class OSGiExtensionLocator implements BundleActivator, SynchronousBundleListener {
- private static final Logger LOG = LogUtils.getL7dLogger(OSGiExtensionLocator.class);
- private ConcurrentMap<Long, List<Extension>> extensions
- = new ConcurrentHashMap<Long, List<Extension>>();
- private long id;
- private Extension listener;
-
+public class CXFActivator implements BundleActivator {
+ private List<Extension> extensions;
private ManagedWorkQueueList workQueues = new ManagedWorkQueueList();
private ServiceTracker configAdminTracker;
-
- /** {@inheritDoc}*/
- public void bundleChanged(BundleEvent event) {
- if (event.getType() == BundleEvent.RESOLVED && id != event.getBundle().getBundleId()) {
- try {
- register(event.getBundle());
- } catch (Exception ex) {
- //ignore
- }
- } else if (event.getType() == BundleEvent.UNRESOLVED || event.getType() == BundleEvent.UNINSTALLED) {
- unregister(event.getBundle().getBundleId());
- }
- }
+ private CXFExtensionBundleListener cxfBundleListener;
+ private ServiceRegistration workQueueServiceRegistration;
+ private ServiceRegistration wqSingleConfigRegistratin;
/** {@inheritDoc}*/
+ @SuppressWarnings("deprecation")
public void start(BundleContext context) throws Exception {
- context.addBundleListener(this);
- id = context.getBundle().getBundleId();
- registerBusListener(context);
- for (Bundle bundle : context.getBundles()) {
- if ((bundle.getState() == Bundle.RESOLVED
- || bundle.getState() == Bundle.STARTING
- || bundle.getState() == Bundle.ACTIVE
- || bundle.getState() == Bundle.STOPPING)
- && bundle.getBundleId() != context.getBundle().getBundleId()) {
- register(bundle);
- }
- }
-
+ cxfBundleListener = new CXFExtensionBundleListener(context.getBundle().getBundleId());
+ context.addBundleListener(cxfBundleListener);
+ cxfBundleListener.registerExistingBundles(context);
+
configAdminTracker = new ServiceTracker(context, ConfigurationAdmin.class.getName(), null);
configAdminTracker.open();
workQueues.setConfigAdminTracker(configAdminTracker);
+ workQueueServiceRegistration = registerManagedServiceFactory(context, ManagedServiceFactory.class,
+ workQueues,
+ ManagedWorkQueueList.FACTORY_PID);
+
+ WorkQueueSingleConfig wqSingleConfig = new WorkQueueSingleConfig(workQueues);
+ wqSingleConfigRegistratin = registerManagedServiceFactory(context, ManagedService.class,
+ wqSingleConfig,
+ WorkQueueSingleConfig.SERVICE_PID);
+
+ extensions = new ArrayList<Extension>();
+ extensions.add(createOsgiBusListenerExtension(context));
+ extensions.add(createManagedWorkQueueListExtension(workQueues));
+ ExtensionRegistry.addExtensions(extensions);
+ }
+ private ServiceRegistration registerManagedServiceFactory(BundleContext context,
+ Class<?> serviceClass,
+ Object service,
+ String servicePid) {
Properties props = new Properties();
- props.put(Constants.SERVICE_PID, workQueues.getName());
- context.registerService(ManagedServiceFactory.class.getName(), workQueues, props);
+ props.put(Constants.SERVICE_PID, servicePid);
+ return context.registerService(serviceClass.getName(), service, props);
+ }
+
+ private Extension createOsgiBusListenerExtension(BundleContext context) {
+ Extension busListener = new Extension(OSGIBusListener.class);
+ busListener.setArgs(new Object[] {context});
+ return busListener;
+ }
- Extension ext = new Extension(ManagedWorkQueueList.class) {
+ private static Extension createManagedWorkQueueListExtension(final ManagedWorkQueueList workQueues) {
+ return new Extension(ManagedWorkQueueList.class) {
public Object getLoadedObject() {
return workQueues;
}
@@ -122,268 +99,17 @@ public class OSGiExtensionLocator implem
return this;
}
};
- ExtensionRegistry.addExtensions(Collections.singletonList(ext));
-
}
/** {@inheritDoc}*/
public void stop(BundleContext context) throws Exception {
- context.removeBundleListener(this);
- unregisterBusListener();
- while (!extensions.isEmpty()) {
- unregister(extensions.keySet().iterator().next());
- }
- for (AutomaticWorkQueueImpl wq : workQueues.queues.values()) {
- wq.setShared(false);
- wq.shutdown(true);
- }
- workQueues.queues.clear();
+ context.removeBundleListener(cxfBundleListener);
+ cxfBundleListener.shutdown();
+ workQueues.shutDown();
+ workQueueServiceRegistration.unregister();
+ wqSingleConfigRegistratin.unregister();
configAdminTracker.close();
- }
- private void registerBusListener(final BundleContext context) {
- listener = new Extension(OSGIBusListener.class);
- listener.setArgs(new Object[] {context});
- ExtensionRegistry.addExtensions(Collections.singletonList(listener));
- }
- private void unregisterBusListener() {
- ExtensionRegistry.removeExtensions(Collections.singletonList(listener));
- listener = null;
- }
-
- protected void register(final Bundle bundle) throws IOException {
- List<Extension> list = extensions.get(bundle.getBundleId());
- Enumeration e = bundle.findEntries("META-INF/cxf/", "bus-extensions.txt", false);
- if (e != null) {
- while (e.hasMoreElements()) {
- final URL u = (URL)e.nextElement();
- InputStream ins = u.openStream();
- List<Extension> orig = new ExtensionFragmentParser()
- .getExtensionsFromText(ins);
- ins.close();
- LOG.info("Loading the extension from bundle " + bundle.getBundleId());
- if (orig != null && !orig.isEmpty()) {
- if (list == null) {
- list = new CopyOnWriteArrayList<Extension>();
- extensions.put(bundle.getBundleId(), list);
- }
- for (Extension ext : orig) {
- list.add(new OSGiExtension(ext, bundle));
- }
- ExtensionRegistry.addExtensions(list);
- }
- }
- }
- }
- protected void unregister(final long bundleId) {
- List<Extension> list = extensions.remove(bundleId);
- if (list != null) {
- LOG.info("Removed the extensions for bundle " + bundleId);
- ExtensionRegistry.removeExtensions(list);
- }
- }
-
- public static class OSGIBusListener implements BusLifeCycleListener {
- public static final String CONTEXT_SYMBOLIC_NAME_PROPERTY = "cxf.context.symbolicname";
- public static final String CONTEXT_VERSION_PROPERTY = "cxf.context.version";
- public static final String CONTEXT_NAME_PROPERTY = "cxf.bus.id";
-
- Bus bus;
- ServiceRegistration service;
- BundleContext defaultContext;
-
- public OSGIBusListener(Bus b) {
- this(b, null);
- }
- public OSGIBusListener(Bus b, Object args[]) {
- bus = b;
- if (args != null && args.length > 0
- && args[0] instanceof BundleContext) {
- defaultContext = (BundleContext)args[0];
- }
- BusLifeCycleManager manager = bus.getExtension(BusLifeCycleManager.class);
- manager.registerLifeCycleListener(this);
- final ConfiguredBeanLocator cbl = bus.getExtension(ConfiguredBeanLocator.class);
- if (cbl instanceof ExtensionManagerImpl) {
- // wire in the OSGi things
- bus.setExtension(new OSGiBeanLocator(cbl, defaultContext),
- ConfiguredBeanLocator.class);
- }
-
- try {
- ServiceReference refs[] = defaultContext
- .getServiceReferences(ClientLifeCycleListener.class.getName(), null);
- if (refs != null) {
- ClientLifeCycleManager clcm = bus.getExtension(ClientLifeCycleManager.class);
- for (ServiceReference ref : refs) {
- if (allowService(ref)) {
- ClientLifeCycleListener listener
- = (ClientLifeCycleListener)defaultContext.getService(ref);
- clcm.registerListener(listener);
- }
- }
- }
- } catch (InvalidSyntaxException e) {
- //ignore
- }
- try {
- ServiceReference refs[] = defaultContext
- .getServiceReferences(ServerLifeCycleListener.class.getName(), null);
- if (refs != null) {
- ServerLifeCycleManager clcm = bus.getExtension(ServerLifeCycleManager.class);
- for (ServiceReference ref : refs) {
- if (allowService(ref)) {
- ServerLifeCycleListener listener
- = (ServerLifeCycleListener)defaultContext.getService(ref);
- clcm.registerListener(listener);
- }
- }
- }
-
- } catch (InvalidSyntaxException e) {
- //ignore
- }
- try {
- ServiceReference refs[] = defaultContext
- .getServiceReferences(BusCreationListener.class.getName(), null);
- if (refs != null) {
- for (ServiceReference ref : refs) {
- if (allowService(ref)) {
- BusCreationListener listener
- = (BusCreationListener)defaultContext.getService(ref);
- listener.busCreated(bus);
- }
- }
- }
- } catch (InvalidSyntaxException e) {
- //ignore
- }
-
- }
-
- private boolean allowService(ServiceReference ref) {
- Object o = ref.getProperty("org.apache.cxf.bus.private.extension");
- Boolean pvt = Boolean.FALSE;
- if (o == null) {
- pvt = Boolean.FALSE;
- } else if (o instanceof String) {
- pvt = Boolean.parseBoolean((String)o);
- } else if (o instanceof Boolean) {
- pvt = (Boolean)o;
- }
- return !pvt.booleanValue();
- }
- private Version getBundleVersion(Bundle bundle) {
- Dictionary headers = bundle.getHeaders();
- String version = (String) headers.get(Constants.BUNDLE_VERSION);
- return (version != null) ? Version.parseVersion(version) : Version.emptyVersion;
- }
-
- public void initComplete() {
- WorkQueueManager m = bus.getExtension(WorkQueueManager.class);
- ManagedWorkQueueList l = bus.getExtension(ManagedWorkQueueList.class);
- if (l != null && m != null) {
- for (AutomaticWorkQueueImpl wq : l.queues.values()) {
- if (m.getNamedWorkQueue(wq.getName()) == null) {
- m.addNamedWorkQueue(wq.getName(), wq);
- }
- }
- }
-
- BundleContext context = bus.getExtension(BundleContext.class);
- if (context != null) {
- Properties props = new Properties();
- props.put(CONTEXT_SYMBOLIC_NAME_PROPERTY, context.getBundle().getSymbolicName());
- props.put(CONTEXT_VERSION_PROPERTY, getBundleVersion(context.getBundle()));
- props.put(CONTEXT_NAME_PROPERTY, bus.getId());
-
- service = context.registerService(Bus.class.getName(), bus, props);
- }
- }
- public void preShutdown() {
- }
- public void postShutdown() {
- if (service != null) {
- service.unregister();
- service = null;
- }
- }
- }
-
- public static class OSGiBeanLocator implements ConfiguredBeanLocator {
- final ConfiguredBeanLocator cbl;
- final BundleContext context;
- public OSGiBeanLocator(ConfiguredBeanLocator c, BundleContext ctx) {
- cbl = c;
- context = ctx;
- }
- public <T> T getBeanOfType(String name, Class<T> type) {
- return cbl.getBeanOfType(name, type);
- }
- public <T> Collection<? extends T> getBeansOfType(Class<T> type) {
- Collection<? extends T> ret = cbl.getBeansOfType(type);
-
- if (ret == null || ret.isEmpty()) {
- List<T> list = new ArrayList<T>();
- try {
- ServiceReference refs[] = context.getServiceReferences(type.getName(), null);
- if (refs != null) {
- for (ServiceReference r : refs) {
- list.add(type.cast(context.getService(r)));
- }
- }
- if (!list.isEmpty()) {
- return list;
- }
- } catch (Exception ex) {
- //ignore, just don't support the OSGi services
- LOG.info("Try to find the Bean with type:" + type
- + " from OSGi services and get error: " + ex);
- }
- }
- return ret;
- }
- public <T> boolean loadBeansOfType(Class<T> type, BeanLoaderListener<T> listener) {
- return cbl.loadBeansOfType(type, listener);
- }
- public boolean hasConfiguredPropertyValue(String beanName, String propertyName,
- String value) {
- return cbl.hasConfiguredPropertyValue(beanName, propertyName, value);
- }
- public List<String> getBeanNamesOfType(Class<?> type) {
- return cbl.getBeanNamesOfType(type);
- }
- }
-
- public class OSGiExtension extends Extension {
- final Bundle bundle;
- public OSGiExtension(Extension e, Bundle b) {
- super(e);
- bundle = b;
- }
- public Class<?> getClassObject(ClassLoader cl) {
- if (clazz == null) {
- try {
- clazz = bundle.loadClass(className);
- } catch (ClassNotFoundException e) {
- //ignore, fall to super
- }
- }
- return super.getClassObject(cl);
- }
- public Class<?> loadInterface(ClassLoader cl) {
- try {
- return bundle.loadClass(interfaceName);
- } catch (ClassNotFoundException e) {
- //ignore, fall to super
- }
- return super.loadInterface(cl);
- }
- public Extension cloneNoObject() {
- OSGiExtension ext = new OSGiExtension(this, bundle);
- ext.obj = null;
- return ext;
- }
-
+ ExtensionRegistry.removeExtensions(extensions);
}
}
Added: cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFExtensionBundleListener.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFExtensionBundleListener.java?rev=1232037&view=auto
==============================================================================
--- cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFExtensionBundleListener.java (added)
+++ cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/CXFExtensionBundleListener.java Mon Jan 16 15:43:58 2012
@@ -0,0 +1,149 @@
+/**
+ * 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.cxf.bus.osgi;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Logger;
+
+import org.apache.cxf.bus.extension.Extension;
+import org.apache.cxf.bus.extension.ExtensionFragmentParser;
+import org.apache.cxf.bus.extension.ExtensionRegistry;
+import org.apache.cxf.common.logging.LogUtils;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.SynchronousBundleListener;
+
+public class CXFExtensionBundleListener implements SynchronousBundleListener {
+ private static final Logger LOG = LogUtils.getL7dLogger(CXFActivator.class);
+ private long id;
+ private ConcurrentMap<Long, List<Extension>> extensions = new ConcurrentHashMap<Long, List<Extension>>();
+
+ public CXFExtensionBundleListener(long bundleId) {
+ this.id = bundleId;
+ }
+
+ public void registerExistingBundles(BundleContext context) throws IOException {
+ for (Bundle bundle : context.getBundles()) {
+ if ((bundle.getState() == Bundle.RESOLVED
+ || bundle.getState() == Bundle.STARTING
+ || bundle.getState() == Bundle.ACTIVE
+ || bundle.getState() == Bundle.STOPPING)
+ && bundle.getBundleId() != context.getBundle().getBundleId()) {
+ register(bundle);
+ }
+ }
+ }
+
+ /** {@inheritDoc}*/
+ public void bundleChanged(BundleEvent event) {
+ if (event.getType() == BundleEvent.RESOLVED && id != event.getBundle().getBundleId()) {
+ register(event.getBundle());
+ } else if (event.getType() == BundleEvent.UNRESOLVED || event.getType() == BundleEvent.UNINSTALLED) {
+ unregister(event.getBundle().getBundleId());
+ }
+ }
+
+ protected void register(final Bundle bundle) {
+ Enumeration<?> e = bundle.findEntries("META-INF/cxf/", "bus-extensions.txt", false);
+ while (e != null && e.hasMoreElements()) {
+ final URL u = (URL)e.nextElement();
+ try {
+ InputStream ins = u.openStream();
+ List<Extension> orig = new ExtensionFragmentParser().getExtensionsFromText(ins);
+ ins.close();
+ addExtensions(bundle, orig);
+ } catch (IOException ex) {
+ LOG.severe("Error installing extension " + u + " " + ex.getMessage());
+ }
+ }
+ }
+
+ private void addExtensions(final Bundle bundle, List<Extension> orig) {
+ if (orig.isEmpty()) {
+ return;
+ }
+ LOG.info("Adding the extension from bundle " + bundle.getBundleId());
+ List<Extension> list = extensions.get(bundle.getBundleId());
+ if (list == null) {
+ list = new CopyOnWriteArrayList<Extension>();
+ extensions.put(bundle.getBundleId(), list);
+ }
+ for (Extension ext : orig) {
+ list.add(new OSGiExtension(ext, bundle));
+ }
+ ExtensionRegistry.addExtensions(list);
+ }
+
+ protected void unregister(final long bundleId) {
+ List<Extension> list = extensions.remove(bundleId);
+ if (list != null) {
+ LOG.info("Removing the extensions for bundle " + bundleId);
+ ExtensionRegistry.removeExtensions(list);
+ }
+ }
+
+ public void shutdown() {
+ while (!extensions.isEmpty()) {
+ unregister(extensions.keySet().iterator().next());
+ }
+ }
+
+ public class OSGiExtension extends Extension {
+ final Bundle bundle;
+ public OSGiExtension(Extension e, Bundle b) {
+ super(e);
+ bundle = b;
+ }
+
+ public Class<?> getClassObject(ClassLoader cl) {
+ if (clazz == null) {
+ try {
+ clazz = bundle.loadClass(className);
+ } catch (ClassNotFoundException e) {
+ //ignore, fall to super
+ }
+ }
+ return super.getClassObject(cl);
+ }
+
+ public Class<?> loadInterface(ClassLoader cl) {
+ try {
+ return bundle.loadClass(interfaceName);
+ } catch (ClassNotFoundException e) {
+ //ignore, fall to super
+ }
+ return super.loadInterface(cl);
+ }
+
+ public Extension cloneNoObject() {
+ OSGiExtension ext = new OSGiExtension(this, bundle);
+ ext.obj = null;
+ return ext;
+ }
+
+ }
+}
Modified: cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/ManagedWorkQueueList.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/ManagedWorkQueueList.java?rev=1232037&r1=1232036&r2=1232037&view=diff
==============================================================================
--- cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/ManagedWorkQueueList.java (original)
+++ cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/ManagedWorkQueueList.java Mon Jan 16 15:43:58 2012
@@ -1,106 +1,132 @@
-/**
- * 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.cxf.bus.osgi;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.Dictionary;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.service.factory.AbstractServiceFactoryBean;
-import org.apache.cxf.workqueue.AutomaticWorkQueueImpl;
-import org.osgi.service.cm.Configuration;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.cm.ConfigurationException;
-import org.osgi.service.cm.ManagedServiceFactory;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- * List of work queues that cane be managed using the OSGi config admin service
- */
-public class ManagedWorkQueueList implements ManagedServiceFactory, PropertyChangeListener {
- public static final String FACTORY_PID = "org.apache.cxf.workqueues";
- private static final Logger LOG = LogUtils.getL7dLogger(AbstractServiceFactoryBean.class);
-
- Map<String, AutomaticWorkQueueImpl> queues = new ConcurrentHashMap<String, AutomaticWorkQueueImpl>();
- private ServiceTracker configAdminTracker;
-
- public String getName() {
- return FACTORY_PID;
- }
-
- public void updated(String pid, Dictionary properties) throws ConfigurationException {
- if (pid == null) {
- return;
- }
- String queueName = (String)properties.get(AutomaticWorkQueueImpl.PROPERTY_NAME);
- if (queues.containsKey(queueName)) {
- queues.get(queueName).update(properties);
- } else {
- AutomaticWorkQueueImpl wq = new AutomaticWorkQueueImpl(queueName);
- wq.setShared(true);
- wq.update(properties);
- wq.addChangeListener(this);
- queues.put(pid, wq);
- }
- }
-
- public void deleted(String pid) {
- queues.remove(pid);
- }
-
- public void propertyChange(PropertyChangeEvent evt) {
- try {
- AutomaticWorkQueueImpl queue = (AutomaticWorkQueueImpl)evt.getSource();
- ConfigurationAdmin configurationAdmin = (ConfigurationAdmin)configAdminTracker.getService();
- if (configurationAdmin != null) {
- Configuration selectedConfig = findConfigForQueueName(queue, configurationAdmin);
- if (selectedConfig != null) {
- Dictionary properties = queue.getProperties();
- selectedConfig.update(properties);
- }
- }
- } catch (Exception e) {
- LOG.log(Level.WARNING, e.getMessage(), e);
- }
- }
-
- private Configuration findConfigForQueueName(AutomaticWorkQueueImpl queue,
- ConfigurationAdmin configurationAdmin) throws Exception {
- Configuration selectedConfig = null;
- String filter = "(service.factoryPid=" + ManagedWorkQueueList.FACTORY_PID + ")";
- Configuration[] configs = configurationAdmin.listConfigurations(filter);
- for (Configuration configuration : configs) {
- Dictionary props = configuration.getProperties();
- String name = (String)props.get(AutomaticWorkQueueImpl.PROPERTY_NAME);
- if (queue.getName().equals(name)) {
- selectedConfig = configuration;
- }
- }
- return selectedConfig;
- }
-
- public void setConfigAdminTracker(ServiceTracker configAdminTracker) {
- this.configAdminTracker = configAdminTracker;
- }
+/**
+ * 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.cxf.bus.osgi;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.workqueue.AutomaticWorkQueueImpl;
+import org.apache.cxf.workqueue.WorkQueueManager;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedServiceFactory;
+import org.osgi.util.tracker.ServiceTracker;
+
+/**
+ * List of work queues that can be managed using the OSGi configuration admin service
+ */
+public class ManagedWorkQueueList implements ManagedServiceFactory, PropertyChangeListener {
+ public static final String FACTORY_PID = "org.apache.cxf.workqueues";
+ private static final Logger LOG = LogUtils.getL7dLogger(ManagedWorkQueueList.class);
+
+ private Map<String, AutomaticWorkQueueImpl> queues =
+ new ConcurrentHashMap<String, AutomaticWorkQueueImpl>();
+ private ServiceTracker configAdminTracker;
+
+ public String getName() {
+ return FACTORY_PID;
+ }
+
+ public void updated(String pid, @SuppressWarnings("rawtypes") Dictionary props)
+ throws ConfigurationException {
+ if (pid == null) {
+ return;
+ }
+ Dictionary<String, String> properties = CastUtils.cast(props);
+ String queueName = properties.get(AutomaticWorkQueueImpl.PROPERTY_NAME);
+ if (queues.containsKey(queueName)) {
+ queues.get(queueName).update(properties);
+ } else {
+ AutomaticWorkQueueImpl wq = new AutomaticWorkQueueImpl(queueName);
+ wq.setShared(true);
+ wq.update(properties);
+ wq.addChangeListener(this);
+ queues.put(pid, wq);
+ }
+ }
+
+ public void deleted(String pid) {
+ queues.remove(pid);
+ }
+
+ /*
+ * On property changes of queue settings we update the config admin service pid of the queue
+ */
+ public void propertyChange(PropertyChangeEvent evt) {
+ try {
+ AutomaticWorkQueueImpl queue = (AutomaticWorkQueueImpl)evt.getSource();
+ ConfigurationAdmin configurationAdmin = (ConfigurationAdmin)configAdminTracker.getService();
+ if (configurationAdmin != null) {
+ Configuration selectedConfig = findConfigForQueueName(queue, configurationAdmin);
+ if (selectedConfig != null) {
+ Dictionary<String, String> properties = queue.getProperties();
+ selectedConfig.update(properties);
+ }
+ }
+ } catch (Exception e) {
+ LOG.log(Level.WARNING, e.getMessage(), e);
+ }
+ }
+
+ private Configuration findConfigForQueueName(AutomaticWorkQueueImpl queue,
+ ConfigurationAdmin configurationAdmin) throws Exception {
+ Configuration selectedConfig = null;
+ String filter = "(service.factoryPid=" + ManagedWorkQueueList.FACTORY_PID + ")";
+ Configuration[] configs = configurationAdmin.listConfigurations(filter);
+ for (Configuration configuration : configs) {
+ @SuppressWarnings("rawtypes")
+ Dictionary props = configuration.getProperties();
+ String name = (String)props.get(AutomaticWorkQueueImpl.PROPERTY_NAME);
+ if (queue.getName().equals(name)) {
+ selectedConfig = configuration;
+ }
+ }
+ return selectedConfig;
+ }
+
+ public void addAllToWorkQueueManager(WorkQueueManager manager) {
+ if (manager != null) {
+ for (AutomaticWorkQueueImpl wq : queues.values()) {
+ if (manager.getNamedWorkQueue(wq.getName()) == null) {
+ manager.addNamedWorkQueue(wq.getName(), wq);
+ }
+ }
+ }
+ }
+
+ public void setConfigAdminTracker(ServiceTracker configAdminTracker) {
+ this.configAdminTracker = configAdminTracker;
+ }
+
+ public void shutDown() {
+ for (AutomaticWorkQueueImpl wq : queues.values()) {
+ wq.setShared(false);
+ wq.shutdown(true);
+ }
+ queues.clear();
+ }
}
\ No newline at end of file
Added: cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGIBusListener.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGIBusListener.java?rev=1232037&view=auto
==============================================================================
--- cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGIBusListener.java (added)
+++ cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGIBusListener.java Mon Jan 16 15:43:58 2012
@@ -0,0 +1,177 @@
+/**
+ * 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.cxf.bus.osgi;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.bus.extension.ExtensionManagerImpl;
+import org.apache.cxf.buslifecycle.BusCreationListener;
+import org.apache.cxf.buslifecycle.BusLifeCycleListener;
+import org.apache.cxf.buslifecycle.BusLifeCycleManager;
+import org.apache.cxf.configuration.ConfiguredBeanLocator;
+import org.apache.cxf.endpoint.ClientLifeCycleListener;
+import org.apache.cxf.endpoint.ClientLifeCycleManager;
+import org.apache.cxf.endpoint.ServerLifeCycleListener;
+import org.apache.cxf.endpoint.ServerLifeCycleManager;
+import org.apache.cxf.workqueue.WorkQueueManager;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.framework.Version;
+
+public class OSGIBusListener implements BusLifeCycleListener {
+ public static final String CONTEXT_SYMBOLIC_NAME_PROPERTY = "cxf.context.symbolicname";
+ public static final String CONTEXT_VERSION_PROPERTY = "cxf.context.version";
+ public static final String CONTEXT_NAME_PROPERTY = "cxf.bus.id";
+
+ private static final String SERVICE_PROPERTY_PRIVATE = "org.apache.cxf.bus.private.extension";
+
+ Bus bus;
+ ServiceRegistration service;
+ BundleContext defaultContext;
+
+ public OSGIBusListener(Bus b) {
+ this(b, null);
+ }
+ public OSGIBusListener(Bus b, Object args[]) {
+ bus = b;
+ if (args != null && args.length > 0
+ && args[0] instanceof BundleContext) {
+ defaultContext = (BundleContext)args[0];
+ }
+ BusLifeCycleManager manager = bus.getExtension(BusLifeCycleManager.class);
+ manager.registerLifeCycleListener(this);
+ registerConfiguredBeanLocator();
+ registerClientLifeCycleListeners();
+ registerServerLifecycleListeners();
+ sendBusCreatedToBusCreationListeners();
+
+ }
+ private void registerConfiguredBeanLocator() {
+ final ConfiguredBeanLocator cbl = bus.getExtension(ConfiguredBeanLocator.class);
+ if (cbl instanceof ExtensionManagerImpl) {
+ // wire in the OSGi things
+ bus.setExtension(new OSGiBeanLocator(cbl, defaultContext),
+ ConfiguredBeanLocator.class);
+ }
+ }
+
+ public void initComplete() {
+ WorkQueueManager manager = bus.getExtension(WorkQueueManager.class);
+ ManagedWorkQueueList wqList = bus.getExtension(ManagedWorkQueueList.class);
+ if (wqList != null) {
+ wqList.addAllToWorkQueueManager(manager);
+ }
+ registerBusAsService();
+ }
+
+
+ public void preShutdown() {
+ }
+
+ public void postShutdown() {
+ if (service != null) {
+ service.unregister();
+ service = null;
+ }
+ }
+
+ private static ServiceReference[] getServiceReferences(BundleContext context, Class<?> serviceClass) {
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(serviceClass.getName(), null);
+ } catch (InvalidSyntaxException e) {
+ // ignore
+ }
+ if (refs == null) {
+ refs = new ServiceReference[]{};
+ }
+ return refs;
+ }
+
+ private void sendBusCreatedToBusCreationListeners() {
+ ServiceReference refs[] = getServiceReferences(defaultContext, BusCreationListener.class);
+ for (ServiceReference ref : refs) {
+ if (!isPrivate(ref)) {
+ BusCreationListener listener = (BusCreationListener)defaultContext.getService(ref);
+ listener.busCreated(bus);
+ }
+ }
+ }
+
+ private void registerServerLifecycleListeners() {
+ ServiceReference refs[] = getServiceReferences(defaultContext, ServerLifeCycleListener.class);
+ ServerLifeCycleManager clcm = bus.getExtension(ServerLifeCycleManager.class);
+ for (ServiceReference ref : refs) {
+ if (!isPrivate(ref)) {
+ ServerLifeCycleListener listener = (ServerLifeCycleListener)defaultContext.getService(ref);
+ clcm.registerListener(listener);
+ }
+ }
+ }
+ private void registerClientLifeCycleListeners() {
+ ServiceReference refs[] = getServiceReferences(defaultContext, ClientLifeCycleListener.class);
+ ClientLifeCycleManager clcm = bus.getExtension(ClientLifeCycleManager.class);
+ for (ServiceReference ref : refs) {
+ if (!isPrivate(ref)) {
+ ClientLifeCycleListener listener = (ClientLifeCycleListener)defaultContext.getService(ref);
+ clcm.registerListener(listener);
+ }
+ }
+ }
+
+ private boolean isPrivate(ServiceReference ref) {
+ Object o = ref.getProperty(SERVICE_PROPERTY_PRIVATE);
+ Boolean pvt = Boolean.FALSE;
+ if (o == null) {
+ pvt = Boolean.FALSE;
+ } else if (o instanceof String) {
+ pvt = Boolean.parseBoolean((String)o);
+ } else if (o instanceof Boolean) {
+ pvt = (Boolean)o;
+ }
+ return pvt.booleanValue();
+ }
+
+ private Version getBundleVersion(Bundle bundle) {
+ Dictionary<?, ?> headers = bundle.getHeaders();
+ String version = (String) headers.get(Constants.BUNDLE_VERSION);
+ return (version != null) ? Version.parseVersion(version) : Version.emptyVersion;
+ }
+
+
+
+ private void registerBusAsService() {
+ BundleContext context = bus.getExtension(BundleContext.class);
+ if (context != null) {
+ Properties props = new Properties();
+ props.put(CONTEXT_SYMBOLIC_NAME_PROPERTY, context.getBundle().getSymbolicName());
+ props.put(CONTEXT_VERSION_PROPERTY, getBundleVersion(context.getBundle()));
+ props.put(CONTEXT_NAME_PROPERTY, bus.getId());
+
+ service = context.registerService(Bus.class.getName(), bus, props);
+ }
+ }
+
+}
\ No newline at end of file
Added: cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiBeanLocator.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiBeanLocator.java?rev=1232037&view=auto
==============================================================================
--- cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiBeanLocator.java (added)
+++ cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/OSGiBeanLocator.java Mon Jan 16 15:43:58 2012
@@ -0,0 +1,82 @@
+/**
+ * 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.cxf.bus.osgi;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Logger;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.configuration.ConfiguredBeanLocator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class OSGiBeanLocator implements ConfiguredBeanLocator {
+ private static final Logger LOG = LogUtils.getL7dLogger(OSGiBeanLocator.class);
+
+ final ConfiguredBeanLocator cbl;
+ final BundleContext context;
+ public OSGiBeanLocator(ConfiguredBeanLocator c, BundleContext ctx) {
+ cbl = c;
+ context = ctx;
+ }
+
+ public <T> T getBeanOfType(String name, Class<T> type) {
+ return cbl.getBeanOfType(name, type);
+ }
+
+ public <T> Collection<? extends T> getBeansOfType(Class<T> type) {
+ Collection<? extends T> ret = cbl.getBeansOfType(type);
+ if (ret == null || ret.isEmpty()) {
+ return getBeansFromOsgiService(type);
+ } else {
+ return ret;
+ }
+ }
+
+ private <T> List<T> getBeansFromOsgiService(Class<T> type) {
+ List<T> list = new ArrayList<T>();
+ try {
+ ServiceReference refs[] = context.getServiceReferences(type.getName(), null);
+ if (refs != null) {
+ for (ServiceReference r : refs) {
+ list.add(type.cast(context.getService(r)));
+ }
+ }
+ } catch (Exception ex) {
+ //ignore, just don't support the OSGi services
+ LOG.info("Tried to find the Bean with type:" + type
+ + " from OSGi services and get error: " + ex);
+ }
+ return list;
+ }
+ public <T> boolean loadBeansOfType(Class<T> type, BeanLoaderListener<T> listener) {
+ return cbl.loadBeansOfType(type, listener);
+
+ }
+ public boolean hasConfiguredPropertyValue(String beanName, String propertyName, String value) {
+ return cbl.hasConfiguredPropertyValue(beanName, propertyName, value);
+ }
+
+ public List<String> getBeanNamesOfType(Class<?> type) {
+ return cbl.getBeanNamesOfType(type);
+ }
+
+}
Added: cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/WorkQueueSingleConfig.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/WorkQueueSingleConfig.java?rev=1232037&view=auto
==============================================================================
--- cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/WorkQueueSingleConfig.java (added)
+++ cxf/branches/2.5.x-fixes/rt/core/src/main/java/org/apache/cxf/bus/osgi/WorkQueueSingleConfig.java Mon Jan 16 15:43:58 2012
@@ -0,0 +1,69 @@
+/**
+ * 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.cxf.bus.osgi;
+
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.workqueue.AutomaticWorkQueueImpl;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
+
+/**
+ * Use the ManagedWorkQueueList config style instead
+ */
+@Deprecated
+public class WorkQueueSingleConfig implements ManagedService {
+ public static final String SERVICE_PID = "org.apache.cxf.workqueue";
+ public static final String PROPERTY_PREFIX = "org.apache.cxf.workqueue";
+ ManagedWorkQueueList workQueueList;
+
+ public WorkQueueSingleConfig(ManagedWorkQueueList workQueueList) {
+ this.workQueueList = workQueueList;
+ }
+
+ public void updated(@SuppressWarnings("rawtypes") Dictionary properties) throws ConfigurationException {
+ Dictionary<String, String> p = CastUtils.cast(properties);
+ String names = (String)properties.get(PROPERTY_PREFIX + ".names");
+ String[] nameAr = names.split(",");
+ for (String name : nameAr) {
+ updateQueue(name.trim(), p);
+ }
+ }
+
+ private void updateQueue(String name, Dictionary<String, String> properties)
+ throws ConfigurationException {
+ Dictionary<String, String> queueProperties = new Hashtable<String, String>();
+ Enumeration<?> it = properties.keys();
+ while (it.hasMoreElements()) {
+ String key = (String)it.nextElement();
+ String prefix = PROPERTY_PREFIX + "." + name + ".";
+ if (key.startsWith(prefix)) {
+ String newKey = (String)key.substring(prefix.length());
+ queueProperties.put(newKey, (String)properties.get(key));
+ }
+ }
+ queueProperties.put(AutomaticWorkQueueImpl.PROPERTY_NAME, name);
+ workQueueList.updated(name, queueProperties);
+ }
+
+
+}