diff options
author | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2010-10-26 10:56:15 +0000 |
---|---|---|
committer | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2010-10-26 10:56:15 +0000 |
commit | 938e8f66975589a340ec3818cf50a7ae672161f4 (patch) | |
tree | 489233323660e909de64fe23497d550f94a75813 /sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java | |
parent | 3073bdac3b8a147d82a87b94c33ea47a43080c22 (diff) |
Delete and redo release branch
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1027457 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
32 files changed, 0 insertions, 6075 deletions
diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeActivator.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeActivator.java deleted file mode 100644 index 36feb6526a..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeActivator.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * 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.tuscany.sca.node.osgi.impl; - -import static org.apache.tuscany.sca.node.osgi.impl.NodeManager.isSCABundle; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.RemoteServiceAdminImpl; -import org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.TopologyManagerImpl; -import org.apache.tuscany.sca.osgi.service.discovery.impl.DiscoveryActivator; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleEvent; -import org.osgi.framework.SynchronousBundleListener; - -/** - * Bundle activator to receive the BundleContext - */ -public class NodeActivator implements BundleActivator, SynchronousBundleListener { - private final static Logger logger = Logger.getLogger(NodeActivator.class.getName()); - private static BundleContext bundleContext; - private boolean inited; - private NodeManager manager; - - private DiscoveryActivator discoveryActivator = new DiscoveryActivator(); - private RemoteServiceAdminImpl remoteAdmin; - private TopologyManagerImpl controller; - - private void init() { - synchronized (this) { - if (inited) { - return; - } - manager = new NodeManager(bundleContext); - manager.start(); - bundleContext.addBundleListener(manager); - inited = true; - } - } - - public void start(BundleContext context) throws Exception { - try { - bundleContext = context; - - // FIXME: We should try to avoid aggressive initialization - init(); - - remoteAdmin = new RemoteServiceAdminImpl(context); - remoteAdmin.start(); - - discoveryActivator.start(context); - - controller = new TopologyManagerImpl(context); - controller.start(); - - boolean found = false; - for (Bundle b : context.getBundles()) { - if (isSCABundle(b)) { - found = true; - break; - } - } - - if (found) { - init(); - } else { - context.addBundleListener(this); - } - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - throw e; - } - } - - public void stop(BundleContext context) throws Exception { - if (inited) { - context.removeBundleListener(this); - controller.stop(); - controller = null; - - discoveryActivator.stop(context); - discoveryActivator = null; - - remoteAdmin.stop(); - remoteAdmin = null; - - manager.stop(); - bundleContext.removeBundleListener(manager); - manager = null; - bundleContext = null; - inited = false; - } - } - - public static BundleContext getBundleContext() { - return bundleContext; - } - - public void bundleChanged(BundleEvent event) { - if (event.getType() == BundleEvent.STARTING) { - if (isSCABundle(event.getBundle())) { - bundleContext.removeBundleListener(this); - init(); - } - } - - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeManager.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeManager.java deleted file mode 100644 index 6914e09b8e..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/NodeManager.java +++ /dev/null @@ -1,143 +0,0 @@ -/* - * 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.tuscany.sca.node.osgi.impl; - -import java.net.URL; -import java.util.Dictionary; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tuscany.sca.node.Node; -import org.apache.tuscany.sca.node.configuration.NodeConfiguration; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleEvent; -import org.osgi.framework.ServiceEvent; -import org.osgi.framework.ServiceListener; -import org.osgi.framework.SynchronousBundleListener; - -/** - * Managing the mapping between OSGi bundles and SCA implementation.osgi - */ -public class NodeManager implements SynchronousBundleListener, ServiceListener { - private static final Logger logger = Logger.getLogger(NodeManager.class.getName()); - private BundleContext bundleContext; - OSGiNodeFactoryImpl factory; - - public NodeManager(BundleContext bundleContext) { - super(); - this.bundleContext = bundleContext; - this.factory = new OSGiNodeFactoryImpl(this.bundleContext); - } - - public void start() { - for (Bundle b : bundleContext.getBundles()) { - if ((b.getState() & Bundle.ACTIVE) != 0) { - // Process the active bundles - bundleStarted(b); - } - } - } - - public void stop() { - if (factory != null) { - factory.destroy(); - } - } - - public static boolean isSCABundle(Bundle bundle) { - Dictionary<?, ?> headers = bundle.getHeaders(); - // OSGi RFC 119 SCA - if (headers.get("SCA-Composite") != null) { - return true; - } - - URL bundleComposite = bundle.getResource("OSGI-INF/sca/bundle.composite"); - if (bundleComposite != null) { - return true; - } - - /* FIXME: What if there is a META-INF/sca-contribution.xml? There are two cases: - * 1. The file contains deployable elements - * 2. The file doesn't contain deployable elements - */ - - /* - * FIXME: Do we want to use all of the .composite files under OSGI-INF/sca? - */ - - /* - Enumeration<?> entries = bundle.findEntries("OSGI-INF/sca", "bundle.composite", false); - if (entries != null && entries.hasMoreElements()) { - return true; - } - - // OSGi Declarative Services - if (headers.get("Service-Component") != null) { - return true; - } - - // OSGI RFC 124: BluePrint Service - if (headers.get("Bundle-Blueprint") != null) { - return true; - } - - entries = bundle.findEntries("OSGI-INF/blueprint", "*.xml", false); - if (entries != null && entries.hasMoreElements()) { - return true; - } - */ - return false; - } - - private void bundleStarted(Bundle bundle) { - if (!isSCABundle(bundle)) { - return; - } - try { - NodeConfiguration configuration = factory.getConfiguration(bundle, null); - Node node = factory.createNode(configuration); - node.start(); - } catch (Throwable e) { - logger.log(Level.SEVERE, e.getMessage(), e); - } - } - - private void bundleStopping(Bundle bundle) { - Node node = factory.getNodes().get(bundle); - if (node == null) { - return; - } - node.stop(); - } - - public void serviceChanged(ServiceEvent event) { - } - - public void bundleChanged(BundleEvent event) { - int type = event.getType(); - if (type == BundleEvent.STOPPING) { - bundleStopping(event.getBundle()); - } else if (type == BundleEvent.STARTED) { - bundleStarted(event.getBundle()); - } - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/OSGiNodeFactoryImpl.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/OSGiNodeFactoryImpl.java deleted file mode 100644 index c79fc04c4d..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/node/osgi/impl/OSGiNodeFactoryImpl.java +++ /dev/null @@ -1,142 +0,0 @@ -/* -* 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.tuscany.sca.node.osgi.impl; - -import java.io.StringReader; -import java.net.URL; -import java.util.Dictionary; -import java.util.Hashtable; -import java.util.logging.Level; - -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.FactoryExtensionPoint; -import org.apache.tuscany.sca.extensibility.equinox.OSGiExtensionPointRegistry; -import org.apache.tuscany.sca.node.configuration.NodeConfiguration; -import org.apache.tuscany.sca.node.configuration.NodeConfigurationFactory; -import org.apache.tuscany.sca.node.impl.NodeFactoryImpl; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceRegistration; - -/** - * The OSGi based NodeFactory - * - * @version $Rev$ $Date$ - */ -public class OSGiNodeFactoryImpl extends NodeFactoryImpl { - private ServiceRegistration registration; - private BundleContext bundleContext; - - public OSGiNodeFactoryImpl() { - super(); - Bundle bundle = FrameworkUtil.getBundle(OSGiNodeFactoryImpl.class); - if (bundle != null) { - this.bundleContext = bundle.getBundleContext(); - autoDestroy = false; - setNodeFactory(this); - } else { - throw new IllegalStateException(OSGiNodeFactoryImpl.class + " is not loaded by OSGi"); - } - } - /** - * Constructs a new Node controller - */ - public OSGiNodeFactoryImpl(BundleContext bundleContext) { - super(); - this.bundleContext = bundleContext; - autoDestroy = false; - setNodeFactory(this); - } - - protected NodeConfiguration getConfiguration(Bundle bundle, String compositeContent) { - init(); - - // Create a node configuration - FactoryExtensionPoint modelFactories = registry.getExtensionPoint(FactoryExtensionPoint.class); - NodeConfigurationFactory configurationFactory = modelFactories.getFactory(NodeConfigurationFactory.class); - NodeConfiguration configuration = configurationFactory.createNodeConfiguration(); - - URL location = bundle.getEntry("/"); - String uri = bundle.getSymbolicName(); - configuration.setURI(uri).addContribution(uri, location); - - if (compositeContent != null) { - configuration.addDeploymentComposite(uri, new StringReader(compositeContent)); - } else { - String compositeURI = (String)bundle.getHeaders().get("SCA-Composite"); - if (compositeURI == null) { - compositeURI = "OSGI-INF/sca/bundle.composite"; - } - if (compositeURI != null) { - configuration.addDeploymentComposite(uri, compositeURI); - } - } - // Set the bundle - // configuration.getExtensions().add(bundle); - return configuration; - } - - public synchronized void init() { - if (!inited) { - // Register the ExtensionPointRegistry as an OSGi service - Dictionary<Object, Object> props = new Hashtable<Object, Object>(); - registry = createExtensionPointRegistry(); - registry.start(); - registration = - bundleContext.registerService(ExtensionPointRegistry.class.getName(), registry, props); - - // Call super.init after the extension point registry is registered - super.init(); - } - } - - public synchronized void destroy() { - if (inited) { - if (registration != null) { - try { - registration.unregister(); - } catch (IllegalStateException e) { - // The service has been unregistered, ignore it - } - registration = null; - } - super.destroy(); - } - - } - - @Override - protected Object getNodeKey(NodeConfiguration configuration) { - // each bundle might have more than one nodes started - return super.getNodeKey(configuration); - } - - @Override - protected ExtensionPointRegistry createExtensionPointRegistry() { - return new OSGiExtensionPointRegistry(bundleContext); - } - - @Override - protected boolean isSchemaValidationEnabled() { - return logger.isLoggable(Level.FINE); - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/AbstractOSGiServiceHandler.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/AbstractOSGiServiceHandler.java deleted file mode 100644 index 5a4b5aa836..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/AbstractOSGiServiceHandler.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.LifeCycleListener; -import org.apache.tuscany.sca.node.NodeFactory; -import org.apache.tuscany.sca.node.impl.NodeFactoryImpl; -import org.apache.tuscany.sca.osgi.service.discovery.impl.LocalDiscoveryService; -import org.osgi.framework.BundleContext; -import org.osgi.util.tracker.ServiceTracker; - -/** - * Watching and exporting OSGi services - */ -public class AbstractOSGiServiceHandler implements LifeCycleListener { - protected ExtensionPointRegistry registry; - protected BundleContext context; - protected NodeFactoryImpl nodeFactory; - protected EndpointIntrospector introspector; - protected ServiceTracker discoveryTracker; - protected String domainRegistry; - protected String domainURI; - - /** - * @param context - * @param clazz - * @param customizer - */ - protected AbstractOSGiServiceHandler(BundleContext context) { - this.context = context; - this.domainRegistry = context.getProperty("org.osgi.sca.domain.registry"); - this.domainURI = context.getProperty("org.osgi.sca.domain.uri"); - } - - protected ExtensionPointRegistry getExtensionPointRegistry() { - if (registry == null) { - ServiceTracker tracker = new ServiceTracker(context, ExtensionPointRegistry.class.getName(), null); - tracker.open(); - // tracker.waitForService(1000); - registry = (ExtensionPointRegistry)tracker.getService(); - tracker.close(); - } - return registry; - } - - protected synchronized void init() { - if (nodeFactory == null) { - this.nodeFactory = (NodeFactoryImpl)NodeFactory.getInstance(); - this.nodeFactory.init(); - this.discoveryTracker = LocalDiscoveryService.getTracker(context); - discoveryTracker.open(); - this.introspector = new EndpointIntrospector(context, getExtensionPointRegistry(), discoveryTracker); - } - } - - public void start() { - init(); - } - - public void stop() { - if (nodeFactory != null) { - discoveryTracker.close(); - discoveryTracker = null; - introspector = null; - nodeFactory = null; - registry = null; - context = null; - } - } - - public void setDomainRegistry(String domainRegistry) { - this.domainRegistry = domainRegistry; - } - - public void setDomainURI(String domainURI) { - this.domainURI = domainURI; - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointHelper.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointHelper.java deleted file mode 100644 index 8ecc5f7ea8..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointHelper.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.tuscany.sca.assembly.Endpoint; -import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; -import org.apache.tuscany.sca.interfacedef.Interface; -import org.apache.tuscany.sca.interfacedef.java.JavaInterface; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.RemoteConstants; - -/** - * Implementation of {@link EndpointDescription} - */ -public class EndpointHelper { - private EndpointHelper() { - } - - public static EndpointDescription createEndpointDescription(BundleContext bundleContext, Endpoint endpoint) { - return new EndpointDescription(getProperties(bundleContext, endpoint)); - } - - private static List<String> getInterfaces(Endpoint endpoint) { - Interface intf = endpoint.getComponentServiceInterfaceContract().getInterface(); - JavaInterface javaInterface = (JavaInterface)intf; - return Collections.singletonList(javaInterface.getName()); - } - - private static Map<String, Object> getProperties(BundleContext bundleContext, Endpoint endpoint) { - Map<String, Object> props = new HashMap<String, Object>(); - - if (!endpoint.isRemote()) { - String uuid = OSGiHelper.getFrameworkUUID(bundleContext); - props.put(RemoteConstants.ENDPOINT_FRAMEWORK_UUID, uuid); - } - - for (Object ext : endpoint.getService().getExtensions()) { - if (ext instanceof OSGiProperty) { - OSGiProperty prop = (OSGiProperty)ext; - props.put(prop.getName(), prop.getStringValue()); - } - } - - String serviceID = (String)props.get(Constants.SERVICE_ID); - if (serviceID != null) { - props.put(RemoteConstants.ENDPOINT_SERVICE_ID, Long.parseLong(serviceID)); - } - - // FIXME: [rfeng] We need to calculate the intents supported by this endpoint - /* - QName bindingTypeName = endpoint.getBinding().getType(); - Definitions definitions = null; - if(definitions!=null) { - for(BindingType bindingType: definitions.getBindingTypes()) { - if(bindingType.getType().equals(bindingTypeName)) { - bindingType.getAlwaysProvidedIntents(); - } - } - */ - - String intents = (String)props.get(RemoteConstants.SERVICE_EXPORTED_INTENTS); - String extraIntents = (String)props.get(RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA); - if (intents == null) { - intents = ""; - } - if (extraIntents != null) { - intents = intents + " " + extraIntents; - } - - props.put(RemoteConstants.SERVICE_INTENTS, intents.trim()); - - props.put(RemoteConstants.ENDPOINT_ID, endpoint.getURI()); - // FIXME: [rfeng] How to pass in the remote service id from the endpoint XML - props.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, new String[] {"org.osgi.sca"}); - props.put(Endpoint.class.getName(), endpoint); - List<String> interfaces = getInterfaces(endpoint); - props.put(Constants.OBJECTCLASS, interfaces.toArray(new String[interfaces.size()])); - return props; - } - - public static Endpoint getEndpoint(EndpointDescription endpointDescription) { - return (Endpoint)endpointDescription.getProperties().get(Endpoint.class.getName()); - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointIntrospector.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointIntrospector.java deleted file mode 100644 index d00696a822..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointIntrospector.java +++ /dev/null @@ -1,550 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import static org.apache.tuscany.sca.assembly.Base.SCA11_TUSCANY_NS; -import static org.apache.tuscany.sca.implementation.osgi.OSGiProperty.SCA_BINDINGS; -import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper.createOSGiProperty; -import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper.getStringArray; -import static org.osgi.framework.Constants.OBJECTCLASS; -import static org.osgi.framework.Constants.SERVICE_ID; - -import java.io.IOException; -import java.io.StringWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import javax.xml.namespace.QName; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; - -import org.apache.tuscany.sca.assembly.AssemblyFactory; -import org.apache.tuscany.sca.assembly.Base; -import org.apache.tuscany.sca.assembly.Binding; -import org.apache.tuscany.sca.assembly.Component; -import org.apache.tuscany.sca.assembly.ComponentReference; -import org.apache.tuscany.sca.assembly.ComponentService; -import org.apache.tuscany.sca.assembly.Composite; -import org.apache.tuscany.sca.assembly.Endpoint; -import org.apache.tuscany.sca.assembly.Reference; -import org.apache.tuscany.sca.assembly.Service; -import org.apache.tuscany.sca.contribution.Contribution; -import org.apache.tuscany.sca.contribution.ContributionFactory; -import org.apache.tuscany.sca.contribution.processor.ContributionReadException; -import org.apache.tuscany.sca.contribution.processor.ContributionResolveException; -import org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver; -import org.apache.tuscany.sca.contribution.resolver.ModelResolver; -import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint; -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.FactoryExtensionPoint; -import org.apache.tuscany.sca.core.UtilityExtensionPoint; -import org.apache.tuscany.sca.deployment.Deployer; -import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; -import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory; -import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; -import org.apache.tuscany.sca.implementation.osgi.SCAConfig; -import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptionsFactory; -import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException; -import org.apache.tuscany.sca.interfacedef.java.JavaInterface; -import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; -import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory; -import org.apache.tuscany.sca.osgi.service.discovery.impl.LocalDiscoveryService; -import org.apache.tuscany.sca.osgi.service.discovery.impl.LocalDiscoveryService.ExtenderConfiguration; -import org.apache.tuscany.sca.policy.Intent; -import org.apache.tuscany.sca.policy.PolicyFactory; -import org.apache.tuscany.sca.policy.PolicySet; -import org.oasisopen.sca.ServiceRuntimeException; -import org.oasisopen.sca.annotation.PolicySets; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.RemoteConstants; -import org.osgi.util.tracker.ServiceTracker; - -/** - * Introspect an OSGi Service to create an SCA composite that contains a single component with - * implementation.osgi - */ -public class EndpointIntrospector { - // private BundleContext context; - private AssemblyFactory assemblyFactory; - private ContributionFactory contributionFactory; - private OSGiImplementationFactory implementationFactory; - private PolicyFactory policyFactory; - private ExtensionPointRegistry registry; - private FactoryExtensionPoint factories; - private ModelResolverExtensionPoint modelResolvers; - // private StAXArtifactProcessor<Composite> compositeProcessor; - private JavaInterfaceFactory javaInterfaceFactory; - private Deployer deployer; - private ServiceTracker discoveryTracker; - - /** - * @param name - * @return - */ - private static QName getQName(String name) { - QName qname; - if (name.startsWith("{")) { - int i = name.indexOf('}'); - if (i != -1) { - qname = new QName(name.substring(1, i), name.substring(i + 1)); - } else { - throw new IllegalArgumentException("Invalid qname: " + name); - } - } else { - // Default to SCA namespace - qname = new QName("", name); - } - return qname; - } - - /** - * @param context TODO - * @param registry - */ - public EndpointIntrospector(BundleContext context, ExtensionPointRegistry registry, ServiceTracker discoveryTracker) { - super(); - this.registry = registry; - // this.context = context; - this.discoveryTracker = discoveryTracker; - this.factories = registry.getExtensionPoint(FactoryExtensionPoint.class); - this.modelResolvers = registry.getExtensionPoint(ModelResolverExtensionPoint.class); -// this.compositeProcessor = -// registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class).getProcessor(Composite.class); - this.assemblyFactory = factories.getFactory(AssemblyFactory.class); - this.contributionFactory = factories.getFactory(ContributionFactory.class); - this.policyFactory = factories.getFactory(PolicyFactory.class); - this.implementationFactory = factories.getFactory(OSGiImplementationFactory.class); - this.javaInterfaceFactory = factories.getFactory(JavaInterfaceFactory.class); - this.deployer = registry.getExtensionPoint(UtilityExtensionPoint.class).getUtility(Deployer.class); - } - - private Intent getIntent(String intent) { - QName name = getQName(intent); - Intent i = policyFactory.createIntent(); - i.setName(name); - return i; - } - - private List<Intent> getIntents(String[] intents) { - if (intents == null || intents.length == 0) { - return Collections.emptyList(); - } - List<Intent> intentList = new ArrayList<Intent>(); - for (String i : intents) { - Intent intent = getIntent(i); - if (intent != null) { - intentList.add(intent); - } - } - return intentList; - } - - /** - * Any property in the map overrides the service reference properties, regardless of - * case. That is, if the map contains a key then it will override any case variant - * of this key in the Service Reference.<p> - * If the map contains the objectClass or service. id property key in any case - * variant, then these properties must not override the Service References value. This - * implies that the map can provide the service.exported. interfaces, property allowing - * the Topology Manager to export any registered service, also services not specifically - * marked to be exported. - * @param reference - * @param props - * @return - */ - private Map<String, Object> getProperties(ServiceReference reference, Map<String, Object> props) { - String[] names = reference.getPropertyKeys(); - Map<String, Object> properties = new HashMap<String, Object>(); - if (names != null) { - for (String name : names) { - properties.put(name, reference.getProperty(name)); - } - } - if (props != null) { - // Create a map of names (key = lowcase name, value = name) - Map<String, String> nameMap = new HashMap<String, String>(); - if (names != null) { - for (String name : names) { - nameMap.put(name.toLowerCase(), name); - } - } - for (Map.Entry<String, Object> p : props.entrySet()) { - if (OBJECTCLASS.equalsIgnoreCase(p.getKey())) { - throw new IllegalArgumentException(OBJECTCLASS + " property cannot be overridden."); - } else if (SERVICE_ID.equalsIgnoreCase(p.getKey())) { - throw new IllegalArgumentException(SERVICE_ID + " property cannot be overridden."); - } - String key = nameMap.get(p.getKey().toLowerCase()); - if (key != null) { - properties.put(key, p.getValue()); - } else { - properties.put(p.getKey(), p.getValue()); - } - } - } - return properties; - } - - /** - * Parse the Stringp[] to support values that are separated by comma - * @param interfaces - * @return - */ - private String[] parse(String[] interfaces) { - if (interfaces == null) { - return null; - } - List<String> names = new ArrayList<String>(); - for (String i : interfaces) { - String[] parts = i.split(","); - for (String p : parts) { - names.add(p.trim()); - } - } - return names.toArray(new String[names.size()]); - } - - /** - * Introspect a local OSGi Service represented by the ServiceReference to create - * an SCA service with the required intents and bindings - * @param reference The service reference for a local OSGi service - * @param props Addiontal properties - * @return An SCA contribution with a deployable composite for the SCA service - * @throws Exception - */ - public Contribution introspect(ServiceReference reference, Map<String, Object> props) throws Exception { - Bundle bundle = reference.getBundle(); - Map<String, Object> properties = getProperties(reference, props); - Collection<OSGiProperty> osgiProps = implementationFactory.createOSGiProperties(reference); - Long sid = (Long)reference.getProperty(SERVICE_ID); - - String[] requiredIntents = getStringArray(properties.get(RemoteConstants.SERVICE_EXPORTED_INTENTS)); - List<Intent> intents = getIntents(requiredIntents); - String[] requiredIntentsExtra = getStringArray(properties.get(RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA)); - List<Intent> extraIntents = getIntents(requiredIntentsExtra); - Set<Intent> allIntents = new HashSet<Intent>(intents); - allIntents.addAll(extraIntents); - - String[] bindingNames = getStringArray(properties.get(SCA_BINDINGS)); - Collection<Binding> bindings = loadBindings(bindingNames); - - String[] remoteInterfaces = getStringArray(reference.getProperty(RemoteConstants.SERVICE_EXPORTED_INTERFACES)); - if (remoteInterfaces == null || remoteInterfaces.length > 0 && "*".equals(remoteInterfaces[0])) { - remoteInterfaces = getStringArray(reference.getProperty(OBJECTCLASS)); - } else { - remoteInterfaces = parse(remoteInterfaces); - String[] objectClasses = getStringArray(reference.getProperty(OBJECTCLASS)); - Set<String> objectClassSet = new HashSet<String>(Arrays.asList(objectClasses)); - if (!objectClassSet.containsAll(Arrays.asList(remoteInterfaces))) { - throw new IllegalArgumentException( - "The exported interfaces are not a subset of the types" + " listed in the objectClass service property from the Service Reference"); - } - } - - Contribution contribution = generateContribution(bundle, sid, remoteInterfaces, bindings, allIntents, osgiProps); - return contribution; - } - - public String instrospectSCAConfig(ServiceReference reference, Map<String, Object> props, ComponentService service){ - - ServiceDescriptionsFactory serviceDescriptionFactory = registry.getExtensionPoint(ServiceDescriptionsFactory.class); - SCAConfig scaConfig = serviceDescriptionFactory.createSCAConfig(); - - // add the binding configurations - List<Binding> bindings = scaConfig.getBindings(); - bindings.addAll(service.getBindings()); - - // add the intent configurations - List<Intent> intents = scaConfig.getIntents(); - intents.addAll(service.getRequiredIntents()); - - // add the policy set configurations - List<PolicySet> policySets = scaConfig.getPolicySets(); - policySets.addAll(service.getPolicySets()); - - // set up the target namespace - // TODO - there is a bug in the spec which only allow bindings from one - // namsepace to be included in sca-config element. Here we just - // the first bindings namespace - Map<String, Object> properties = getProperties(reference, props); - String[] bindingNames = getStringArray(properties.get(SCA_BINDINGS)); - if (bindingNames.length > 0){ - QName firstBindingQName = getQName(bindingNames[0]); - scaConfig.setTargetNamespace(firstBindingQName.getNamespaceURI()); - } - - // write the sca config out to XML - String scaConfigXMLString = ""; - - try { - Writer writer = new StringWriter(); - deployer.saveXMLDocument(scaConfig, writer, deployer.createMonitor()); - scaConfigXMLString = writer.toString(); - } catch (Exception ex){ - throw new ServiceRuntimeException(ex); - } - - return scaConfigXMLString; - } - - /* - public Contribution loadContribution(Bundle bundle, Composite composite) { - try { - URL root = bundle.getEntry("/"); - Contribution contribution = deployer.loadContribution(root.toURI(), root, deployer.createMonitor()); - deployer.attachDeploymentComposite(contribution, composite, false); - return contribution; - } catch (Exception e) { - throw new ServiceRuntimeException(e); - } - } - */ - - /** - * Generate a contribution that contains the composite for the exported service - * @param bundle The OSGi bundle - * @param sid The service id - * @param remoteInterfaces - * @param bindings - * @param allIntents - * @return - * @throws ClassNotFoundException - * @throws InvalidInterfaceException - */ - private Contribution generateContribution(Bundle bundle, - Long sid, - String[] remoteInterfaces, - Collection<Binding> bindings, - Set<Intent> allIntents, - Collection<OSGiProperty> osgiProps) throws ClassNotFoundException, - InvalidInterfaceException { - String id = "osgi.service." + UUID.randomUUID(); - Composite composite = assemblyFactory.createComposite(); - composite.setName(new QName(SCA11_TUSCANY_NS, id)); - - Component component = assemblyFactory.createComponent(); - component.setName(id); - - composite.getComponents().add(component); - - OSGiImplementation implementation = implementationFactory.createOSGiImplementation(); - - implementation.setBundle(bundle); - component.setImplementation(implementation); - implementation.setUnresolved(false); - - OSGiProperty serviceID = implementationFactory.createOSGiProperty(); - serviceID.setName(SERVICE_ID); - // The service.id is Long - serviceID.setValue(String.valueOf(sid)); - - for (String intf : remoteInterfaces) { - Service service = assemblyFactory.createService(); - JavaInterfaceContract interfaceContract = createJavaInterfaceContract(bundle, intf); - String name = intf.substring(intf.lastIndexOf('.') + 1); - service.setName(name); - service.setInterfaceContract(interfaceContract); - - implementation.getServices().add(service); - - ComponentService componentService = assemblyFactory.createComponentService(); - componentService.setName(service.getName()); - componentService.getExtensions().add(serviceID); - componentService.getExtensions().addAll(osgiProps); - - component.getServices().add(componentService); - componentService.setService(service); - } - - for (ComponentService componentService : component.getServices()) { - componentService.getRequiredIntents().addAll(allIntents); - componentService.getBindings().addAll(bindings); - } - - // FIXME: Should we scan the owning bundle to create the SCA contribution? - Contribution contribution = loadContribution(bundle, id, composite); - return contribution; - } - - private Contribution loadContribution(Bundle bundle, String id, Composite composite) { - Contribution contribution = contributionFactory.createContribution(); - contribution.setClassLoader(OSGiHelper.createBundleClassLoader(bundle)); - contribution.setURI(id); - contribution.setLocation(bundle.getEntry("/").toString()); - deployer.attachDeploymentComposite(contribution, composite, false); - ModelResolver modelResolver = new ExtensibleModelResolver(contribution, modelResolvers, factories); - contribution.setModelResolver(modelResolver); - // compositeProcessor.resolve(composite, modelResolver, new ProcessorContext(registry)); - contribution.setUnresolved(true); - return contribution; - } - - /** - * @param bundle - * @param endpoint - * @return - * @throws Exception - */ - public Contribution introspect(Bundle bundle, EndpointDescription endpoint) throws Exception { - Collection<Binding> bindings = Collections.emptyList(); - Collection<String> interfaces = Collections.emptyList(); - Collection<Intent> intents = Collections.emptyList(); - Endpoint ep = (Endpoint)endpoint.getProperties().get(Endpoint.class.getName()); - Collection<OSGiProperty> osgiProps = implementationFactory.createOSGiProperties(endpoint.getProperties()); - if (ep != null) { - bindings = Collections.singletonList(ep.getBinding()); - interfaces = Collections.singletonList(((JavaInterface)ep.getComponentServiceInterfaceContract().getInterface()).getName()); - // FIXME: [rfeng] We need to build the in-memory composite so that intents are calculated at the ep level - intents = ep.getService().getRequiredIntents(); - } else { - Map<String, Object> properties = endpoint.getProperties(); - interfaces = endpoint.getInterfaces(); - String[] requiredIntents = getStringArray(properties.get(RemoteConstants.SERVICE_INTENTS)); - intents = getIntents(requiredIntents); - - String[] bindingNames = getStringArray(properties.get(SCA_BINDINGS)); - bindings = loadBindings(bindingNames); - } - - Contribution contribution = generateContribution(bundle, interfaces, bindings, intents, osgiProps); - return contribution; - } - - private Contribution generateContribution(Bundle bundle, - Collection<String> remoteInterfaces, - Collection<Binding> bindings, - Collection<Intent> intents, - Collection<OSGiProperty> osgiProps) throws ClassNotFoundException, - InvalidInterfaceException, ContributionResolveException { - String id = "osgi.reference." + UUID.randomUUID(); - Composite composite = assemblyFactory.createComposite(); - composite.setName(new QName(Base.SCA11_TUSCANY_NS, id)); - - Component component = assemblyFactory.createComponent(); - component.setName(id); - // component.setAutowire(Boolean.TRUE); - - composite.getComponents().add(component); - - OSGiImplementation implementation = implementationFactory.createOSGiImplementation(); - - implementation.setBundle(bundle); - component.setImplementation(implementation); - implementation.setUnresolved(false); - - int count = 0; - for (String intf : remoteInterfaces) { - Reference reference = assemblyFactory.createReference(); - JavaInterfaceContract interfaceContract = createJavaInterfaceContract(bundle, intf); - - reference.setName("ref" + (count++)); - reference.setInterfaceContract(interfaceContract); - - implementation.getReferences().add(reference); - - ComponentReference componentReference = assemblyFactory.createComponentReference(); - componentReference.setName(reference.getName()); - componentReference.getExtensions().addAll(osgiProps); - component.getReferences().add(componentReference); - componentReference.setReference(reference); - componentReference.setWiredByImpl(true); - } - - for (ComponentReference componentReference : component.getReferences()) { - componentReference.getRequiredIntents().addAll(intents); - componentReference.getBindings().addAll(bindings); - } - - Contribution contribution = loadContribution(bundle, id, composite); - return contribution; - } - - private JavaInterfaceContract createJavaInterfaceContract(Bundle bundle, String intf) - throws ClassNotFoundException, InvalidInterfaceException { - JavaInterfaceContract interfaceContract = javaInterfaceFactory.createJavaInterfaceContract(); - Class<?> interfaceClass = bundle.loadClass(intf); - JavaInterface javaInterface = javaInterfaceFactory.createJavaInterface(); - // [rfeng] For OSGi, the interfaces should be marked as remotable - javaInterface.setRemotable(true); - // [rfeng] We need to mark the interface to be remotable before the createJavaInterface() is called - javaInterfaceFactory.createJavaInterface(javaInterface, interfaceClass); - interfaceContract.setInterface(javaInterface); - if (javaInterface.getCallbackClass() != null) { - JavaInterface callbackInterface = javaInterfaceFactory.createJavaInterface(javaInterface.getCallbackClass()); - callbackInterface.setRemotable(true); - interfaceContract.setCallbackInterface(callbackInterface); - } - return interfaceContract; - } - - private Collection<Binding> loadBindings(String[] qnames) throws IOException, ContributionReadException, - XMLStreamException { - if (qnames == null || qnames.length == 0) { - return Collections.emptyList(); - } - QName[] bindingNames = new QName[qnames.length]; - int index = 0; - for (String name : qnames) { - bindingNames[index++] = getQName(name); - } - - LocalDiscoveryService discoveryService = (LocalDiscoveryService)discoveryTracker.getService(); - - Map<QName, Binding> bindingMap = new HashMap<QName, Binding>(); - if (discoveryService != null) { - for (ExtenderConfiguration config : discoveryService.getConfigurations()) { - for (SCAConfig sc : config.getSCAConfigs()) { - for (QName bindingName : bindingNames) { - if ("".equals(bindingName.getNamespaceURI()) || - sc.getTargetNamespace().equals(bindingName.getNamespaceURI())) { - for (Binding binding : sc.getBindings()) { - if (bindingName.getLocalPart().equals(binding.getName())) { - // We need to check duplications - if (bindingMap.put(bindingName, binding) != null) { - throw new ServiceRuntimeException("Duplicate binding found: " + bindingName); - } - } - } - } - } - } - } - } - for (QName bindingName : bindingNames) { - if (!bindingMap.containsKey(bindingName)) { - throw new ServiceRuntimeException("Binding cannot be resolved: " + bindingName); - } - } - return bindingMap.values(); - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointMatcher.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointMatcher.java deleted file mode 100644 index f978ba658d..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/EndpointMatcher.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tuscany.sca.common.java.collection.CollectionMap; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Filter; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.hooks.service.ListenerHook.ListenerInfo; -import org.osgi.service.remoteserviceadmin.EndpointDescription; - -/** - * Matching endpoint descriptions against the sevice listeners using OSGi filiters - */ -public class EndpointMatcher { - private static final Logger logger = Logger.getLogger(EndpointMatcher.class.getName()); - private final EndpointMap endpointDescriptions = new EndpointMap(); - private final ListenerMap listeners = new ListenerMap(); - private final BundleContext context; - private final BlockingQueue<ImportAction> importQueue = new ArrayBlockingQueue<ImportAction>(256, true); - - public EndpointMatcher(BundleContext context) { - super(); - this.context = context; - } - - public static boolean matches(String filter, EndpointDescription endpointDescription) { - Filter f = null; - try { - f = FrameworkUtil.createFilter(filter); - } catch (InvalidSyntaxException e) { - throw new IllegalArgumentException(e); - } - Hashtable<String, Object> props = new Hashtable<String, Object>(endpointDescription.getProperties()); - return f.match(props); - } - - private void importEndpoint(ListenerInfo listener, EndpointDescription ep) { - ImportAction request = new ImportAction(ImportAction.Type.Add, listener, ep); - try { - importQueue.put(request); - } catch (InterruptedException e) { - throw new IllegalArgumentException(e); - } - } - - private void unimportEndpoint(ListenerInfo listener, EndpointDescription ep) { - ImportAction request = new ImportAction(ImportAction.Type.Remove, listener, ep); - try { - importQueue.put(request); - } catch (InterruptedException e) { - throw new IllegalArgumentException(e); - } - } - - public synchronized void added(ListenerInfo listener) { - String filter = listener.getFilter(); - listeners.putValue(filter, listener); - for (EndpointDescription ep : getEndpoints(filter)) { - importEndpoint(listener, ep); - } - } - - public synchronized Collection<String> added(Collection<ListenerInfo> listeners) { - for (ListenerInfo listener : listeners) { - if (accepts(listener)) { - if (!listener.isRemoved() && listener.getBundleContext().getBundle().getBundleId() != 0L) { - added(listener); - } - } - } - return getFilters(); - } - - private boolean accepts(ListenerInfo listener) { - BundleContext context = listener.getBundleContext(); - return context != null && listener.getFilter() != null && context != this.context; - } - - public synchronized void removed(ListenerInfo listener) { - String filter = listener.getFilter(); - if (accepts(listener)) - if (listeners.removeValue(filter, listener, true)) { - // Find the corresponding ImportRegistration with the listener - for (EndpointDescription ep : getEndpoints(filter)) { - unimportEndpoint(listener, ep); - } - if (getListeners(filter).isEmpty()) { - // No more listeners on the this filter, clean up the endpoint descriptionss - endpointDescriptions.remove(filter); - } - - } - } - - public synchronized Collection<String> removed(Collection<ListenerInfo> listeners) { - for (ListenerInfo listener : listeners) { - removed(listener); - } - return getFilters(); - } - - public synchronized void added(EndpointDescription endpointDescription) { - for (Map.Entry<String, Collection<ListenerInfo>> entry : listeners.entrySet()) { - if (matches(entry.getKey(), endpointDescription)) { - endpointDescriptions.putValue(entry.getKey(), endpointDescription); - for (ListenerInfo listener : entry.getValue()) { - importEndpoint(listener, endpointDescription); - } - } - } - } - - public synchronized void added(EndpointDescription endpointDescription, String matchedFilter) { - if (endpointDescriptions.putValue(matchedFilter, endpointDescription)) { - Collection<ListenerInfo> listenerInfos = listeners.get(matchedFilter); - if (listenerInfos != null) { - for (ListenerInfo listener : listenerInfos) { - importEndpoint(listener, endpointDescription); - } - } - } - } - - public synchronized void removed(EndpointDescription endpointDescription, String matchedFilter) { - if (endpointDescriptions.removeValue(matchedFilter, endpointDescription, true)) { - for (ListenerInfo listener : getListeners(matchedFilter)) { - unimportEndpoint(listener, endpointDescription); - } - } - } - - public synchronized Set<String> getFilters() { - return new HashSet<String>(listeners.keySet()); - } - - public synchronized void clear() { - endpointDescriptions.clear(); - listeners.clear(); - importQueue.clear(); - } - - public synchronized Collection<ListenerInfo> getListeners(String filter) { - Collection<ListenerInfo> collection = listeners.get(filter); - if (collection == null) { - return Collections.emptySet(); - } else { - return collection; - } - } - - public synchronized Collection<EndpointDescription> getEndpoints(String filter) { - Collection<EndpointDescription> collection = endpointDescriptions.get(filter); - if (collection == null) { - return Collections.emptySet(); - } else { - return collection; - } - } - - public CollectionMap<Class<?>, ListenerInfo> groupListeners(EndpointDescription endpointDescription, - String matchedFilter) { - Collection<ListenerInfo> snapshot = new HashSet<ListenerInfo>(getListeners(matchedFilter)); - - // Try to partition the listeners by the interface classes - List<String> interfaceNames = endpointDescription.getInterfaces(); - CollectionMap<Class<?>, ListenerInfo> interfaceToListeners = new CollectionMap<Class<?>, ListenerInfo>(); - for (String i : interfaceNames) { - for (Iterator<ListenerInfo> it = snapshot.iterator(); it.hasNext();) { - try { - ListenerInfo listener = it.next(); - if (listener.isRemoved()) { - it.remove(); - continue; - } - if (!matchedFilter.equals(listener.getFilter())) { - continue; - } - try { - // The classloading can be synchronzed against the serviceListeners - Class<?> interfaceClass = listener.getBundleContext().getBundle().loadClass(i); - interfaceToListeners.putValue(interfaceClass, listener); - } catch (IllegalStateException e) { - logger.log(Level.WARNING, e.getMessage(), e); - // Ignore the exception - } - } catch (ClassNotFoundException e) { - // Ignore the listener as it cannot load the interface class - } - } - } - return interfaceToListeners; - } - - public BlockingQueue<ImportAction> getImportQueue() { - return importQueue; - } - - private static class ListenerMap extends CollectionMap<String, ListenerInfo> { - private static final long serialVersionUID = -8612202123531331219L; - - @Override - protected Collection<ListenerInfo> createCollection() { - return new HashSet<ListenerInfo>(); - } - } - - private static class EndpointMap extends CollectionMap<String, EndpointDescription> { - private static final long serialVersionUID = -6261405398109798549L; - - @Override - protected Collection<EndpointDescription> createCollection() { - return new HashSet<EndpointDescription>(); - } - } - - /** - * Representation of an import/unimport request - */ - public static class ImportAction { - enum Type { - Add, Remove - }; - - public final Type type; - public final ListenerInfo listenerInfo; - public final EndpointDescription endpointDescription; - - /** - * @param type - * @param listenerInfo - * @param endpointDescription - */ - public ImportAction(Type type, ListenerInfo listenerInfo, EndpointDescription endpointDescription) { - super(); - this.type = type; - this.listenerInfo = listenerInfo; - this.endpointDescription = endpointDescription; - } - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ExportReferenceImpl.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ExportReferenceImpl.java deleted file mode 100644 index 13c7dd3cf3..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ExportReferenceImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import org.apache.tuscany.sca.node.Node; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.ExportReference; -import org.osgi.service.remoteserviceadmin.ExportRegistration; - -/** - * - */ -public class ExportReferenceImpl implements ExportReference { - private Node node; - private final ServiceReference exportedService; - private final EndpointDescription endpointDescription; - private int count; - - /** - * @param exportedService - * @param endpointDescription - */ - public ExportReferenceImpl(Node node, ServiceReference exportedService, EndpointDescription endpointDescription) { - super(); - this.node = node; - this.exportedService = exportedService; - this.endpointDescription = endpointDescription; - } - - public ServiceReference getExportedService() { - return exportedService; - } - - public EndpointDescription getExportedEndpoint() { - return endpointDescription; - } - - public synchronized ExportRegistration register() { - count++; - return new ExportRegistrationImpl(this); - } - - public synchronized void unregister() { - if (count > 0) { - count--; - } - if (count == 0) { - if (node != null) { - node.stop(); - node = null; - } - } - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ExportRegistrationImpl.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ExportRegistrationImpl.java deleted file mode 100644 index 39cbd7b9e6..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ExportRegistrationImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.ExportReference; -import org.osgi.service.remoteserviceadmin.ExportRegistration; - -/** - * Implementation of {@link ExportRegistration} - */ -public class ExportRegistrationImpl implements ExportRegistration { - private ExportReferenceImpl exportReference; - private Throwable exception; - - /** - * @param exportedService - * @param endpointDescription - * @param exception - */ - public ExportRegistrationImpl(ExportReferenceImpl exportReference, Throwable exception) { - super(); - this.exportReference = exportReference; - this.exception = exception; - } - - /** - * @param exportedService - * @param endpointDescription - */ - public ExportRegistrationImpl(ExportReferenceImpl exportReference) { - this(exportReference, null); - } - - /** - * @see org.osgi.remoteserviceadmin.ExportRegistration#close() - */ - public void close() { - if (exportReference != null) { - exportReference.unregister(); - } - exception = null; - exportReference = null; - } - - public ServiceReference getExportedService() { - return exportReference.getExportedService(); - } - - public EndpointDescription getEndpointDescription() { - return exportReference.getExportedEndpoint(); - } - - public Throwable getException() { - return exception; - } - - public ExportReference getExportReference() throws IllegalStateException { - return exportReference; - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ImportReferenceImpl.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ImportReferenceImpl.java deleted file mode 100644 index 9c5b1818c8..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ImportReferenceImpl.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import org.apache.tuscany.sca.node.Node; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.ImportReference; -import org.osgi.service.remoteserviceadmin.ImportRegistration; - -/** - * Implementation of ImportReference. It keeps a reference count of ImportRegistrations - */ -public class ImportReferenceImpl implements ImportReference { - private Node node; - private final ServiceReference importedService; - private final EndpointDescription endpointDescription; - private int count = 0; - - /** - * @param exportedService - * @param endpointDescription - */ - public ImportReferenceImpl(Node node, ServiceReference importedService, EndpointDescription endpointDescription) { - super(); - this.node = node; - this.importedService = importedService; - this.endpointDescription = endpointDescription; - } - - public ServiceReference getImportedService() { - return importedService; - } - - public EndpointDescription getImportedEndpoint() { - return endpointDescription; - } - - public synchronized ImportRegistration register() { - count++; - return new ImportRegistrationImpl(this); - } - - public synchronized void unregister() { - if (count > 0) { - count--; - } - if (count == 0) { - if (node != null) { - node.stop(); - node = null; - } - } - } -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ImportRegistrationImpl.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ImportRegistrationImpl.java deleted file mode 100644 index 9506128286..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/ImportRegistrationImpl.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import org.osgi.service.remoteserviceadmin.ImportReference; -import org.osgi.service.remoteserviceadmin.ImportRegistration; - -/** - * - */ -public class ImportRegistrationImpl implements ImportRegistration { - private ImportReferenceImpl importReference; - private Throwable exception; - - /** - * @param importReference - */ - public ImportRegistrationImpl(ImportReferenceImpl importReference) { - super(); - this.importReference = importReference; - } - - /** - * @param exportedService - * @param endpointDescription - * @param exception - */ - public ImportRegistrationImpl(ImportReferenceImpl importReference, Throwable exception) { - super(); - this.importReference = importReference; - this.exception = exception; - } - - /** - * @see org.osgi.remoteserviceadmin.ImportRegistration#close() - */ - public void close() { - if (importReference != null) { - importReference.unregister(); - } - exception = null; - importReference = null; - } - - public Throwable getException() { - return exception; - } - - public ImportReference getImportReference() { - return importReference; - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiHelper.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiHelper.java deleted file mode 100644 index 460d291f53..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiHelper.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import java.io.IOException; -import java.net.URL; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashSet; -import java.util.List; -import java.util.UUID; - -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.FactoryExtensionPoint; -import org.apache.tuscany.sca.implementation.osgi.OSGiImplementationFactory; -import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Filter; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; - -/** - * - */ -public class OSGiHelper { - public final static String FRAMEWORK_UUID = "org.osgi.framework.uuid"; - - private OSGiHelper() { - } - - /** - * In OSGi, the value of String+ can be a single String, String[] or Collection<String> - * @param value - * @return - */ - public static String[] getStringArray(Object value) { - if (value == null) { - return null; - } - if (value instanceof String) { - return new String[] {(String)value}; - } else if (value instanceof Collection) { - Collection<String> collection = (Collection)value; - return collection.toArray(new String[collection.size()]); - } - return (String[])value; - - } - - public static Collection<String> getStringCollection(Object value) { - String[] values = getStringArray(value); - if (values == null) { - return null; - } else { - return Arrays.asList(values); - } - } - - public static String[] getStringArray(ServiceReference serviceReference, String propertyName) { - Object propertyValue = serviceReference.getProperty(propertyName); - return getStringArray(propertyValue); - } - - public static Collection<String> getStringCollection(ServiceReference serviceReference, String propertyName) { - Object propertyValue = serviceReference.getProperty(propertyName); - return getStringCollection(propertyValue); - } - - public static Filter createFilter(BundleContext context, String filterValue) { - if (filterValue == null) { - return null; - } - try { - return context.createFilter(filterValue); - } catch (InvalidSyntaxException ex) { - throw new IllegalArgumentException("Invalid Filter: " + filterValue, ex); - } - } - - /** - * Get a collection of resources that are configured by the given header - * @param bundle The bundle - * @param header - * @param defaultValue - * @return - */ - public static Collection<URL> getConfiguration(Bundle bundle, String header, String defaultValue) { - String value = (String)bundle.getHeaders().get(header); - if (value == null) { - return Collections.emptyList(); - } - value = value.trim(); - String paths[] = value.split("( |\t|\n|\r|\f|,)+"); - if ("".equals(value) || paths.length == 0) { - if (defaultValue != null) { - paths = new String[] {defaultValue}; - } else { - paths = new String[0]; - } - } - Collection<URL> files = new HashSet<URL>(); - for (String path : paths) { - if ("".equals(path)) { - // Skip empty ones - continue; - } - if (path.endsWith("/")) { - path = path + "*.xml"; - } - if (!path.startsWith("/")) { - path = "/" + path; - } - int lastIndex = path.lastIndexOf('/'); - String root = path.substring(0, lastIndex); - if ("".equals(root)) { - root = "/"; - } - String pattern = path.substring(lastIndex + 1); - Enumeration<URL> entries = bundle.findEntries(root, pattern, false); - if (entries != null) { - while (entries.hasMoreElements()) { - files.add(entries.nextElement()); - } - } - } - return files; - } - - public static Collection<OSGiProperty> getOSGiProperties(ExtensionPointRegistry registry, ServiceReference reference) { - FactoryExtensionPoint factoryExtensionPoint = registry.getExtensionPoint(FactoryExtensionPoint.class); - OSGiImplementationFactory implementationFactory = - factoryExtensionPoint.getFactory(OSGiImplementationFactory.class); - return implementationFactory.createOSGiProperties(reference); - } - - public static OSGiProperty createOSGiProperty(ExtensionPointRegistry registry, String name, Object value) { - FactoryExtensionPoint factoryExtensionPoint = registry.getExtensionPoint(FactoryExtensionPoint.class); - OSGiImplementationFactory implementationFactory = - factoryExtensionPoint.getFactory(OSGiImplementationFactory.class); - return implementationFactory.createOSGiProperty(name, value); - } - - public synchronized static String getFrameworkUUID(BundleContext bundleContext) { - String uuid = null; - if (bundleContext != null) { - uuid = bundleContext.getProperty(FRAMEWORK_UUID); - } else { - uuid = System.getProperty(FRAMEWORK_UUID); - } - if (uuid == null) { - uuid = UUID.randomUUID().toString(); - } - System.setProperty(FRAMEWORK_UUID, uuid); - return uuid; - } - - public static ClassLoader createBundleClassLoader(Bundle bundle) { - return new BundleClassLoader(bundle); - } - - private static class BundleClassLoader extends ClassLoader { - private Bundle bundle; - - public BundleClassLoader(Bundle bundle) { - super(null); - this.bundle = bundle; - } - - @Override - protected Class<?> findClass(String name) throws ClassNotFoundException { - return bundle.loadClass(name); - } - - @Override - protected URL findResource(String name) { - return bundle.getResource(name); - } - - @Override - protected Enumeration<URL> findResources(String name) throws IOException { - Enumeration<URL> urls = bundle.getResources(name); - if (urls == null) { - List<URL> list = Collections.emptyList(); - return Collections.enumeration(list); - } else { - return urls; - } - } - } - - /** - * Find out what elements are added between the oldValues and newValues - * @param oldValues - * @param newValues - * @return - */ - public static Collection<String> getAddedItems(Collection<String> oldValues, Collection<String> newValues) { - if (newValues == null) { - newValues = Collections.emptySet(); - } - - Collection<String> deltaInterest = new HashSet<String>(newValues); - if (oldValues == null) { - oldValues = Collections.emptySet(); - } - deltaInterest.removeAll(oldValues); - return deltaInterest; - } - - public static Collection<String> getRemovedItems(Collection<String> oldValues, Collection<String> newValues) { - return getAddedItems(newValues, oldValues); - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java deleted file mode 100644 index 081a3a60c0..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceExporter.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.EndpointHelper.createEndpointDescription; -import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper.createOSGiProperty; -import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper.getFrameworkUUID; -import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper.getOSGiProperties; -import static org.osgi.framework.Constants.SERVICE_ID; -import static org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_FRAMEWORK_UUID; -import static org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_SERVICE_ID; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tuscany.sca.assembly.Binding; -import org.apache.tuscany.sca.assembly.Component; -import org.apache.tuscany.sca.assembly.ComponentService; -import org.apache.tuscany.sca.assembly.Endpoint; -import org.apache.tuscany.sca.contribution.Contribution; -import org.apache.tuscany.sca.implementation.osgi.OSGiProperty; -import org.apache.tuscany.sca.implementation.osgi.SCAConfig; -import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptionsFactory; -import org.apache.tuscany.sca.node.configuration.NodeConfiguration; -import org.apache.tuscany.sca.node.impl.NodeImpl; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.ExportRegistration; -import org.osgi.util.tracker.ServiceTrackerCustomizer; - -/** - * Watching and exporting OSGi services - */ -public class OSGiServiceExporter extends AbstractOSGiServiceHandler implements ServiceTrackerCustomizer { - private final static Logger logger = Logger.getLogger(OSGiServiceExporter.class.getName()); - - private Map<EndpointDescription, ExportReferenceImpl> exportReferences = - new ConcurrentHashMap<EndpointDescription, ExportReferenceImpl>(); - - /** - * @param context - * @param clazz - * @param customizer - */ - public OSGiServiceExporter(BundleContext context) { - super(context); - } - - public void start() { - init(); - } - - public void stop() { - exportReferences.clear(); - super.stop(); - } - - public Object addingService(ServiceReference reference) { - return exportService(reference, null); - } - - public List<ExportRegistration> exportService(ServiceReference reference, Map<String, Object> properties) { - // FIXME: [rfeng] We need to check if a corresponding endpoint has been exported - try { - Contribution contribution = introspector.introspect(reference, properties); - if (contribution != null) { - - NodeConfiguration configuration = nodeFactory.createNodeConfiguration(); - if (domainRegistry != null) { - configuration.setDomainRegistryURI(domainRegistry); - } - if (domainURI != null) { - configuration.setDomainURI(domainURI); - } - configuration.setURI(contribution.getURI()); - // configuration.getExtensions().add(reference.getBundle()); - Component component = contribution.getDeployables().get(0).getComponents().get(0); - ComponentService service = component.getServices().get(0); - service.getExtensions().addAll(getOSGiProperties(registry, reference)); - service.getExtensions().add(createOSGiProperty(registry, - ENDPOINT_FRAMEWORK_UUID, - getFrameworkUUID(reference.getBundle() - .getBundleContext()))); - service.getExtensions().add(createOSGiProperty(registry, ENDPOINT_SERVICE_ID, reference - .getProperty(SERVICE_ID))); - - // create the org.osgi.sca.config.xml property - service.getExtensions().add(createSCAConfigXMLProperty(reference, properties, service)); - - // FIXME: Configure the domain and node URI - NodeImpl node = new NodeImpl(nodeFactory, configuration, Collections.singletonList(contribution)); - node.start(); - List<ExportRegistration> exportedServices = new ArrayList<ExportRegistration>(); - for (Endpoint endpoint : service.getEndpoints()) { - EndpointDescription endpointDescription = createEndpointDescription(context, endpoint); - synchronized (this) { - ExportReferenceImpl exportReference = exportReferences.get(endpointDescription); - if (exportReference == null) { - exportReference = new ExportReferenceImpl(node, reference, endpointDescription); - } - ExportRegistration exportRegistration = exportReference.register(); - exportedServices.add(exportRegistration); - } - } - return exportedServices; - } else { - return null; - } - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - ExportRegistration exportRegistration = new ExportRegistrationImpl(null, e); - return Collections.singletonList(exportRegistration); - } - } - - public void modifiedService(ServiceReference reference, Object service) { - removedService(reference, service); - exportService(reference, null); - } - - public void removedService(ServiceReference reference, Object service) { - List<ExportRegistration> exportedServices = (List<ExportRegistration>)service; - for (ExportRegistration exportRegistration : exportedServices) { - exportRegistration.close(); - } - } - - private OSGiProperty createSCAConfigXMLProperty(ServiceReference reference, Map<String, Object> props, ComponentService service){ - - // create the <sca-config> element - String scaConfigXMLString = introspector.instrospectSCAConfig(reference, props, service); - - // wrap the <sca-config> element in an <xml> element - String scaConfigXMLStringWithoutXMLHeader = scaConfigXMLString.substring(scaConfigXMLString.indexOf("><") + 1); - scaConfigXMLString = "<xml>" + scaConfigXMLStringWithoutXMLHeader + "</xml>"; - - // create and return the OSGI property - return createOSGiProperty(registry, "org.osgi.sca.config.xml", scaConfigXMLString); - } -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceImporter.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceImporter.java deleted file mode 100644 index f24e9af7c1..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/OSGiServiceImporter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import java.util.Collections; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tuscany.sca.assembly.Component; -import org.apache.tuscany.sca.assembly.ComponentReference; -import org.apache.tuscany.sca.contribution.Contribution; -import org.apache.tuscany.sca.node.configuration.NodeConfiguration; -import org.apache.tuscany.sca.node.impl.NodeImpl; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.ImportRegistration; - -/** - * Watching and exporting OSGi services - */ -public class OSGiServiceImporter extends AbstractOSGiServiceHandler { - private final static Logger logger = Logger.getLogger(OSGiServiceImporter.class.getName()); - private Map<EndpointDescription, ImportReferenceImpl> importReferences = - new ConcurrentHashMap<EndpointDescription, ImportReferenceImpl>(); - - /** - * @param context - * @param clazz - * @param customizer - */ - public OSGiServiceImporter(BundleContext context) { - super(context); - } - - public void start() { - // Defer init() to importService() - } - - public void stop() { - importReferences.clear(); - super.stop(); - } - - public ImportRegistration importService(Bundle bundle, EndpointDescription endpointDescription) { - init(); - try { - Contribution contribution = introspector.introspect(bundle, endpointDescription); - if (contribution != null) { - - NodeConfiguration configuration = nodeFactory.createNodeConfiguration(); - if (domainRegistry != null) { - configuration.setDomainRegistryURI(domainRegistry); - } - if (domainURI != null) { - configuration.setDomainURI(domainURI); - } - configuration.setURI(contribution.getURI()); - // configuration.getExtensions().add(bundle); - // FIXME: Configure the domain and node URI - NodeImpl node = new NodeImpl(nodeFactory, configuration, Collections.singletonList(contribution)); - node.start(); - - Component component = contribution.getDeployables().get(0).getComponents().get(0); - ComponentReference componentReference = component.getReferences().get(0); - ServiceReference serviceReference = - context.getServiceReference("(sca.reference=" + component.getURI() - + "#reference(" - + componentReference.getName() - + ")"); - synchronized (this) { - ImportReferenceImpl importReference = importReferences.get(endpointDescription); - if (importReference == null) { - importReference = new ImportReferenceImpl(node, serviceReference, endpointDescription); - importReferences.put(endpointDescription, importReference); - } - return importReference.register(); - } - } else { - return null; - } - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - return new ImportRegistrationImpl(null, e); - } - } - - public void unimportService(ImportRegistration importRegistration) { - if (importRegistration != null) { - importRegistration.close(); - } - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/RemoteServiceAdminImpl.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/RemoteServiceAdminImpl.java deleted file mode 100644 index 94955ada38..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/RemoteServiceAdminImpl.java +++ /dev/null @@ -1,346 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Dictionary; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; - -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.UtilityExtensionPoint; -import org.apache.tuscany.sca.definitions.Definitions; -import org.apache.tuscany.sca.deployment.Deployer; -import org.apache.tuscany.sca.policy.BindingType; -import org.apache.tuscany.sca.policy.Intent; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.framework.ServiceReference; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.cm.ConfigurationException; -import org.osgi.service.cm.ManagedService; -import org.osgi.service.event.Event; -import org.osgi.service.event.EventAdmin; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.ExportReference; -import org.osgi.service.remoteserviceadmin.ExportRegistration; -import org.osgi.service.remoteserviceadmin.ImportReference; -import org.osgi.service.remoteserviceadmin.ImportRegistration; -import org.osgi.service.remoteserviceadmin.RemoteConstants; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdminListener; -import org.osgi.util.tracker.ServiceTracker; - -/** - * SCA Implementation of {@link RemoteServiceAdmin} - */ -public class RemoteServiceAdminImpl implements RemoteServiceAdmin, ManagedService { - private BundleContext context; - private ServiceRegistration registration; - private ServiceRegistration managedService; - private ServiceTracker listeners; - - private OSGiServiceExporter exporter; - private OSGiServiceImporter importer; - - private Collection<ImportRegistration> importRegistrations = new ArrayList<ImportRegistration>(); - private Collection<ExportRegistration> exportedRegistrations = new ArrayList<ExportRegistration>(); - - public RemoteServiceAdminImpl(BundleContext context) { - this.context = context; - } - - public void start() { - this.exporter = new OSGiServiceExporter(context); - this.importer = new OSGiServiceImporter(context); - exporter.start(); - importer.start(); - Hashtable<String, Object> props = new Hashtable<String, Object>(); - props.put(RemoteConstants.REMOTE_CONFIGS_SUPPORTED, new String[] {"org.osgi.sca"}); - - ExtensionPointRegistry registry = exporter.getExtensionPointRegistry(); - UtilityExtensionPoint utilities = registry.getExtensionPoint(UtilityExtensionPoint.class); - Deployer deployer = utilities.getUtility(Deployer.class); - Definitions definitions = deployer.getSystemDefinitions(); - - String[] intents = new String[definitions.getIntents().size()]; - int i = 0; - for (Intent intent : definitions.getIntents()) { - intents[i++] = intent.toString(); - } - - String[] bindingTypes = new String[definitions.getBindingTypes().size()]; - i = 0; - for (BindingType bindingType : definitions.getBindingTypes()) { - bindingTypes[i++] = bindingType.getType().toString(); - } - - // FIXME: We should ask SCA domain for the supported intents - props.put(RemoteConstants.REMOTE_INTENTS_SUPPORTED, intents); - // FIXME: We should ask SCA domain for the supported binding types - props.put("org.osgi.sca.binding.types", bindingTypes); - registration = context.registerService(RemoteServiceAdmin.class.getName(), this, props); - - props = new Hashtable<String, Object>(); - props.put(Constants.SERVICE_PID, RemoteServiceAdminImpl.class.getName()); - managedService = context.registerService(ManagedService.class.getName(), this, props); - listeners = new ServiceTracker(this.context, RemoteServiceAdminListener.class.getName(), null); - listeners.open(); - } - - public void stop() { - if (registration != null) { - try { - registration.unregister(); - } catch (IllegalStateException e) { - // The service has been unregistered, ignore it - } - registration = null; - } - if (managedService != null) { - try { - managedService.unregister(); - } catch (IllegalStateException e) { - // The service has been unregistered, ignore it - } - managedService = null; - } - if (listeners != null) { - listeners.close(); - listeners = null; - } - for (ExportRegistration exportRegistration : exportedRegistrations) { - exportRegistration.close(); - } - exportedRegistrations.clear(); - for (ImportRegistration importRegistration : importRegistrations) { - importRegistration.close(); - } - importRegistrations.clear(); - if (importer != null) { - importer.stop(); - importer = null; - } - if (exporter != null) { - exporter.stop(); - exporter = null; - } - } - - /** - * @see org.osgi.remoteserviceadmin.RemoteServiceAdmin#exportService(org.osgi.framework.ServiceReference, - * java.util.Map) - */ - public List<ExportRegistration> exportService(ServiceReference ref, Map properties) { - List<ExportRegistration> exportRegistrations = exporter.exportService(ref, properties); - if (exportRegistrations != null) { - exportRegistrations.addAll(exportedRegistrations); - fireExportEvents(ref.getBundle(), exportRegistrations); - } - return exportRegistrations; - } - - private void fireExportEvents(Bundle source, List<ExportRegistration> exportRegistrations) { - for (ExportRegistration registration : exportRegistrations) { - RemoteServiceAdminEvent rsaEvent = - new RemoteServiceAdminEvent(RemoteServiceAdminEvent.EXPORT_REGISTRATION, source, registration - .getExportReference(), registration.getException()); - EventAdmin eventAdmin = getEventAdmin(); - if (eventAdmin != null) { - eventAdmin.postEvent(wrap(rsaEvent)); - } - for (Object listener : listeners.getServices()) { - RemoteServiceAdminListener rsaListener = (RemoteServiceAdminListener)listener; - rsaListener.remoteAdminEvent(rsaEvent); - } - } - } - - private EventAdmin getEventAdmin() { - ServiceReference reference = context.getServiceReference(EventAdmin.class.getName()); - if (reference == null) { - return null; - } else { - return (EventAdmin)context.getService(reference); - } - } - - private Event wrap(RemoteServiceAdminEvent rsaEvent) { - int type = rsaEvent.getType(); - String eventType = null; - switch (type) { - case RemoteServiceAdminEvent.EXPORT_ERROR: - eventType = "EXPORT_ERROR"; - break; - case RemoteServiceAdminEvent.EXPORT_REGISTRATION: - eventType = "EXPORT_REGISTRATION"; - break; - case RemoteServiceAdminEvent.EXPORT_UNREGISTRATION: - eventType = "EXPORT_UNREGISTRATION"; - break; - case RemoteServiceAdminEvent.EXPORT_WARNING: - eventType = "EXPORT_WARNING"; - break; - case RemoteServiceAdminEvent.IMPORT_ERROR: - eventType = "IMPORT_ERROR"; - break; - case RemoteServiceAdminEvent.IMPORT_REGISTRATION: - eventType = "IMPORT_REGISTRATION"; - break; - case RemoteServiceAdminEvent.IMPORT_UNREGISTRATION: - eventType = "EXPORT_ERROR"; - break; - case RemoteServiceAdminEvent.IMPORT_WARNING: - eventType = "IMPORT_UNREGISTRATION"; - break; - } - String topic = "org/osgi/service/remoteserviceadmin/" + eventType; - Map<String, Object> props = new HashMap<String, Object>(); - /* - * <ul> - <li>bundle (Bundle) The Remote Service Admin bundle - <li>bundle-id (Long) The id of the Blueprint bundle. - <li>bundle-symbolicname (String) The Bundle Symbolic Name of the - Remote Service Admin bundle. - <li>bundle-version - (Version) The version of the Blueprint bundle. - <li>cause The exception, if present. - <li>import.registration An imported endpoint, if present - <li>export.registration An exported endpoint, if present - <li>service.remote.id Remote service UUID, if present - <li>service.remote.uuid Remote service UUID, if present - <li>service.remote.uri (String) The URI of the endpoint, if present - <li>objectClass (String[]) The interface names, if present - <li>service.imported.configs (String+) The configuration types of the - imported services, if present - <li>timestamp (Long) The time when the event occurred - <li>event (RemoteServiceAdminEvent) The RemoteServiceAdminEvent - object that caused this event. - </ul> - */ - Bundle rsaBundle = context.getBundle(); - props.put("bundle", rsaBundle); - props.put("bundle-id", rsaBundle.getBundleId()); - props.put("bundle-symbolicname", rsaBundle.getSymbolicName()); - props.put("bundle-version", rsaBundle.getHeaders().get(Constants.BUNDLE_VERSION)); - props.put("cause", rsaEvent.getException()); - props.put("import.registration", rsaEvent.getImportReference()); - props.put("export.registration", rsaEvent.getExportReference()); - EndpointDescription ep = null; - if (rsaEvent.getImportReference() != null) { - ep = rsaEvent.getImportReference().getImportedEndpoint(); - } - if (rsaEvent.getExportReference() != null) { - ep = rsaEvent.getExportReference().getExportedEndpoint(); - } - - if (ep != null) { - props.put("endpoint.service.id", ep.getServiceId()); - props.put("endpoint.framework.uuid", ep.getFrameworkUUID()); - props.put("endpoint.id", ep.getId()); - props.put("objectClass", ep.getInterfaces()); - props.put("service.imported.configs", ep.getConfigurationTypes()); - Object bindings = ep.getProperties().get("org.osgi.sca.bindings"); - if (bindings != null) { - props.put("org.osgi.sca.bindings", bindings); - } - Object config = ep.getProperties().get("org.osgi.sca.config.url"); - if (config != null) { - props.put("org.osgi.sca.config.url", config); - } - config = ep.getProperties().get("org.osgi.sca.config.xml"); - if (config != null) { - props.put("org.osgi.sca.config.xml", config); - } } - props.put("timestamp", Long.valueOf(System.currentTimeMillis())); - props.put("event", rsaEvent); - return new Event(topic, props); - } - - private void fireImportEvents(Bundle source, ImportRegistration registration) { - RemoteServiceAdminEvent rsaEvent = - new RemoteServiceAdminEvent(RemoteServiceAdminEvent.IMPORT_REGISTRATION, source, registration - .getImportReference(), registration.getException()); - EventAdmin eventAdmin = getEventAdmin(); - if (eventAdmin != null) { - eventAdmin.postEvent(wrap(rsaEvent)); - } - for (Object listener : listeners.getServices()) { - RemoteServiceAdminListener rsaListener = (RemoteServiceAdminListener)listener; - rsaListener.remoteAdminEvent(rsaEvent); - } - } - - /** - * @see org.osgi.remoteserviceadmin.RemoteServiceAdmin#getExportedServices() - */ - public Collection<ExportReference> getExportedServices() { - Collection<ExportReference> exportedServices = new ArrayList<ExportReference>(); - for (ExportRegistration registration : exportedRegistrations) { - exportedServices.add(registration.getExportReference()); - } - return exportedServices; - } - - /** - * @see org.osgi.remoteserviceadmin.RemoteServiceAdmin#getImportedEndpoints() - */ - public Collection<ImportReference> getImportedEndpoints() { - Collection<ImportReference> importedEndpoints = new ArrayList<ImportReference>(); - for (ImportRegistration registration : importRegistrations) { - importedEndpoints.add(registration.getImportReference()); - } - return importedEndpoints; - } - - /** - * @see org.osgi.remoteserviceadmin.RemoteServiceAdmin#importService(org.apache.tuscany.sca.dosgi.discovery.EndpointDescription) - */ - public ImportRegistration importService(EndpointDescription endpoint) { - Bundle bundle = (Bundle)endpoint.getProperties().get(Bundle.class.getName()); - ImportRegistration importReg = importer.importService(bundle, endpoint); - if (importReg != null) { - fireImportEvents(bundle, importReg); - importRegistrations.add(importReg); - } - return importReg; - } - - public synchronized void updated(Dictionary props) throws ConfigurationException { - if (props == null) { - // It can be null in Apache Felix - return; - } - String domainRegistry = (String)props.get("org.osgi.sca.domain.registry"); - String domainURI = (String)props.get("org.osgi.sca.domain.uri"); - if (domainRegistry != null) { - exporter.setDomainRegistry(domainRegistry); - importer.setDomainRegistry(domainRegistry); - } - if (domainURI != null) { - exporter.setDomainURI(domainURI); - importer.setDomainURI(domainURI); - } - } -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/TopologyManagerImpl.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/TopologyManagerImpl.java deleted file mode 100644 index a3f3636cce..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/remoteserviceadmin/impl/TopologyManagerImpl.java +++ /dev/null @@ -1,400 +0,0 @@ -/* - * 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.tuscany.sca.osgi.remoteserviceadmin.impl; - -import static org.apache.tuscany.sca.implementation.osgi.OSGiProperty.SERVICE_EXPORTED_INTERFACES; -import static org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_EXPORTED_CONFIGS; -import static org.osgi.service.remoteserviceadmin.RemoteConstants.SERVICE_IMPORTED; - -import java.util.Collection; -import java.util.Dictionary; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tuscany.sca.common.java.collection.CollectionMap; -import org.apache.tuscany.sca.core.LifeCycleListener; -import org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.EndpointMatcher.ImportAction; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.framework.Filter; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; -import org.osgi.framework.ServiceRegistration; -import org.osgi.framework.hooks.service.ListenerHook; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.service.remoteserviceadmin.ExportRegistration; -import org.osgi.service.remoteserviceadmin.ImportRegistration; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdminListener; -import org.osgi.util.tracker.ServiceTracker; -import org.osgi.util.tracker.ServiceTrackerCustomizer; - -/** - * Implementation of Remote Controller - */ -public class TopologyManagerImpl implements ListenerHook, RemoteServiceAdminListener, EndpointListener, - ServiceTrackerCustomizer, LifeCycleListener /*, EventHook */{ - private final static Logger logger = Logger.getLogger(TopologyManagerImpl.class.getName()); - public final static String ENDPOINT_LOCAL = "service.local"; - - private BundleContext context; - private ServiceTracker remoteAdmins; - - private volatile ServiceRegistration registration; - private ServiceRegistration endpointListener; - - private ServiceTracker remotableServices; - - private EndpointMatcher endpointMatcher; - - private CollectionMap<ServiceReference, ExportRegistration> exportedServices = - new CollectionMap<ServiceReference, ExportRegistration>(); - private CollectionMap<ImportKey, ImportRegistration> importedServices = - new CollectionMap<ImportKey, ImportRegistration>(); - - private Filter remotableServiceFilter; - - public TopologyManagerImpl(BundleContext context) { - this.context = context; - this.endpointMatcher = new EndpointMatcher(context); - } - - public void start() { - String filter = - "(& (!(" + SERVICE_IMPORTED - + "=*)) (" - + SERVICE_EXPORTED_INTERFACES - + "=*) (" - + SERVICE_EXPORTED_CONFIGS - + "=org.osgi.sca) )"; - try { - remotableServiceFilter = context.createFilter(filter); - } catch (InvalidSyntaxException e) { - // Ignore - } - - endpointListener = context.registerService(EndpointListener.class.getName(), this, null); - remoteAdmins = new ServiceTracker(this.context, RemoteServiceAdmin.class.getName(), null); - remoteAdmins.open(); - - // DO NOT register EventHook.class.getName() as it cannot report existing services - String interfaceNames[] = - new String[] {ListenerHook.class.getName(), RemoteServiceAdminListener.class.getName()}; - // The registration will trigger the added() method before registration is assigned - registration = context.registerService(interfaceNames, this, null); - - remotableServices = new ServiceTracker(context, remotableServiceFilter, this); - remotableServices.open(true); - - Thread thread = new Thread(new ImportTask()); - thread.start(); - } - - public Object addingService(ServiceReference reference) { - exportService(reference); - return reference.getBundle().getBundleContext().getService(reference); - } - - public void modifiedService(ServiceReference reference, Object service) { - unexportService(reference); - exportService(reference); - } - - public void removedService(ServiceReference reference, Object service) { - unexportService(reference); - } - - private void unexportService(ServiceReference reference) { - // Call remote admin to unexport the service - Collection<ExportRegistration> exportRegistrations = exportedServices.get(reference); - if (exportRegistrations != null) { - for (Iterator<ExportRegistration> i = exportRegistrations.iterator(); i.hasNext();) { - ExportRegistration exported = i.next(); - exported.close(); - i.remove(); - } - } - } - - private void exportService(ServiceReference reference) { - // Call remote admin to export the service - Object[] admins = remoteAdmins.getServices(); - if (admins == null) { - // Ignore - logger.warning("No RemoteAdmin services are available."); - } else { - for (Object ra : admins) { - RemoteServiceAdmin remoteAdmin = (RemoteServiceAdmin)ra; - Collection<ExportRegistration> exportRegistrations = remoteAdmin.exportService(reference, null); - if (exportRegistrations != null && !exportRegistrations.isEmpty()) { - exportedServices.putValues(reference, exportRegistrations); - } - } - } - } - - /** - * @see org.osgi.framework.hooks.service.ListenerHook#added(java.util.Collection) - */ - public void added(Collection listeners) { - try { - synchronized (endpointMatcher) { - Collection<String> oldFilters = endpointMatcher.getFilters(); - Collection<String> newFilters = endpointMatcher.added(listeners); - if (!OSGiHelper.getAddedItems(oldFilters, newFilters).isEmpty()) { - updateEndpointListenerScope(newFilters); - } - } - } catch (Throwable e) { - logger.log(Level.SEVERE, e.getMessage(), e); - if (e instanceof Error) { - throw (Error)e; - } else if (e instanceof RuntimeException) { - throw (RuntimeException)e; - } else { - // Should not happen - throw new RuntimeException(e); - } - } - } - - private void updateEndpointListenerScope(Collection<String> filters) { - Dictionary<String, Object> props = new Hashtable<String, Object>(); - props.put(ENDPOINT_LISTENER_SCOPE, filters); - endpointListener.setProperties(props); - } - - /** - * @see org.osgi.framework.hooks.service.ListenerHook#removed(java.util.Collection) - */ - public void removed(Collection listeners) { - try { - synchronized (endpointMatcher) { - Collection<String> oldFilters = endpointMatcher.getFilters(); - Collection<String> newFilters = endpointMatcher.removed(listeners); - if (!OSGiHelper.getRemovedItems(oldFilters, newFilters).isEmpty()) { - updateEndpointListenerScope(newFilters); - } - } - } catch (Throwable e) { - logger.log(Level.SEVERE, e.getMessage(), e); - if (e instanceof Error) { - throw (Error)e; - } else if (e instanceof RuntimeException) { - throw (RuntimeException)e; - } else { - // Should not happen - throw new RuntimeException(e); - } - } - } - - /** - * @see org.apache.tuscany.sca.osgi.service.remoteadmin.RemoteAdminListener#remoteAdminEvent(org.apache.tuscany.sca.osgi.service.remoteadmin.RemoteAdminEvent) - */ - public void remoteAdminEvent(RemoteServiceAdminEvent event) { - switch (event.getType()) { - case RemoteServiceAdminEvent.EXPORT_ERROR: - case RemoteServiceAdminEvent.EXPORT_REGISTRATION: - case RemoteServiceAdminEvent.EXPORT_UNREGISTRATION: - case RemoteServiceAdminEvent.EXPORT_WARNING: - break; - case RemoteServiceAdminEvent.IMPORT_ERROR: - case RemoteServiceAdminEvent.IMPORT_REGISTRATION: - case RemoteServiceAdminEvent.IMPORT_UNREGISTRATION: - case RemoteServiceAdminEvent.IMPORT_WARNING: - break; - } - } - - /** - * @see org.osgi.remoteserviceadmin.EndpointListener#addEndpoint(org.osgi.service.remoteserviceadmin.EndpointDescription, - * java.lang.String) - */ - public void endpointAdded(EndpointDescription endpoint, String matchedFilter) { - endpointMatcher.added(endpoint, matchedFilter); - // importService(endpoint, matchedFilter); - } - - /** - * @see org.osgi.remoteserviceadmin.EndpointListener#removeEndpoint(org.osgi.service.remoteserviceadmin.EndpointDescription) - */ - public void endpointRemoved(EndpointDescription endpoint, String matchedFilter) { - endpointMatcher.removed(endpoint, matchedFilter); - // unimportService(endpoint); - } - - private void importService(EndpointDescription endpoint, String matchedFilter) { - Object[] admins = remoteAdmins.getServices(); - if (admins == null) { - logger.warning("No Remote Service Admin services are available."); - return; - } - - CollectionMap<Class<?>, ListenerInfo> interfaceToListeners = - endpointMatcher.groupListeners(endpoint, matchedFilter); - for (Map.Entry<Class<?>, Collection<ListenerInfo>> e : interfaceToListeners.entrySet()) { - Class<?> interfaceClass = e.getKey(); - Collection<ListenerInfo> listeners = e.getValue(); - // Get a listener - ListenerInfo listener = listeners.iterator().next(); - Bundle bundle = listener.getBundleContext().getBundle(); - if (bundle.getBundleId() == 0L) { - // Skip system bundles - continue; - } - try { - Filter filter = listener.getBundleContext().createFilter(matchedFilter); - if (!filter.match(new Hashtable<String, Object>(endpoint.getProperties()))) { - continue; - } - } catch (InvalidSyntaxException ex) { - logger.log(Level.SEVERE, ex.getMessage(), ex); - continue; - } - - Map<String, Object> props = new HashMap<String, Object>(endpoint.getProperties()); - props.put(Bundle.class.getName(), bundle); - props.put(Constants.OBJECTCLASS, new String[] {interfaceClass.getName()}); - EndpointDescription description = new EndpointDescription(props); - - if (admins != null) { - for (Object ra : admins) { - RemoteServiceAdmin remoteAdmin = (RemoteServiceAdmin)ra; - ImportRegistration importRegistration = remoteAdmin.importService(description); - if (importRegistration != null) { - importedServices.putValue(new ImportKey(description, listener), importRegistration); - } - } - } - } - } - - private void unimportService(EndpointDescription endpoint, ListenerInfo listenerInfo) { - // Call remote admin to unimport the service - Collection<ImportRegistration> importRegistrations = - importedServices.get(new ImportKey(endpoint, listenerInfo)); - if (importRegistrations != null) { - for (Iterator<ImportRegistration> i = importRegistrations.iterator(); i.hasNext();) { - ImportRegistration imported = i.next(); - imported.close(); - i.remove(); - } - } - } - - public void stop() { - remotableServices.close(); - - if (registration != null) { - try { - registration.unregister(); - } catch (IllegalStateException e) { - // The service has been unregistered, ignore it - } - registration = null; - } - if (remoteAdmins != null) { - remoteAdmins.close(); - remoteAdmins = null; - } - if (endpointMatcher != null) { - endpointMatcher.clear(); - } - } - - private class ImportTask implements Runnable { - public void run() { - while (registration != null) { - BlockingQueue<EndpointMatcher.ImportAction> queue = endpointMatcher.getImportQueue(); - ImportAction action = null; - try { - action = queue.poll(1, TimeUnit.SECONDS); - } catch (InterruptedException e) { - // Ignore - } - if (action != null) { - if (action.type == ImportAction.Type.Add) { - importService(action.endpointDescription, action.listenerInfo.getFilter()); - } else if (action.type == ImportAction.Type.Remove) { - unimportService(action.endpointDescription, action.listenerInfo); - } - } - } - } - } - - private static class ImportKey { - private EndpointDescription endpointDescription; - - /** - * @param endpointDescription - * @param listenerInfo - */ - private ImportKey(EndpointDescription endpointDescription, ListenerInfo listenerInfo) { - super(); - this.endpointDescription = endpointDescription; - this.listenerInfo = listenerInfo; - } - - private ListenerInfo listenerInfo; - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((endpointDescription == null) ? 0 : endpointDescription.hashCode()); - result = prime * result + ((listenerInfo == null) ? 0 : listenerInfo.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - ImportKey other = (ImportKey)obj; - if (endpointDescription == null) { - if (other.endpointDescription != null) - return false; - } else if (!endpointDescription.equals(other.endpointDescription)) - return false; - if (listenerInfo == null) { - if (other.listenerInfo != null) - return false; - } else if (!listenerInfo.equals(other.listenerInfo)) - return false; - return true; - } - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/AbstractDiscoveryService.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/AbstractDiscoveryService.java deleted file mode 100644 index fd57dbded8..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/AbstractDiscoveryService.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * 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.tuscany.sca.osgi.service.discovery.impl; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Dictionary; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.tuscany.sca.core.ExtensionPointRegistry; -import org.apache.tuscany.sca.core.LifeCycleListener; -import org.apache.tuscany.sca.node.NodeFactory; -import org.apache.tuscany.sca.node.impl.NodeFactoryImpl; -import org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.framework.Filter; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.service.remoteserviceadmin.RemoteConstants; -import org.osgi.util.tracker.ServiceTracker; - -/** - * - */ -public abstract class AbstractDiscoveryService implements Discovery, LifeCycleListener { - protected final static int ADDED = 0x1; - protected final static int REMOVED = 0x2; - protected final static int MODIFIED = 0x4; - - protected final static Logger logger = Logger.getLogger(AbstractDiscoveryService.class.getName()); - - protected BundleContext context; - protected ExtensionPointRegistry registry; - // private WorkScheduler workScheduler; - - private Map<EndpointListener, Collection<String>> listenersToFilters = - new ConcurrentHashMap<EndpointListener, Collection<String>>(); - - protected Map<EndpointDescription, Bundle> endpointDescriptions = - new ConcurrentHashMap<EndpointDescription, Bundle>(); - private ServiceTracker trackerTracker; - - public AbstractDiscoveryService(BundleContext context) { - super(); - this.context = context; - } - - public void start() { - getExtensionPointRegistry(); - // UtilityExtensionPoint utilityExtensionPoint = registry.getExtensionPoint(UtilityExtensionPoint.class); - // this.workScheduler = utilityExtensionPoint.getUtility(WorkScheduler.class); - - // track the registration of EndpointListener - trackerTracker = new ServiceTracker(this.context, EndpointListener.class.getName(), null) { - public Object addingService(ServiceReference reference) { - Object result = super.addingService(reference); - cacheTracker(reference, result); - return result; - } - - public void modifiedService(ServiceReference reference, Object service) { - super.modifiedService(reference, service); - updateTracker(reference, service); - } - - public void removedService(ServiceReference reference, Object service) { - super.removedService(reference, service); - clearTracker(service); - } - }; - - trackerTracker.open(); - } - - public void stop() { - trackerTracker.close(); - } - - protected ExtensionPointRegistry getExtensionPointRegistry() { - NodeFactoryImpl factory = (NodeFactoryImpl)NodeFactory.getInstance(); - factory.init(); - ServiceTracker tracker = new ServiceTracker(context, ExtensionPointRegistry.class.getName(), null); - tracker.open(); - // tracker.waitForService(1000); - registry = (ExtensionPointRegistry)tracker.getService(); - tracker.close(); - return registry; - } - - protected Dictionary<String, Object> getProperties() { - Dictionary headers = context.getBundle().getHeaders(); - Hashtable<String, Object> props = new Hashtable<String, Object>(); - props.put(PRODUCT_NAME, "Apache Tuscany SCA"); - props.put(PRODUCT_VERSION, headers.get(Constants.BUNDLE_VERSION)); - props.put(VENDOR_NAME, headers.get(Constants.BUNDLE_VENDOR)); - // props.put(SUPPORTED_PROTOCOLS, new String[] {"local", "org.osgi.sca"}); - return props; - } - - private void cacheTracker(ServiceReference reference, Object service) { - if (service instanceof EndpointListener) { - EndpointListener listener = (EndpointListener)service; - Collection<String> filters = null; - synchronized (this) { - filters = addTracker(reference, listener, EndpointListener.ENDPOINT_LISTENER_SCOPE); - // Take a snapshot of the endpoints - triggerCallbacks(null, filters, listener); - } - } - } - - private void clearTracker(Object service) { - if (service instanceof EndpointListener) { - synchronized (this) { - removeTracker((EndpointListener)service); - } - } - } - - private void updateTracker(ServiceReference reference, Object service) { - if (service instanceof EndpointListener) { - EndpointListener listener = (EndpointListener)service; - Collection<String> oldFilters = null; - Collection<String> newFilters = null; - synchronized (this) { - if (logger.isLoggable(Level.FINE)) { - logger.fine("updating listener: " + listener); - } - oldFilters = removeTracker(listener); - newFilters = addTracker(reference, listener, EndpointListener.ENDPOINT_LISTENER_SCOPE); - triggerCallbacks(oldFilters, newFilters, listener); - } - } - } - - private void triggerCallbacks(Collection<String> oldInterest, - Collection<String> newInterest, - EndpointListener listener) { - // compute delta between old & new interfaces/filters and - // trigger callbacks for any entries in servicesInfo that - // match any *additional* interface/filters - Collection<String> deltaInterest = getDelta(oldInterest, newInterest); - - Iterator<String> i = deltaInterest.iterator(); - while (i.hasNext()) { - String next = i.next(); - for (EndpointDescription sd : endpointDescriptions.keySet()) { - triggerCallbacks(listener, next, sd, ADDED); - } - } - // Find removed filters - deltaInterest = getDelta(newInterest, oldInterest); - - i = deltaInterest.iterator(); - while (i.hasNext()) { - String next = i.next(); - for (EndpointDescription sd : endpointDescriptions.keySet()) { - triggerCallbacks(listener, next, sd, REMOVED); - } - } - } - - private Collection<String> getDelta(Collection<String> oldInterest, Collection<String> newInterest) { - if (newInterest == null) { - newInterest = Collections.emptySet(); - } - - Collection<String> deltaInterest = new ArrayList<String>(newInterest); - if (oldInterest == null) { - oldInterest = Collections.emptySet(); - } - deltaInterest.removeAll(oldInterest); - return deltaInterest; - } - - /** - * Notify the endpoint listener - * @param listener - * @param matchedFilter - * @param endpoint - * @param type - */ - private static void notify(EndpointListener listener, String matchedFilter, EndpointDescription endpoint, int type) { - switch (type) { - case ADDED: - listener.endpointAdded(endpoint, matchedFilter); - break; - case REMOVED: - listener.endpointRemoved(endpoint, matchedFilter); - break; - case MODIFIED: - listener.endpointRemoved(endpoint, matchedFilter); - listener.endpointAdded(endpoint, matchedFilter); - break; - } - } - - private void triggerCallbacks(EndpointListener listener, - String matchedFilter, - EndpointDescription endpoint, - int type) { - // workScheduler.scheduleWork(new Notifier(listener, matchedFilter, endpoint, type)); - notify(listener, matchedFilter, endpoint, type); - } - - private boolean filterMatches(String filterValue, EndpointDescription sd) { - Filter filter = OSGiHelper.createFilter(context, filterValue); - Hashtable<String, Object> props = new Hashtable<String, Object>(sd.getProperties()); - // Add two faked properties to make the filter match - props.put(Constants.OBJECTCLASS, sd.getInterfaces()); - props.put(RemoteConstants.SERVICE_IMPORTED, "true"); - return filter != null ? filter.match(props) : false; - } - - private Collection<String> removeTracker(EndpointListener listener) { - return listenersToFilters.remove(listener); - } - - private Collection<String> addTracker(ServiceReference reference, EndpointListener listener, String property) { - Collection<String> collection = OSGiHelper.getStringCollection(reference, property); - if (collection != null && !collection.isEmpty()) { - listenersToFilters.put(listener, new ArrayList<String>(collection)); - } - return collection; - } - - protected void endpointChanged(EndpointDescription sd, int type) { - synchronized (this) { - for (Map.Entry<EndpointListener, Collection<String>> entry : listenersToFilters.entrySet()) { - for (String filter : entry.getValue()) { - if (filterMatches(filter, sd)) { - triggerCallbacks(entry.getKey(), filter, sd, type); - } - } - } - } - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/Discovery.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/Discovery.java deleted file mode 100644 index 3ad1e53fee..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/Discovery.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.tuscany.sca.osgi.service.discovery.impl; - -/** - * Every Discovery Provider registers a service implementing this interface. - * This service is registered with extra properties identified at the beginning - * of this interface to denote the name of the product providing Discovery - * functionality, its version, vendor, used protocols etc.. - * <p> - * Discovery allows to publish services exposed for remote access as well as to - * search for remote services. - * <p> - * Discovery service implementations usually rely on some discovery protocols or - * other information distribution means. - * - * @ThreadSafe - */ -public interface Discovery { - - /** - * ServiceRegistration property for the name of the Discovery product. - * <p> - * Value of this property is of type <code>String</code>. - */ - String PRODUCT_NAME = "osgi.remote.discovery.product"; - - /** - * ServiceRegistration property for the version of the Discovery product. - * <p> - * Value of this property is of type <code>String</code>. - */ - String PRODUCT_VERSION = "osgi.remote.discovery.product.version"; - - /** - * ServiceRegistration property for the Discovery product vendor name. - * <p> - * Value of this property is of type <code>String</code>. - */ - String VENDOR_NAME = "osgi.remote.discovery.vendor"; - - /** - * ServiceRegistration property that lists the discovery protocols used by - * this Discovery service. - * <p> - * Value of this property is of type - * <code>Collection (<? extends String>)</code>. - */ - String SUPPORTED_PROTOCOLS = "osgi.remote.discovery.supported_protocols"; -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DiscoveryActivator.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DiscoveryActivator.java deleted file mode 100644 index 32bd10b77b..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DiscoveryActivator.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * 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.tuscany.sca.osgi.service.discovery.impl; - -import java.util.ArrayList; -import java.util.List; - -import org.osgi.framework.BundleActivator; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; - -public class DiscoveryActivator implements BundleActivator { - private List<AbstractDiscoveryService> discoveryServices = new ArrayList<AbstractDiscoveryService>(); - private List<ServiceRegistration> discoveryServiceRegistrations = new ArrayList<ServiceRegistration>(); - - public void start(BundleContext context) { - discoveryServices.add(new LocalDiscoveryService(context)); - - discoveryServices.add(new DomainDiscoveryService(context)); - - for (AbstractDiscoveryService service : discoveryServices) { - service.start(); - ServiceRegistration registration = - context.registerService(Discovery.class.getName(), service, service.getProperties()); - discoveryServiceRegistrations.add(registration); - } - } - - public void stop(BundleContext context) { - for (ServiceRegistration registration : discoveryServiceRegistrations) { - try { - registration.unregister(); - } catch (IllegalStateException e) { - // The service has been unregistered, ignore it - } - } - for (AbstractDiscoveryService service : discoveryServices) { - service.stop(); - } - } -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DomainDiscoveryService.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DomainDiscoveryService.java deleted file mode 100644 index 0cbdda7b56..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/DomainDiscoveryService.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * 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.tuscany.sca.osgi.service.discovery.impl; - -import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.EndpointHelper.createEndpointDescription; - -import java.util.Dictionary; - -import org.apache.tuscany.sca.assembly.Endpoint; -import org.apache.tuscany.sca.assembly.Implementation; -import org.apache.tuscany.sca.core.LifeCycleListener; -import org.apache.tuscany.sca.implementation.osgi.OSGiImplementation; -import org.apache.tuscany.sca.node.configuration.NodeConfiguration; -import org.apache.tuscany.sca.runtime.DomainRegistryFactory; -import org.apache.tuscany.sca.runtime.EndpointListener; -import org.apache.tuscany.sca.runtime.EndpointRegistry; -import org.apache.tuscany.sca.runtime.ExtensibleDomainRegistryFactory; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.service.remoteserviceadmin.EndpointDescription; - -/** - * Discovery service based on the distributed SCA domain - */ -public class DomainDiscoveryService extends AbstractDiscoveryService implements EndpointListener { - private DomainRegistryFactory domainRegistryFactory; - private EndpointRegistry endpointRegistry; - - public DomainDiscoveryService(BundleContext context) { - super(context); - } - - public void start() { - super.start(); - this.domainRegistryFactory = ExtensibleDomainRegistryFactory.getInstance(registry); - domainRegistryFactory.addListener(this); - - // [rfeng] Starting of the endpoint registry takes a long time and it leaves the bundle - // state to be starting. When the registry is started, remote endpoints come in and that - // triggers the classloading from this bundle. - Thread thread = new Thread() { - public void run() { - startEndpointRegistry(); - } - }; - thread.start(); - } - - private synchronized void startEndpointRegistry() { - // The following code forced the start() of the domain registry in absense of services - String domainRegistry = context.getProperty("org.osgi.sca.domain.registry"); - if (domainRegistry == null) { - domainRegistry = NodeConfiguration.DEFAULT_DOMAIN_REGISTRY_URI; - } - String domainURI = context.getProperty("org.osgi.sca.domain.uri"); - if (domainURI == null) { - domainURI = NodeConfiguration.DEFAULT_DOMAIN_URI; - } - if (domainRegistry != null) { - endpointRegistry = domainRegistryFactory.getEndpointRegistry(domainRegistry, domainURI); - } - } - - public void endpointAdded(Endpoint endpoint) { - Implementation impl = endpoint.getComponent().getImplementation(); - - /* - if (!(impl instanceof OSGiImplementation)) { - return; - } - */ - - BundleContext bundleContext = null; - // Remote endpoint doesn't have a bundle - if (!endpoint.isRemote()) { - OSGiImplementation osgiImpl = (OSGiImplementation)impl; - Bundle bundle = osgiImpl.getBundle(); - bundleContext = bundle != null ? bundle.getBundleContext() : null; - } - - // Notify the endpoint listeners - EndpointDescription description = createEndpointDescription(bundleContext, endpoint); - // Set the owning bundle to runtime bundle to avoid NPE - synchronized (this) { - endpointDescriptions.put(description, context.getBundle()); - endpointChanged(description, ADDED); - } - } - - public void endpointRemoved(Endpoint endpoint) { - EndpointDescription description = createEndpointDescription(context, endpoint); - synchronized (this) { - endpointDescriptions.remove(description); - endpointChanged(description, REMOVED); - } - } - - public void endpointUpdated(Endpoint oldEndpoint, Endpoint newEndpoint) { - // FIXME: This is a quick and dirty way for the update - endpointRemoved(oldEndpoint); - endpointAdded(newEndpoint); - } - - public void stop() { - if (domainRegistryFactory != null) { - domainRegistryFactory.removeListener(this); - if (endpointRegistry instanceof LifeCycleListener) { - ((LifeCycleListener)endpointRegistry).stop(); - } - domainRegistryFactory = null; - endpointRegistry = null; - super.stop(); - } - } - - @Override - protected Dictionary<String, Object> getProperties() { - Dictionary<String, Object> props = super.getProperties(); - props.put(SUPPORTED_PROTOCOLS, new String[] {"org.osgi.sca"}); - return props; - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/LocalDiscoveryService.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/LocalDiscoveryService.java deleted file mode 100644 index dc9ae096dd..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/apache/tuscany/sca/osgi/service/discovery/impl/LocalDiscoveryService.java +++ /dev/null @@ -1,262 +0,0 @@ -/** - * 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.tuscany.sca.osgi.service.discovery.impl; - -import static org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper.getConfiguration; -import static org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_FRAMEWORK_UUID; -import static org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_ID; -import static org.osgi.service.remoteserviceadmin.RemoteConstants.ENDPOINT_SERVICE_ID; - -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Dictionary; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.UUID; -import java.util.Map.Entry; -import java.util.logging.Level; - -import javax.xml.namespace.QName; - -import org.apache.tuscany.sca.assembly.Binding; -import org.apache.tuscany.sca.core.UtilityExtensionPoint; -import org.apache.tuscany.sca.deployment.Deployer; -import org.apache.tuscany.sca.implementation.osgi.SCAConfig; -import org.apache.tuscany.sca.implementation.osgi.ServiceDescription; -import org.apache.tuscany.sca.implementation.osgi.ServiceDescriptions; -import org.apache.tuscany.sca.osgi.remoteserviceadmin.impl.OSGiHelper; -import org.apache.tuscany.sca.policy.Intent; -import org.apache.tuscany.sca.policy.PolicySet; -import org.oasisopen.sca.ServiceRuntimeException; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleEvent; -import org.osgi.framework.Constants; -import org.osgi.framework.Filter; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.util.tracker.BundleTracker; -import org.osgi.util.tracker.BundleTrackerCustomizer; -import org.osgi.util.tracker.ServiceTracker; - -public class LocalDiscoveryService extends AbstractDiscoveryService implements BundleTrackerCustomizer { - private Deployer deployer; - private BundleTracker bundleTracker; - private Collection<ExtenderConfiguration> extenders = new ArrayList<ExtenderConfiguration>(); - - public LocalDiscoveryService(BundleContext context) { - super(context); - } - - public void start() { - super.start(); - - UtilityExtensionPoint utilities = this.registry.getExtensionPoint(UtilityExtensionPoint.class); - this.deployer = utilities.getUtility(Deployer.class); - bundleTracker = new BundleTracker(context, Bundle.ACTIVE | Bundle.STARTING, this); - bundleTracker.open(); - } - - public static ServiceTracker getTracker(BundleContext context) { - Filter filter = null; - try { - filter = - context.createFilter("(& (" + Discovery.SUPPORTED_PROTOCOLS - + "=local) (" - + Constants.OBJECTCLASS - + "=" - + Discovery.class.getName() - + "))"); - } catch (InvalidSyntaxException e) { - throw new IllegalArgumentException(e); - } - return new ServiceTracker(context, filter, null); - } - - private EndpointDescription createEndpointDescription(ServiceDescription sd) { - Map<String, Object> props = new HashMap<String, Object>(sd.getProperties()); - props.put(Constants.OBJECTCLASS, sd.getInterfaces().toArray(new String[sd.getInterfaces().size()])); - if (!props.containsKey(ENDPOINT_SERVICE_ID)) { - props.put(ENDPOINT_SERVICE_ID, Long.valueOf(System.currentTimeMillis())); - } - if (!props.containsKey(ENDPOINT_FRAMEWORK_UUID)) { - props.put(ENDPOINT_FRAMEWORK_UUID, OSGiHelper.getFrameworkUUID(context)); - } - if (!props.containsKey(ENDPOINT_ID)) { - props.put(ENDPOINT_ID, UUID.randomUUID().toString()); - } - - EndpointDescription sed = new EndpointDescription(props); - return sed; - } - - private void removeServicesDeclaredInBundle(Bundle bundle) { - for (Iterator<Map.Entry<EndpointDescription, Bundle>> i = endpointDescriptions.entrySet().iterator(); i.hasNext();) { - Entry<EndpointDescription, Bundle> entry = i.next(); - if (entry.getValue().equals(bundle)) { - serviceDescriptionRemoved(entry.getKey()); - i.remove(); - } - } - } - - private void serviceDescriptionAdded(EndpointDescription endpointDescription) { - endpointChanged(endpointDescription, ADDED); - } - - private void serviceDescriptionRemoved(EndpointDescription endpointDescription) { - endpointChanged(endpointDescription, REMOVED); - } - - public void stop() { - if (bundleTracker != null) { - bundleTracker.close(); - } - super.stop(); - } - - public Object addingBundle(Bundle bundle, BundleEvent event) { - if (bundle.getHeaders().get(Constants.FRAGMENT_HOST) != null || bundle.getBundleId() == 0) { - // Ignore fragments - return null; - } - Collection<URL> scaConfigs = getConfiguration(bundle, "SCA-Configuration", "OSGI-INF/sca-config/*.xml"); - Collection<URL> descriptions = getConfiguration(bundle, "Remote-Service", null); - if (scaConfigs.isEmpty() && descriptions.isEmpty()) { - return null; - } - ExtenderConfiguration extender = new ExtenderConfiguration(); - for (URL url : scaConfigs) { - try { - SCAConfig scaConfig = deployer.loadXMLDocument(url, deployer.createMonitor()); - extender.scaConfigs.add(scaConfig); - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - throw new ServiceRuntimeException(e); - } - } - for (URL url : descriptions) { - try { - ServiceDescriptions sds = deployer.loadXMLDocument(url, deployer.createMonitor()); - extender.remoteServiceDescriptions.add(sds); - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - // throw new ServiceRuntimeException(e); - } - } - - // Add to the extenders before notifying the listeners (the endpoints may references to the config) - ExtenderConfiguration.validate(extenders, extender); - this.extenders.add(extender); - - // Notify - for (ServiceDescriptions sds : extender.getRemoteServiceDescriptions()) { - for (ServiceDescription sd : sds) { - EndpointDescription sed = createEndpointDescription(sd); - endpointDescriptions.put(sed, bundle); - serviceDescriptionAdded(sed); - } - } - - return extender; - } - - public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) { - // STARTING --> ACTIVE - } - - public void removedBundle(Bundle bundle, BundleEvent event, Object object) { - if (object instanceof ExtenderConfiguration) { - extenders.remove((ExtenderConfiguration)object); - removeServicesDeclaredInBundle(bundle); - } - } - - public Collection<ExtenderConfiguration> getConfigurations() { - return extenders; - } - - public static class ExtenderConfiguration { - private Collection<SCAConfig> scaConfigs = new ArrayList<SCAConfig>(); - private Collection<ServiceDescriptions> remoteServiceDescriptions = new ArrayList<ServiceDescriptions>(); - - public Collection<ServiceDescriptions> getRemoteServiceDescriptions() { - return remoteServiceDescriptions; - } - - public Collection<SCAConfig> getSCAConfigs() { - return scaConfigs; - } - - public static void validate(Collection<ExtenderConfiguration> configs, ExtenderConfiguration newConfig) { - Map<QName, Binding> bindings = new HashMap<QName, Binding>(); - Map<QName, Intent> intents = new HashMap<QName, Intent>(); - Map<QName, PolicySet> policySets = new HashMap<QName, PolicySet>(); - - for (ExtenderConfiguration config : configs) { - for (SCAConfig c : config.getSCAConfigs()) { - addBindings(bindings, c); - addIntents(intents, c); - addPolicySets(policySets, c); - } - } - for (SCAConfig c : newConfig.getSCAConfigs()) { - addBindings(bindings, c); - addIntents(intents, c); - addPolicySets(policySets, c); - } - } - - private static void addIntents(Map<QName, Intent> intents, SCAConfig c) { - for (Intent i: c.getIntents()) { - if (intents.put(i.getName(), i) != null) { - throw new ServiceRuntimeException("Duplicate intent: " + i.getName()); - } - } - } - - private static void addPolicySets(Map<QName, PolicySet> policySets, SCAConfig c) { - for (PolicySet ps: c.getPolicySets()) { - if (policySets.put(ps.getName(), ps) != null) { - throw new ServiceRuntimeException("Duplicate policySet: " + ps.getName()); - } - } - } - - private static void addBindings(Map<QName, Binding> bindings, SCAConfig c) { - for (Binding b : c.getBindings()) { - QName name = new QName(c.getTargetNamespace(), b.getName()); - if (bindings.put(name, b) != null) { - throw new ServiceRuntimeException("Duplicate binding: " + name); - } - } - } - - } - - @Override - protected Dictionary<String, Object> getProperties() { - Dictionary<String, Object> props = super.getProperties(); - props.put(SUPPORTED_PROTOCOLS, new String[] {"local"}); - return props; - } - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointDescription.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointDescription.java deleted file mode 100644 index ee7e5ba1bd..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointDescription.java +++ /dev/null @@ -1,682 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2008, 2010). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -import static org.osgi.service.remoteserviceadmin.RemoteConstants.*; - -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Dictionary; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import org.osgi.framework.Constants; -import org.osgi.framework.Filter; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; -import org.osgi.framework.Version; - -/** - * A description of an endpoint that provides sufficient information for a - * compatible distribution provider to create a connection to this endpoint - * - * An Endpoint Description is easy to transfer between different systems because - * it is property based where the property keys are strings and the values are - * simple types. This allows it to be used as a communications device to convey - * available endpoint information to nodes in a network. - * - * An Endpoint Description reflects the perspective of an <i>importer</i>. That - * is, the property keys have been chosen to match filters that are created by - * client bundles that need a service. Therefore the map must not contain any - * <code>service.exported.*</code> property and must contain the corresponding - * <code>service.imported.*</code> ones. - * - * The <code>service.intents</code> property must contain the intents provided - * by the service itself combined with the intents added by the exporting - * distribution provider. Qualified intents appear fully expanded on this - * property. - * - * @Immutable - * @version $Revision$ - */ - -public class EndpointDescription { - private final Map<String, Object> properties; - private final List<String> interfaces; - private final long serviceId; - private final String frameworkUUID; - private final String id; - - /** - * Create an Endpoint Description from a Map. - * - * <p> - * The {@link RemoteConstants#ENDPOINT_ID endpoint.id}, - * {@link RemoteConstants#SERVICE_IMPORTED_CONFIGS service.imported.configs} - * and <code>objectClass</code> properties must be set. - * - * @param properties The map from which to create the Endpoint Description. - * The keys in the map must be type <code>String</code> and, since - * the keys are case insensitive, there must be no duplicates with - * case variation. - * @throws IllegalArgumentException When the properties are not proper for - * an Endpoint Description. - */ - - public EndpointDescription(Map<String, Object> properties) { - Map<String, Object> props = new TreeMap<String, Object>( - String.CASE_INSENSITIVE_ORDER); - try { - props.putAll(properties); - } - catch (ClassCastException e) { - IllegalArgumentException iae = new IllegalArgumentException( - "non-String key in properties"); - iae.initCause(e); - throw iae; - } - if (props.size() < properties.size()) { - throw new IllegalArgumentException( - "duplicate keys with different cases in properties: " - + new ArrayList<String>(props.keySet()) - .removeAll(properties.keySet())); - } - - if (!props.containsKey(SERVICE_IMPORTED)) { - props.put(SERVICE_IMPORTED, Boolean.toString(true)); - } - this.properties = Collections.unmodifiableMap(props); - /* properties must be initialized before calling the following methods */ - interfaces = verifyObjectClassProperty(); - serviceId = verifyLongProperty(ENDPOINT_SERVICE_ID); - frameworkUUID = verifyStringProperty(ENDPOINT_FRAMEWORK_UUID); - id = verifyStringProperty(ENDPOINT_ID); - if (id == null) { - throw new IllegalArgumentException(ENDPOINT_ID - + " property must be set"); - } - if (getConfigurationTypes().isEmpty()) { - throw new IllegalArgumentException(SERVICE_IMPORTED_CONFIGS - + " property must be set and non-empty"); - } - } - - /** - * Create an Endpoint Description based on a Service Reference and a Map of - * properties. The properties in the map take precedence over the properties - * in the Service Reference. - * - * <p> - * This method will automatically set the - * {@link RemoteConstants#ENDPOINT_FRAMEWORK_UUID endpoint.framework.uuid} - * and {@link RemoteConstants#ENDPOINT_SERVICE_ID endpoint.service.id} - * properties based on the specified Service Reference as well as the - * {@link RemoteConstants#SERVICE_IMPORTED service.imported} property if - * they are not specified as properties. - * <p> - * The {@link RemoteConstants#ENDPOINT_ID endpoint.id}, - * {@link RemoteConstants#SERVICE_IMPORTED_CONFIGS service.imported.configs} - * and <code>objectClass</code> properties must be set. - * - * @param reference A service reference that can be exported. - * @param properties Map of properties. This argument can be - * <code>null</code>. The keys in the map must be type - * <code>String</code> and, since the keys are case insensitive, - * there must be no duplicates with case variation. - * @throws IllegalArgumentException When the properties are not proper for - * an Endpoint Description - */ - public EndpointDescription(final ServiceReference reference, - final Map<String, Object> properties) { - Map<String, Object> props = new TreeMap<String, Object>( - String.CASE_INSENSITIVE_ORDER); - - if (properties != null) { - try { - props.putAll(properties); - } - catch (ClassCastException e) { - IllegalArgumentException iae = new IllegalArgumentException( - "non-String key in properties"); - iae.initCause(e); - throw iae; - } - if (props.size() < properties.size()) { - throw new IllegalArgumentException( - "duplicate keys with different cases in properties: " - + new ArrayList<String>(props.keySet()) - .removeAll(properties.keySet())); - } - } - - for (String key : reference.getPropertyKeys()) { - if (!props.containsKey(key)) { - props.put(key, reference.getProperty(key)); - } - } - - if (!props.containsKey(ENDPOINT_SERVICE_ID)) { - props.put(ENDPOINT_SERVICE_ID, reference.getProperty(Constants.SERVICE_ID)); - } - if (!props.containsKey(ENDPOINT_FRAMEWORK_UUID)) { - String uuid = null; - try { - uuid = AccessController - .doPrivileged(new PrivilegedAction<String>() { - public String run() { - return reference.getBundle().getBundleContext() - .getProperty("org.osgi.framework.uuid"); - } - }); - } - catch (SecurityException e) { - // if we don't have permission, we can't get the property - } - if (uuid != null) { - props.put(ENDPOINT_FRAMEWORK_UUID, uuid); - } - } - if (!props.containsKey(SERVICE_IMPORTED)) { - props.put(SERVICE_IMPORTED, Boolean.toString(true)); - } - this.properties = Collections.unmodifiableMap(props); - /* properties must be initialized before calling the following methods */ - interfaces = verifyObjectClassProperty(); - serviceId = verifyLongProperty(ENDPOINT_SERVICE_ID); - frameworkUUID = verifyStringProperty(ENDPOINT_FRAMEWORK_UUID); - id = verifyStringProperty(ENDPOINT_ID); - if (id == null) { - throw new IllegalArgumentException(ENDPOINT_ID - + " property must be set"); - } - if (getConfigurationTypes().isEmpty()) { - throw new IllegalArgumentException(SERVICE_IMPORTED_CONFIGS - + " property must be set and non-empty"); - } - } - - /** - * Verify and obtain the interface list from the properties. - * - * @return A list with the interface names. - * @throws IllegalArgumentException If the objectClass property is not set - * or is empty or if the package version property values are - * malformed. - */ - private List<String> verifyObjectClassProperty() { - Object o = properties.get(Constants.OBJECTCLASS); - if (!(o instanceof String[])) { - throw new IllegalArgumentException( - "objectClass value must be of type String[]"); - } - String[] objectClass = (String[]) o; - if (objectClass.length < 1) { - throw new IllegalArgumentException("objectClass is empty"); - } - for (String interf : objectClass) { - int index = interf.lastIndexOf('.'); - if (index == -1) { - continue; - } - String packageName = interf.substring(0, index); - try { - /* Make sure any package version properties are well formed */ - getPackageVersion(packageName); - } - catch (IllegalArgumentException e) { - IllegalArgumentException iae = new IllegalArgumentException( - "Improper version for package " + packageName); - iae.initCause(e); - throw iae; - } - } - return Collections.unmodifiableList(Arrays.asList(objectClass)); - } - - /** - * Verify and obtain a required String property. - * - * @param propName The name of the property - * @return The value of the property or null if the property is not set. - * @throws IllegalArgumentException when the property doesn't have the - * correct data type. - */ - private String verifyStringProperty(String propName) { - Object r = properties.get(propName); - try { - return (String) r; - } - catch (ClassCastException e) { - IllegalArgumentException iae = new IllegalArgumentException( - "property value is not a String: " + propName); - iae.initCause(e); - throw iae; - } - } - - /** - * Verify and obtain a required long property. - * - * @param propName The name of the property - * @return The value of the property or 0 if the property is not set. - * @throws IllegalArgumentException when the property doesn't have the - * correct data type. - */ - private long verifyLongProperty(String propName) { - Object r = properties.get(propName); - if (r == null) { - return 0l; - } - try { - return ((Long) r).longValue(); - } - catch (ClassCastException e) { - IllegalArgumentException iae = new IllegalArgumentException( - "property value is not a Long: " + propName); - iae.initCause(e); - throw iae; - } - } - - /** - * Returns the endpoint's id. - * - * The id is an opaque id for an endpoint. No two different endpoints must - * have the same id. Two Endpoint Descriptions with the same id must - * represent the same endpoint. - * - * The value of the id is stored in the - * {@link RemoteConstants#ENDPOINT_ID} property. - * - * @return The id of the endpoint, never <code>null</code>. - */ - public String getId() { - return id; - } - - /** - * Provide the list of interfaces implemented by the exported service. - * - * The value of the interfaces is derived from the <code>objectClass</code> - * property. - * - * @return An unmodifiable list of Java interface names implemented by this - * endpoint. - */ - public List<String> getInterfaces() { - return interfaces; - } - - /** - * Provide the version of the given package name. - * - * The version is encoded by prefixing the given package name with - * {@link RemoteConstants#ENDPOINT_PACKAGE_VERSION_ - * endpoint.package.version.}, and then using this as an endpoint property - * key. For example: - * - * <pre> - * endpoint.package.version.com.acme - * </pre> - * - * The value of this property is in String format and will be converted to a - * <code>Version</code> object by this method. - * - * @param packageName The name of the package for which a version is - * requested. - * @return The version of the specified package or - * <code>Version.emptyVersion</code> if the package has no version - * in this Endpoint Description. - * @throws IllegalArgumentException If the version property value is not - * String. - */ - public Version getPackageVersion(String packageName) { - String key = ENDPOINT_PACKAGE_VERSION_ + packageName; - Object value = properties.get(key); - String version; - try { - version = (String) value; - } - catch (ClassCastException e) { - IllegalArgumentException iae = new IllegalArgumentException(key - + " property value is not a String"); - iae.initCause(e); - throw iae; - } - return Version.parseVersion(version); - } - - /** - * Returns the service id for the service exported through this endpoint. - * - * This is the service id under which the framework has registered the - * service. This field together with the Framework UUID is a globally unique - * id for a service. - * - * The value of the remote service id is stored in the - * {@link RemoteConstants#ENDPOINT_SERVICE_ID} endpoint property. - * - * @return Service id of a service or 0 if this Endpoint Description does - * not relate to an OSGi service. - * - */ - public long getServiceId() { - return serviceId; - } - - /** - * Returns the configuration types. - * - * A distribution provider exports a service with an endpoint. This endpoint - * uses some kind of communications protocol with a set of configuration - * parameters. There are many different types but each endpoint is - * configured by only one configuration type. However, a distribution - * provider can be aware of different configuration types and provide - * synonyms to increase the change a receiving distribution provider can - * create a connection to this endpoint. - * - * This value of the configuration types is stored in the - * {@link RemoteConstants#SERVICE_IMPORTED_CONFIGS} service property. - * - * @return An unmodifiable list of the configuration types used for the - * associated endpoint and optionally synonyms. - */ - public List<String> getConfigurationTypes() { - return getStringPlusProperty(SERVICE_IMPORTED_CONFIGS); - } - - /** - * Return the list of intents implemented by this endpoint. - * - * The intents are based on the service.intents on an imported service, - * except for any intents that are additionally provided by the importing - * distribution provider. All qualified intents must have been expanded. - * - * This value of the intents is stored in the - * {@link RemoteConstants#SERVICE_INTENTS} service property. - * - * @return An unmodifiable list of expanded intents that are provided by - * this endpoint. - */ - public List<String> getIntents() { - return getStringPlusProperty(SERVICE_INTENTS); - } - - /** - * Reads a 'String+' property from the properties map, which may be of type - * String, String[] or Collection<String> and returns it as an unmodifiable - * List. - * - * @param key The property - * @return An unmodifiable list - */ - private List<String> getStringPlusProperty(String key) { - Object value = properties.get(key); - if (value == null) { - return Collections.EMPTY_LIST; - } - - if (value instanceof String) { - return Collections.singletonList((String) value); - } - - if (value instanceof String[]) { - String[] values = (String[]) value; - List<String> result = new ArrayList<String>(values.length); - for (String v : values) { - if (v != null) { - result.add(v); - } - } - return Collections.unmodifiableList(result); - } - - if (value instanceof Collection< ? >) { - Collection< ? > values = (Collection< ? >) value; - List<String> result = new ArrayList<String>(values.size()); - for (Iterator< ? > iter = values.iterator(); iter.hasNext();) { - Object v = iter.next(); - if (v instanceof String) { - result.add((String) v); - } - } - return Collections.unmodifiableList(result); - } - - return Collections.EMPTY_LIST; - } - - /** - * Return the framework UUID for the remote service, if present. - * - * The value of the remote framework uuid is stored in the - * {@link RemoteConstants#ENDPOINT_FRAMEWORK_UUID} endpoint property. - * - * @return Remote Framework UUID, or null if this endpoint is not associated - * with an OSGi framework having a framework uuid. - */ - public String getFrameworkUUID() { - return frameworkUUID; - } - - /** - * Returns all endpoint properties. - * - * @return An unmodifiable map referring to the properties of this Endpoint - * Description. - */ - public Map<String, Object> getProperties() { - return properties; - } - - /** - * Answers if this Endpoint Description refers to the same service instance - * as the given Endpoint Description. - * - * Two Endpoint Descriptions point to the same service if they have the same - * id or their framework UUIDs and remote service ids are equal. - * - * @param other The Endpoint Description to look at - * @return True if this endpoint description points to the same service as - * the other - */ - public boolean isSameService(EndpointDescription other) { - if (this.equals(other)) { - return true; - } - - if (this.getFrameworkUUID() == null) { - return false; - } - - return (this.getServiceId() == other.getServiceId()) - && this.getFrameworkUUID().equals( - other.getFrameworkUUID()); - } - - /** - * Returns a hash code value for the object. - * - * @return An integer which is a hash code value for this object. - */ - public int hashCode() { - return getId().hashCode(); - } - - /** - * Compares this <code>EndpointDescription</code> object to another object. - * - * <p> - * An Endpoint Description is considered to be <b>equal to</b> another - * Endpoint Description if their ids are equal. - * - * @param other The <code>EndpointDescription</code> object to be compared. - * @return <code>true</code> if <code>object</code> is a - * <code>EndpointDescription</code> and is equal to this object; - * <code>false</code> otherwise. - */ - public boolean equals(Object other) { - if (this == other) { - return true; - } - if (!(other instanceof EndpointDescription)) { - return false; - } - return getId().equals( - ((EndpointDescription) other).getId()); - } - - /** - * Tests the properties of this <code>EndpointDescription</code> against - * the given filter using a case insensitive match. - * - * @param filter The filter to test. - * @return <code>true</code> If the properties of this - * <code>EndpointDescription</code> match the filter, - * <code>false</code> otherwise. - * @throws IllegalArgumentException If <code>filter</code> contains an - * invalid filter string that cannot be parsed. - */ - public boolean matches(String filter) { - Filter f; - try { - f = FrameworkUtil.createFilter(filter); - } - catch (InvalidSyntaxException e) { - IllegalArgumentException iae = new IllegalArgumentException(e - .getMessage()); - iae.initCause(e); - throw iae; - } - Dictionary<String, Object> d = new UnmodifiableDictionary<String, Object>( - properties); - /* - * we can use matchCase here since properties already supports case - * insensitive key lookup. - */ - return f.matchCase(d); - } - - /** - * Returns the string representation of this EndpointDescription. - * - * @return String form of this EndpointDescription. - */ - public String toString() { - StringBuffer sb = new StringBuffer(); - sb.append('{'); - Iterator<Map.Entry<String, Object>> iter = properties.entrySet() - .iterator(); - boolean comma = false; - while (iter.hasNext()) { - Map.Entry<String, Object> entry = iter.next(); - if (comma) { - sb.append(", "); - } - else { - comma = true; - } - sb.append(entry.getKey()); - sb.append('='); - Object value = entry.getValue(); - if (value != null) { - Class< ? > valueType = value.getClass(); - if (Object[].class.isAssignableFrom(valueType)) { - append(sb, (Object[]) value); - continue; - } - } - sb.append(value); - } - sb.append('}'); - return sb.toString(); - } - - /** - * Append the specified Object array to the specified StringBuffer. - * - * @param sb Receiving StringBuffer. - * @param value Object array to append to the specified StringBuffer. - */ - private static void append(StringBuffer sb, Object[] value) { - sb.append('['); - boolean comma = false; - final int length = value.length; - for (int i = 0; i < length; i++) { - if (comma) { - sb.append(", "); - } - else { - comma = true; - } - sb.append(String.valueOf(value[i])); - } - sb.append(']'); - } - - /** - * Unmodifiable Dictionary wrapper for a Map. This class is also used by - * EndpointPermission. - */ - static class UnmodifiableDictionary<K, V> extends Dictionary<K, V> { - private final Map<K, V> wrapped; - - UnmodifiableDictionary(Map<K, V> wrapped) { - this.wrapped = wrapped; - } - - public Enumeration<V> elements() { - return Collections.enumeration(wrapped.values()); - } - - public V get(Object key) { - return wrapped.get(key); - } - - public boolean isEmpty() { - return wrapped.isEmpty(); - } - - public Enumeration<K> keys() { - return Collections.enumeration(wrapped.keySet()); - } - - public V put(K key, V value) { - throw new UnsupportedOperationException(); - } - - public V remove(Object key) { - throw new UnsupportedOperationException(); - } - - public int size() { - return wrapped.size(); - } - - public String toString() { - return wrapped.toString(); - } - } -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointListener.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointListener.java deleted file mode 100644 index 941b899fbb..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointListener.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -/** - * A white board service that represents a listener for endpoints. - * - * An Endpoint Listener represents a participant in the distributed model that - * is interested in Endpoint Descriptions. - * - * This white board service can be used in many different scenarios. However, - * the primary use case is to allow a remote manager to be informed of Endpoint - * Descriptions available in the network and inform the network about available - * Endpoint Descriptions. - * - * Both the network bundle and the manager bundle register an Endpoint Listener - * service. The manager informs the network bundle about Endpoints that it - * creates. The network bundles then uses a protocol like SLP to announce these - * local end-points to the network. - * - * If the network bundle discovers a new Endpoint through its discovery - * protocol, then it sends an Endpoint Description to all the Endpoint - * Listener services that are registered (except its own) that have specified an - * interest in that endpoint. - * - * Endpoint Listener services can express their <i>scope</i> with the service - * property {@link #ENDPOINT_LISTENER_SCOPE}. This service property is a list of - * filters. An Endpoint Description should only be given to a Endpoint Listener - * when there is at least one filter that matches the Endpoint Description - * properties. given to it. - * - * This filter model is quite flexible. For example, a discovery bundle is only - * interested in locally originating Endpoint Descriptions. The following filter - * ensure that it only sees local endpoints. - * - * <pre> - * (org.osgi.framework.uuid=72dc5fd9-5f8f-4f8f-9821-9ebb433a5b72) - * </pre> - * - * In the same vein, a manager that is only interested in remote Endpoint - * Descriptions can use a filter like: - * - * <pre> - * (!(org.osgi.framework.uuid=72dc5fd9-5f8f-4f8f-9821-9ebb433a5b72)) - * </pre> - * - * Where in both cases, the given UUID is the UUID of the local framework that - * can be found in the Framework properties. - * - * The Endpoint Listener's scope maps very well to the service hooks. A manager - * can just register all filters found from the Listener Hook as its scope. This - * will automatically provide it with all known endpoints that match the given - * scope, without having to inspect the filter string. - * - * In general, when an Endpoint Description is discovered, it should be - * dispatched to all registered Endpoint Listener services. If a new Endpoint - * Listener is registered, it should be informed about all currently known - * Endpoints that match its scope. If a getter of the Endpoint Listener service - * is unregistered, then all its registered Endpoint Description objects must be - * removed. - * - * The Endpoint Listener models a <i>best effort</i> approach. Participating - * bundles should do their utmost to keep the listeners up to date, but - * implementers should realize that many endpoints come through unreliable - * discovery processes. - * - * - * @ThreadSafe - * @version $Revision$ - */ -public interface EndpointListener { - /** - * Specifies the interest of this listener with filters. This listener is - * only interested in Endpoint Descriptions where its properties match the - * given filter. The type of this property must be <code>String+</code>. - */ - String ENDPOINT_LISTENER_SCOPE = "endpoint.listener.scope"; - - /** - * Register an endpoint with this listener. - * - * If the endpoint matches one of the filters registered with the - * {@link #ENDPOINT_LISTENER_SCOPE} service property then this filter should - * be given as the <code>matchedFilter</code> parameter. - * - * When this service is first registered or it is modified, it should - * receive all known endpoints matching the filter. - * - * @param endpoint The Endpoint Description to be published - * @param matchedFilter The filter from the {@link #ENDPOINT_LISTENER_SCOPE} - * that matched the endpoint, must not be <code>null</code>. - */ - void endpointAdded(EndpointDescription endpoint, String matchedFilter); - - /** - * Remove the registration of an endpoint. - * - * If an endpoint that was registered with the - * {@link #endpointAdded(EndpointDescription, String)} method is no longer - * available then this method should be called. This will remove the - * endpoint from the listener. - * - * It is not necessary to remove endpoints when the service is unregistered - * or modified in such a way that not all endpoints match the interest - * filter anymore. - * - * @param endpoint The Endpoint Description that is no longer valid. - * @param matchedFilter The filter from the {@link #ENDPOINT_LISTENER_SCOPE} - * that matched the endpoint, must not be <code>null</code>. - */ - void endpointRemoved(EndpointDescription endpoint, String matchedFilter); -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointPermission.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointPermission.java deleted file mode 100644 index 433e22e543..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/EndpointPermission.java +++ /dev/null @@ -1,693 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2000, 2010). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -import static org.osgi.service.remoteserviceadmin.RemoteConstants.*; - -import java.io.IOException; -import java.io.NotSerializableException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.ObjectStreamField; -import java.security.Permission; -import java.security.PermissionCollection; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Dictionary; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -import org.osgi.framework.Filter; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; - -/** - * A bundle's authority to export, import or read an Endpoint. - * <ul> - * <li>The <code>export</code> action allows a bundle to export a service as an - * Endpoint.</li> - * <li>The <code>import</code> action allows a bundle to import a service from - * an Endpoint.</li> - * <li>The <code>read</code> action allows a bundle to read references to an - * Endpoint.</li> - * </ul> - * Permission to read an Endpoint is required in order to detect events - * regarding an Endpoint. Untrusted bundles should not be able to detect the - * presence of certain Endpoints unless they have the appropriate - * <code>EndpointPermission</code> to read the specific service. - * - * @ThreadSafe - * @version $Revision$ - */ - -public final class EndpointPermission extends Permission { - static final long serialVersionUID = -7662148639076511574L; - /** - * The action string <code>read</code>. - */ - public final static String READ = "read"; - /** - * The action string <code>import</code>. The <code>import</code> action - * implies the <code>read</code> action. - */ - public final static String IMPORT = "import"; - /** - * The action string <code>export</code>. The <code>export</code> action - * implies the <code>read</code> action. - */ - public final static String EXPORT = "export"; - - private final static int ACTION_READ = 0x00000001; - private final static int ACTION_IMPORT = 0x00000002; - private final static int ACTION_EXPORT = 0x00000004; - private final static int ACTION_ALL = ACTION_EXPORT - | ACTION_IMPORT - | ACTION_READ; - final static int ACTION_NONE = 0; - - /** - * The actions mask. - */ - transient int action_mask; - - /** - * The actions in canonical form. - * - * @serial - */ - private volatile String actions = null; - - /** - * The endpoint used by this EndpointPermission. Must be null if not - * constructed with a endpoint. - */ - transient final EndpointDescription endpoint; - - /** - * This dictionary holds the properties of the permission, used to match a - * filter in implies. - */ - private transient final Dictionary<String, Object> properties; - - /** - * If this EndpointPermission was not constructed with an - * EndpointDescription, this holds a Filter matching object used to evaluate - * the filter in implies or null for wildcard. - */ - transient Filter filter; - - /** - * Create a new EndpointPermission with the specified filter. - * - * <p> - * The filter will be evaluated against the endpoint properties of a - * requested EndpointPermission. - * - * <p> - * There are three possible actions: <code>read</code>, <code>import</code> - * and <code>export</code>. The <code>read</code> action allows the owner of - * this permission to see the presence of distributed services. The - * <code>import</code> action allows the owner of this permission to import - * an endpoint. The <code>export</code> action allows the owner of this - * permission to export a service. - * - * @param filterString The filter string or "*" to match all - * endpoints. - * @param actions The actions <code>read</code>, <code>import</code>, or - * <code>export</code>. - * @throws IllegalArgumentException If the filter has an invalid syntax or - * the actions are not valid. - */ - public EndpointPermission(String filterString, String actions) { - this(filterString, parseActions(actions)); - } - - /** - * Creates a new requested <code>EndpointPermission</code> object to be used - * by code that must perform <code>checkPermission</code>. - * <code>EndpointPermission</code> objects created with this constructor - * cannot be added to an <code>EndpointPermission</code> permission - * collection. - * - * @param endpoint The requested endpoint. - * @param localFrameworkUUID The UUID of the local framework. This is used - * to support matching the - * {@link RemoteConstants#ENDPOINT_FRAMEWORK_UUID - * endpoint.framework.uuid} endpoint property to the - * <code><<LOCAL>></code> value in the filter expression. - * @param actions The actions <code>read</code>, <code>import</code>, or - * <code>export</code>. - * @throws IllegalArgumentException If the endpoint is <code>null</code> or - * the actions are not valid. - */ - public EndpointPermission(EndpointDescription endpoint, - String localFrameworkUUID, String actions) { - super(createName(endpoint)); - setTransients(null, parseActions(actions)); - Map<String, Object> props; - if ((localFrameworkUUID != null) - && localFrameworkUUID.equals(endpoint.getFrameworkUUID())) { - props = new TreeMap<String, Object>(String.CASE_INSENSITIVE_ORDER); - props.putAll(endpoint.getProperties()); - props.put(ENDPOINT_FRAMEWORK_UUID, new String[] { - endpoint.getFrameworkUUID(), "<<LOCAL>>"}); - } - else { - props = endpoint.getProperties(); - } - this.endpoint = endpoint; - this.properties = new EndpointDescription.UnmodifiableDictionary<String, Object>( - props); - } - - /** - * Create a permission name from a EndpointDescription. - * - * @param endpoint EndpointDescription to use to create permission name. - * @return permission name. - */ - private static String createName(EndpointDescription endpoint) { - if (endpoint == null) { - throw new IllegalArgumentException("invalid endpoint: null"); - } - StringBuffer sb = new StringBuffer("(" + ENDPOINT_ID + "="); - sb.append(endpoint.getId()); - sb.append(")"); - return sb.toString(); - } - - /** - * Package private constructor used by EndpointPermissionCollection. - * - * @param name class name - * @param mask action mask - */ - EndpointPermission(String name, int mask) { - super(name); - setTransients(parseFilter(name), mask); - this.endpoint = null; - this.properties = null; - } - - /** - * Called by constructors and when deserialized. - * - * @param mask action mask - */ - private void setTransients(Filter f, int mask) { - if ((mask == ACTION_NONE) || ((mask & ACTION_ALL) != mask)) { - throw new IllegalArgumentException("invalid action string"); - } - action_mask = mask; - filter = f; - } - - /** - * Parse action string into action mask. - * - * @param actions Action string. - * @return action mask. - */ - private static int parseActions(String actions) { - boolean seencomma = false; - - int mask = ACTION_NONE; - - if (actions == null) { - return mask; - } - - char[] a = actions.toCharArray(); - - int i = a.length - 1; - if (i < 0) - return mask; - - while (i != -1) { - char c; - - // skip whitespace - while ((i != -1) - && ((c = a[i]) == ' ' || c == '\r' || c == '\n' - || c == '\f' || c == '\t')) - i--; - - // check for the known strings - int matchlen; - - if (i >= 5 && (a[i - 5] == 'i' || a[i - 5] == 'I') - && (a[i - 4] == 'm' || a[i - 4] == 'M') - && (a[i - 3] == 'p' || a[i - 3] == 'P') - && (a[i - 2] == 'o' || a[i - 2] == 'O') - && (a[i - 1] == 'r' || a[i - 1] == 'R') - && (a[i] == 't' || a[i] == 'T')) { - matchlen = 6; - mask |= ACTION_IMPORT | ACTION_READ; - - } - else - if (i >= 5 && (a[i - 5] == 'e' || a[i - 5] == 'E') - && (a[i - 4] == 'x' || a[i - 4] == 'X') - && (a[i - 3] == 'p' || a[i - 3] == 'P') - && (a[i - 2] == 'o' || a[i - 2] == 'O') - && (a[i - 1] == 'r' || a[i - 1] == 'R') - && (a[i] == 't' || a[i] == 'T')) { - matchlen = 6; - mask |= ACTION_EXPORT | ACTION_READ; - - } - else { - if (i >= 3 && (a[i - 3] == 'r' || a[i - 3] == 'R') - && (a[i - 2] == 'e' || a[i - 2] == 'E') - && (a[i - 1] == 'a' || a[i - 1] == 'A') - && (a[i] == 'd' || a[i] == 'D')) { - matchlen = 4; - mask |= ACTION_READ; - - } - else { - // parse error - throw new IllegalArgumentException( - "invalid permission: " + actions); - } - } - - // make sure we didn't just match the tail of a word - // like "ackbarfread". Also, skip to the comma. - seencomma = false; - while (i >= matchlen && !seencomma) { - switch (a[i - matchlen]) { - case ',' : - seencomma = true; - /* FALLTHROUGH */ - case ' ' : - case '\r' : - case '\n' : - case '\f' : - case '\t' : - break; - default : - throw new IllegalArgumentException( - "invalid permission: " + actions); - } - i--; - } - - // point i at the location of the comma minus one (or -1). - i -= matchlen; - } - - if (seencomma) { - throw new IllegalArgumentException("invalid permission: " + actions); - } - - return mask; - } - - /** - * Parse filter string into a Filter object. - * - * @param filterString The filter string to parse. - * @return a Filter for this bundle. - * @throws IllegalArgumentException If the filter syntax is invalid. - */ - private static Filter parseFilter(String filterString) { - if (filterString == null) { - throw new IllegalArgumentException("invalid filter: null"); - } - filterString = filterString.trim(); - if (filterString.equals("*")) { - return null; // wildcard - } - try { - return FrameworkUtil.createFilter(filterString); - } - catch (InvalidSyntaxException e) { - IllegalArgumentException iae = new IllegalArgumentException( - "invalid filter"); - iae.initCause(e); - throw iae; - } - } - - /** - * Determines if a <code>EndpointPermission</code> object "implies" the - * specified permission. - * - * @param p The target permission to check. - * @return <code>true</code> if the specified permission is implied by this - * object; <code>false</code> otherwise. - */ - public boolean implies(Permission p) { - if (!(p instanceof EndpointPermission)) { - return false; - } - EndpointPermission requested = (EndpointPermission) p; - if (endpoint != null) { - return false; - } - // if requested permission has a filter, then it is an invalid argument - if (requested.filter != null) { - return false; - } - return implies0(requested, ACTION_NONE); - } - - /** - * Internal implies method. Used by the implies and the permission - * collection implies methods. - * - * @param requested The requested EndpointPermission which has already be - * validated as a proper argument. The requested EndpointPermission - * must not have a filter expression. - * @param effective The effective actions with which to start. - * @return <code>true</code> if the specified permission is implied by this - * object; <code>false</code> otherwise. - */ - boolean implies0(EndpointPermission requested, int effective) { - /* check actions first - much faster */ - effective |= action_mask; - final int desired = requested.action_mask; - if ((effective & desired) != desired) { - return false; - } - /* if we have no filter */ - Filter f = filter; - if (f == null) { - // it's "*" - return true; - } - return f.matchCase(requested.getProperties()); - } - - /** - * Returns the canonical string representation of the actions. Always - * returns present actions in the following canonical order: - * <code>read</code>, <code>import</code>, <code>export</code>. - * - * @return The canonical string representation of the actions. - */ - public String getActions() { - String result = actions; - if (result == null) { - StringBuffer sb = new StringBuffer(); - boolean comma = false; - - int mask = action_mask; - if ((mask & ACTION_READ) == ACTION_READ) { - sb.append(READ); - comma = true; - } - - if ((mask & ACTION_IMPORT) == ACTION_IMPORT) { - if (comma) - sb.append(','); - sb.append(IMPORT); - } - - if ((mask & ACTION_EXPORT) == ACTION_EXPORT) { - if (comma) - sb.append(','); - sb.append(EXPORT); - } - - actions = result = sb.toString(); - } - - return result; - } - - /** - * Returns a new <code>PermissionCollection</code> object for storing - * <code>EndpointPermission<code> objects. - * - * @return A new <code>PermissionCollection</code> object suitable for - * storing <code>EndpointPermission</code> objects. - */ - public PermissionCollection newPermissionCollection() { - return new EndpointPermissionCollection(); - } - - /** - * Determines the equality of two EndpointPermission objects. - * - * Checks that specified object has the same name, actions and endpoint as - * this <code>EndpointPermission</code>. - * - * @param obj The object to test for equality. - * @return true if obj is a <code>EndpointPermission</code>, and has the - * same name, actions and endpoint as this - * <code>EndpointPermission</code> object; <code>false</code> - * otherwise. - */ - public boolean equals(Object obj) { - if (obj == this) { - return true; - } - - if (!(obj instanceof EndpointPermission)) { - return false; - } - - EndpointPermission ep = (EndpointPermission) obj; - - return (action_mask == ep.action_mask) - && getName().equals(ep.getName()) - && ((endpoint == ep.endpoint) || ((endpoint != null) - && (ep.endpoint != null) && endpoint - .equals(ep.endpoint))); - } - - /** - * Returns the hash code value for this object. - * - * @return Hash code value for this object. - */ - public int hashCode() { - int h = 31 * 17 + getName().hashCode(); - h = 31 * h + getActions().hashCode(); - if (endpoint != null) { - h = 31 * h + endpoint.hashCode(); - } - return h; - } - - /** - * WriteObject is called to save the state of this permission to a stream. - * The actions are serialized, and the superclass takes care of the name. - */ - private synchronized void writeObject(java.io.ObjectOutputStream s) - throws IOException { - if (endpoint != null) { - throw new NotSerializableException("cannot serialize"); - } - // Write out the actions. The superclass takes care of the name - // call getActions to make sure actions field is initialized - if (actions == null) { - getActions(); - } - s.defaultWriteObject(); - } - - /** - * readObject is called to restore the state of this permission from a - * stream. - */ - private synchronized void readObject(java.io.ObjectInputStream s) - throws IOException, ClassNotFoundException { - // Read in the action, then initialize the rest - s.defaultReadObject(); - setTransients(parseFilter(getName()), parseActions(actions)); - } - - /** - * Called by <code><@link EndpointPermission#implies(Permission)></code>. - * - * @return a dictionary of properties for this permission. - */ - private Dictionary<String, Object> getProperties() { - return properties; - } -} - -/** - * Stores a set of EndpointPermission permissions. - * - * @see java.security.Permission - * @see java.security.Permissions - * @see java.security.PermissionCollection - */ -final class EndpointPermissionCollection extends PermissionCollection { - static final long serialVersionUID = 662615640374640621L; - /** - * Table of permissions. - * - * @serial - * @GuardedBy this - */ - private Map<String, EndpointPermission> permissions; - - /** - * Boolean saying if "*" is in the collection. - * - * @serial - * @GuardedBy this - */ - private boolean all_allowed; - - /** - * Creates an empty EndpointPermissions object. - */ - public EndpointPermissionCollection() { - permissions = new HashMap<String, EndpointPermission>(); - all_allowed = false; - } - - /** - * Adds a permission to this permission collection. - * - * @param permission The Permission object to add. - * @throws IllegalArgumentException If the specified permission is not a - * EndpointPermission object. - * @throws SecurityException If this - * <code>EndpointPermissionCollection</code> object has been marked - * read-only. - */ - public void add(final Permission permission) { - if (!(permission instanceof EndpointPermission)) { - throw new IllegalArgumentException("invalid permission: " - + permission); - } - if (isReadOnly()) { - throw new SecurityException("attempt to add a Permission to a " - + "readonly PermissionCollection"); - } - - final EndpointPermission ep = (EndpointPermission) permission; - if (ep.endpoint != null) { - throw new IllegalArgumentException("cannot add to collection: " - + ep); - } - - final String name = ep.getName(); - synchronized (this) { - /* select the bucket for the permission */ - Map<String, EndpointPermission> pc = permissions; - final EndpointPermission existing = (EndpointPermission) pc - .get(name); - - if (existing != null) { - final int oldMask = existing.action_mask; - final int newMask = ep.action_mask; - if (oldMask != newMask) { - pc.put(name, - new EndpointPermission(name, oldMask | newMask)); - } - } - else { - pc.put(name, ep); - } - - if (!all_allowed) { - if (name.equals("*")) { - all_allowed = true; - } - } - } - } - - /** - * Determines if a set of permissions implies the permissions expressed in - * <code>permission</code>. - * - * @param permission The Permission object to compare. - * @return <code>true</code> if <code>permission</code> is a proper subset - * of a permission in the set; <code>false</code> otherwise. - */ - public boolean implies(final Permission permission) { - if (!(permission instanceof EndpointPermission)) { - return false; - } - final EndpointPermission requested = (EndpointPermission) permission; - /* if requested permission has a filter, then it is an invalid argument */ - if (requested.filter != null) { - return false; - } - int effective = EndpointPermission.ACTION_NONE; - Collection<EndpointPermission> perms; - synchronized (this) { - final int desired = requested.action_mask; - /* short circuit if the "*" Permission was added */ - if (all_allowed) { - EndpointPermission ep = permissions.get("*"); - if (ep != null) { - effective |= ep.action_mask; - if ((effective & desired) == desired) { - return true; - } - } - } - perms = permissions.values(); - } - - /* iterate one by one over permissions */ - for (Iterator<EndpointPermission> iter = perms.iterator(); iter - .hasNext();) { - if (iter.next().implies0(requested, effective)) { - return true; - } - } - return false; - } - - /** - * Returns an enumeration of all the <code>EndpointPermission</code> objects - * in the container. - * - * @return Enumeration of all the EndpointPermission objects. - */ - public synchronized Enumeration<Permission> elements() { - List<Permission> all = new ArrayList<Permission>(permissions.values()); - return Collections.enumeration(all); - } - - /* serialization logic */ - private static final ObjectStreamField[] serialPersistentFields = { - new ObjectStreamField("permissions", HashMap.class), - new ObjectStreamField("all_allowed", Boolean.TYPE) }; - - private synchronized void writeObject(ObjectOutputStream out) - throws IOException { - ObjectOutputStream.PutField pfields = out.putFields(); - pfields.put("permissions", permissions); - pfields.put("all_allowed", all_allowed); - out.writeFields(); - } - - private synchronized void readObject(java.io.ObjectInputStream in) - throws IOException, ClassNotFoundException { - ObjectInputStream.GetField gfields = in.readFields(); - permissions = (HashMap<String, EndpointPermission>) gfields.get( - "permissions", new HashMap<String, EndpointPermission>()); - all_allowed = gfields.get("all_allowed", false); - } -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ExportReference.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ExportReference.java deleted file mode 100644 index 03b3235c59..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ExportReference.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -import org.osgi.framework.ServiceReference; - -/** - * An Export Reference associates a service with a local endpoint. - * - * The Export Reference can be used to reference an exported service. When the - * service is no longer exported, all methods must return <code>null</code>; - * - * @ThreadSafe - * @version $Revision$ - */ -public interface ExportReference { - /** - * Return the service being exported. - * - * @return The service being exported, must be <code>null</code> when this - * registration is unregistered. - */ - ServiceReference getExportedService(); - - /** - * Return the Endpoint Description that is created for this registration. - * - * @return the local Endpoint Description - */ - EndpointDescription getExportedEndpoint(); -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ExportRegistration.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ExportRegistration.java deleted file mode 100644 index e8c6c66cbf..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ExportRegistration.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -import org.osgi.framework.ServiceReference; - -/** - * An Export Registration associates a service to a local endpoint. - * - * The Export Registration can be used to delete the endpoint associated with an - * this registration. It is created with the - * {@link RemoteServiceAdmin#exportService(ServiceReference,java.util.Map)} - * method. - * - * When this Export Registration has been unregistered, the methods must all - * return <code>null</code>. - * - * @ThreadSafe - * @version $Revision$ - */ -public interface ExportRegistration { - /** - * Return the Export Reference for the exported service. - * - * @return An Export Reference for this registration - * @throws IllegalStateException Thrown when this object was not properly - * initialized, see {@link #getException()} - */ - ExportReference getExportReference(); - - /** - * Delete the local endpoint and disconnect any remote distribution - * providers. After this method returns, all the methods must return - * <code>null</code>. - * - * This method has no effect when the endpoint is already destroyed or being - * destroyed. - */ - void close(); - - /** - * Exception for any error during the import process. - * - * If the Remote Admin for some reasons is unable to create a registration, - * then it must return a <code>Throwable</code> from this method. In this - * case, all other methods must return on this interface must throw an - * Illegal State Exception. If no error occurred, this method must return - * <code>null</code>. - * - * The error must be set before this Import Registration is returned. - * Asynchronously occurring errors must be reported to the log. - * - * @return The exception that occurred during the creation of the - * registration or <code>null</code> if no exception occurred. - */ - Throwable getException(); -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ImportReference.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ImportReference.java deleted file mode 100644 index 5fa5673341..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ImportReference.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -import org.osgi.framework.ServiceReference; - -/** - * An Import Reference associates an active proxy service to a remote endpoint. - * - * The Import Reference can be used to reference an imported service. When the - * service is no longer imported, all methods must return <code>null</code>; - * - * @ThreadSafe - * @version $Revision$ - */ -public interface ImportReference { - /** - * Answer the associated Service Reference for the proxy to the endpoint. - * - * @return A Service Reference to the proxy for the endpoint. - */ - ServiceReference getImportedService(); - - /** - * Answer the associated remote Endpoint Description. - * - * @return A Endpoint Description for the remote endpoint. - */ - EndpointDescription getImportedEndpoint(); -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ImportRegistration.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ImportRegistration.java deleted file mode 100644 index 1fc1c6f6ba..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/ImportRegistration.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -/** - * An Import Registration associates an active proxy service to a remote - * endpoint. - * - * The Import Registration can be used to delete the proxy associated with an - * endpoint. It is created with the{@link RemoteServiceAdmin#importService} - * method. - * - * @ThreadSafe - * @version $Revision$ - */ -public interface ImportRegistration { - /** - * Answer the associated Export Reference. - * - * @return An Import Reference for this registration - * @throws IllegalStateException Thrown when this object was not properly - * initialized, see {@link #getException()} - */ - ImportReference getImportReference(); - - /** - * Unregister this Import Registration. This must close the connection to - * the end endpoint unregister the proxy. After this method returns, all - * other methods must return null. - * - * This method has no effect when the service is already unregistered or in - * the process off. - */ - void close(); - - /** - * Exception for any error during the import process. - * - * If the Remote Admin for some reasons is unable to create a registration, - * then it must return a <code>Throwable</code> from this method. In this - * case, all other methods must return on this interface must thrown an - * Illegal State Exception. If no error occurred, this method must return - * <code>null</code>. - * - * The error must be set before this Import Registration is returned. - * Asynchronously occurring errors must be reported to the log. - * - * @return The exception that occurred during the creation of the - * registration or <code>null</code> if no exception occurred. - */ - Throwable getException(); - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteConstants.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteConstants.java deleted file mode 100644 index cf2194ec12..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteConstants.java +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009, 2010). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -/** - * Provide the definition of the constants used in the Remote Services API. - * - * @Immutable - * @version $Revision$ - */ -public class RemoteConstants { - private RemoteConstants() { - } - - /** - * Service property identifying the configuration types supported by a - * distribution provider. Registered by the distribution provider on one of - * its services to indicate the supported configuration types. - * <p> - * The value of this property must be of type <code>String</code>, - * <code>String[]</code>, or <code>Collection<String></code>. - */ - public static final String REMOTE_CONFIGS_SUPPORTED = "remote.configs.supported"; - - /** - * Service property identifying the intents supported by a distribution - * provider. Registered by the distribution provider on one of its services - * to indicate the vocabulary of implemented intents. - * - * <p> - * The value of this property must be of type <code>String</code>, - * <code>String[]</code>, or <code>Collection<String></code>. - */ - public static final String REMOTE_INTENTS_SUPPORTED = "remote.intents.supported"; - - /** - * Service property identifying the configuration types that should be used - * to export the service. Each configuration type represents the - * configuration parameters for an endpoint. A distribution provider should - * create an endpoint for each configuration type that it supports. - * - * <p> - * This property may be supplied in the <code>properties</code> - * <code>Dictionary</code> object passed to the - * <code>BundleContext.registerService</code> method. The value of this - * property must be of type <code>String</code>, <code>String[]</code>, or - * <code>Collection<String></code>. - */ - public static final String SERVICE_EXPORTED_CONFIGS = "service.exported.configs"; - - /** - * Service property identifying the intents that the distribution provider - * must implement to distribute the service. Intents listed in this property - * are reserved for intents that are critical for the code to function - * correctly, for example, ordering of messages. These intents should not be - * configurable. - * - * <p> - * This property may be supplied in the <code>properties</code> - * <code>Dictionary</code> object passed to the - * <code>BundleContext.registerService</code> method. The value of this - * property must be of type <code>String</code>, <code>String[]</code>, or - * <code>Collection<String></code>. - */ - public static final String SERVICE_EXPORTED_INTENTS = "service.exported.intents"; - - /** - * Service property identifying the extra intents that the distribution - * provider must implement to distribute the service. This property is - * merged with the <code>service.exported.intents</code> property before the - * distribution provider interprets the listed intents; it has therefore the - * same semantics but the property should be configurable so the - * administrator can choose the intents based on the topology. Bundles - * should therefore make this property configurable, for example through the - * Configuration Admin service. - * - * <p> - * This property may be supplied in the <code>properties</code> - * <code>Dictionary</code> object passed to the - * <code>BundleContext.registerService</code> method. The value of this - * property must be of type <code>String</code>, <code>String[]</code>, or - * <code>Collection<String></code>. - */ - public static final String SERVICE_EXPORTED_INTENTS_EXTRA = "service.exported.intents.extra"; - - /** - * Service property marking the service for export. It defines the - * interfaces under which this service can be exported. This list must be a - * subset of the types under which the service was registered. The single - * value of an asterisk ("*", \u002A) indicates all the - * interface types under which the service was registered excluding the - * non-interface types. It is strongly recommended to only export interface - * types and not concrete classes due to the complexity of creating proxies - * for some type of concrete classes. - * - * <p> - * This property may be supplied in the <code>properties</code> - * <code>Dictionary</code> object passed to the - * <code>BundleContext.registerService</code> method. The value of this - * property must be of type <code>String</code>, <code>String[]</code>, or - * <code>Collection<String></code>. - */ - public static final String SERVICE_EXPORTED_INTERFACES = "service.exported.interfaces"; - - /** - * Service property identifying the service as imported. This service - * property must be set by a distribution provider to any value when it - * registers the endpoint proxy as an imported service. A bundle can use - * this property to filter out imported services. - * - * <p> - * The value of this property may be of any type. - */ - public static final String SERVICE_IMPORTED = "service.imported"; - - /** - * Service property identifying the configuration types used to import the - * service. Any associated properties for this configuration types must be - * properly mapped to the importing system. For example, a URL in these - * properties must point to a valid resource when used in the importing - * framework. If multiple configuration types are listed in this property, - * then they must be synonyms for exactly the same remote endpoint that is - * used to export this service. - * - * <p> - * The value of this property must be of type <code>String</code>, - * <code>String[]</code>, or <code>Collection<String></code>. - * - * @see #SERVICE_EXPORTED_CONFIGS - */ - public static final String SERVICE_IMPORTED_CONFIGS = "service.imported.configs"; - - /** - * Service property identifying the intents that this service implement. - * This property has a dual purpose: - * <ul> - * <li>A bundle can use this service property to notify the distribution - * provider that these intents are already implemented by the exported - * service object.</li> - * <li>A distribution provider must use this property to convey the combined - * intents of: The exporting service, and, the intents that the exporting - * distribution provider adds, and the intents that the importing - * distribution provider adds.</li> - * </ul> - * To export a service, a distribution provider must expand any qualified - * intents. Both the exporting and importing distribution providers must - * recognize all intents before a service can be distributed. - * - * <p> - * The value of this property must be of type <code>String</code>, - * <code>String[]</code>, or <code>Collection<String></code>. - */ - public static final String SERVICE_INTENTS = "service.intents"; - - /* above are from Ch 13 Remote Service spec. */ - - /** - * Endpoint property identifying the id for this endpoint. This service - * property must always be set. - * - * <p> - * The value of this property must be of type <code>String</code>. - */ - public final static String ENDPOINT_ID = "endpoint.id"; - - /** - * Endpoint property identifying the service id of the exported service. Can - * be absent or 0 if the corresponding endpoint is not for an OSGi service. - * - * <p> - * The value of this property must be of type <code>Long</code>. - */ - public final static String ENDPOINT_SERVICE_ID = "endpoint.service.id"; - - /** - * Endpoint property identifying the universally unique id of the exporting - * framework. Can be absent if the corresponding endpoint is not for an OSGi - * service. - * - * <p> - * The value of this property must be of type <code>String</code>. - */ - public final static String ENDPOINT_FRAMEWORK_UUID = "endpoint.framework.uuid"; - - /** - * Prefix for an endpoint property identifying the interface Java package - * version for an interface. For example, the property - * endpoint.package.version.com.acme=1.3 describes the version of the - * package for the com.acme.Foo interface. This endpoint property for an - * interface package does not have to be set. If not set, the value must be - * assumed to be 0. - * - * <p> - * Since endpoint properties are stored in a case insensitive map, case - * variants of a package name are folded together. - * - * <p> - * The value of this property must be of type <code>String</code>. - */ - public final static String ENDPOINT_PACKAGE_VERSION_ = "endpoint.package.version."; - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdmin.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdmin.java deleted file mode 100644 index 98f56a07ae..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdmin.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -import java.util.Collection; -import java.util.Map; - -import org.osgi.framework.ServiceReference; - -/** - * A Remote Service Admin manages the import and export of services. - * - * A Distribution Provider can expose a control interface. This interface allows - * the a remote manager to control the export and import of services. - * - * The API allows a remote manager to export a service, to import a service, and - * find out about the current imports and exports. - * - * @ThreadSafe - * @version $Revision$ - */ -public interface RemoteServiceAdmin { - - /** - * Export a service to a given Endpoint. The Remote Service Admin must - * create an Endpoint from the given description that can be used by other - * Distrbution Providers to connect to this Remote Service Admin and use the - * exported service. This method can return null if the service could not be - * exported because the Endpoint could not be implemented by this Remote - * Service Admin. - * - * The properties on a Service Reference are case insensitive while the - * properties on a <code>properties</code> are case sensitive. A value in - * the <code>properties</code> must therefore override any case variant in - * the properties of the Service Reference. - * - * <p> - * If the caller does not have the appropriate - * <code>EndpointPermission[endpoint,EXPORT]</code> for an Endpoint, and the - * Java Runtime Environment supports permissions, then the - * {@link ExportRegistration#getException() getException} method on the - * corresponding returned {@link ExportRegistration} will return a - * <code>SecurityException</code>. - * - * @param reference The Service Reference to export. - * @param properties The properties to create a local Endpoint that can be - * implemented by this Remote Service Admin. If this is null, the - * Endpoint will be determined by the properties on the service. The - * properties are the same as given for an exported service. They are - * overlaid over any properties the service defines (case - * insensitive). This parameter can be <code>null</code>, this should - * be treated as an empty map. - * - * @return An Export Registration that combines the Endpoint Description and - * the Service Reference. Is never <code>null</code>. - * @throws IllegalArgumentException If any of the properties has a value - * that is not syntactically correct or if the service properties - * and the overlaid properties do not contain a - * {@link RemoteConstants#SERVICE_EXPORTED_INTERFACES} entry. - * @throws UnsupportedOperationException If any of the intents expressed - * through the properties is not supported by the distribution - * provider. - */ - Collection<ExportRegistration> exportService(ServiceReference reference, - Map<String, Object> properties); - - /** - * Import a service from an Endpoint. The Remote Service Admin must use the - * given Endpoint to create a proxy. This method can return null if the - * service could not be imported. - * - * @param endpoint The Endpoint Description to be used for import. - * @return An Import Registration that combines the Endpoint Description and - * the Service Reference or <code>null</code> if the Endpoint could - * not be imported. - * @throws SecurityException If the caller does not have the appropriate - * <code>EndpointPermission[endpoint,IMPORT]</code> for the - * Endpoint, and the Java Runtime Environment supports permissions. - */ - ImportRegistration importService(EndpointDescription endpoint); - - /** - * Return the currently active Export References. - * - * <p> - * If the caller does not have the appropriate - * <code>EndpointPermission[endpoint,READ]</code> for an Endpoint, and the - * Java Runtime Environment supports permissions, then returned collection - * will not contain a reference to the exported Endpoint. - * - * @return A <code>Collection</code> of {@link ExportReference}s that are - * currently active. - */ - Collection<ExportReference> getExportedServices(); - - /** - * Return the currently active Import References. - * - * <p> - * If the caller does not have the appropriate - * <code>EndpointPermission[endpoint,READ]</code> for an Endpoint, and the - * Java Runtime Environment supports permissions, then returned collection - * will not contain a reference to the imported Endpoint. - * - * @return A <code>Collection</code> of {@link ImportReference}s that are - * currently active. - */ - Collection<ImportReference> getImportedEndpoints(); - -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdminEvent.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdminEvent.java deleted file mode 100644 index 8f4ac717c8..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdminEvent.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -import org.osgi.framework.Bundle; - -/** - * Provides the event information for a Remote Admin event. - * - * @Immutable - * @version $Revision$ - */ -public class RemoteServiceAdminEvent { - /** - * Add an import registration. The Remote Services Admin will call this - * method when it imports a service. When this service is registered, the - * Remote Service Admin must notify the listener of all existing Import - * Registrations. - * - */ - public static final int IMPORT_REGISTRATION = 1; - - /** - * Add an export registration. The Remote Services Admin will call this - * method when it exports a service. When this service is registered, the - * Remote Service Admin must notify the listener of all existing Export - * Registrations. - */ - public static final int EXPORT_REGISTRATION = 2; - - /** - * Remove an export registration. The Remote Services Admin will call this - * method when it removes the export of a service. - * - */ - public static final int EXPORT_UNREGISTRATION = 3; - - /** - * Remove an import registration. The Remote Services Admin will call this - * method when it removes the import of a service. - * - */ - public static final int IMPORT_UNREGISTRATION = 4; - - /** - * A fatal importing error occurred. The Import Registration has been - * closed. - */ - public static final int IMPORT_ERROR = 5; - - /** - * A fatal exporting error occurred. The Export Registration has been - * closed. - */ - public static final int EXPORT_ERROR = 6; - - /** - * A problematic situation occurred, the export is still active. - */ - public static final int EXPORT_WARNING = 7; - /** - * A problematic situation occurred, the import is still active. - */ - public static final int IMPORT_WARNING = 8; - - private final ImportReference importReference; - private final ExportReference exportReference; - private final Throwable exception; - private final int type; - private final Bundle source; - - /** - * Private constructor. - * - * @param type The event type - * @param source The source bundle, must not be <code>null</code>. - * @param importReference The importReference, can be <code>null</code>. - * @param exportReference The exportReference, can be <code>null</code>. - * @param exception Any exceptions encountered, can be <code>null</code> - */ - private RemoteServiceAdminEvent(int type, Bundle source, - ImportReference importReference, ExportReference exportReference, - Throwable exception) { - if (source == null) { - throw new NullPointerException("source must not be null"); - } - this.type = type; - this.source = source; - this.importReference = importReference; - this.exportReference = exportReference; - this.exception = exception; - } - - /** - * Create a Remote Service Admin Event for an export notification. - * - * @param type The event type. - * @param source The source bundle, must not be <code>null</code>. - * @param exportReference The exportReference, can not be <code>null</code>. - * @param exception Any exceptions encountered, can be <code>null</code>. - */ - public RemoteServiceAdminEvent(int type, Bundle source, - ExportReference exportReference, Throwable exception) { - this(type, source, null, exportReference, exception); - } - - /** - * Create a Remote Service Admin Event for an import notification. - * - * @param type The event type. - * @param source The source bundle, must not be <code>null</code>. - * @param importReference The importReference, can not be <code>null</code>. - * @param exception Any exceptions encountered, can be <code>null</code>. - */ - public RemoteServiceAdminEvent(int type, Bundle source, - ImportReference importReference, Throwable exception) { - this(type, source, importReference, null, exception); - } - - /** - * Return the Import Reference for this event. - * - * @return The Import Reference or <code>null</code>. - */ - public ImportReference getImportReference() { - return importReference; - } - - /** - * Return the Export Reference for this event. - * - * @return The Export Reference or <code>null</code>. - */ - public ExportReference getExportReference() { - return exportReference; - } - - /** - * Return the exception for this event. - * - * @return The exception or <code>null</code>. - */ - public Throwable getException() { - return exception; - } - - /** - * Return the type of this event. - * - * @return The type of this event. - */ - public int getType() { - return type; - } - - /** - * Return the bundle source of this event. - * - * @return The bundle source of this event. - */ - public Bundle getSource() { - return source; - } -} diff --git a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdminListener.java b/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdminListener.java deleted file mode 100644 index 2941f8b117..0000000000 --- a/sca-java-2.x/branches/2.0-Beta1/modules/node-impl-osgi/src/main/java/org/osgi/service/remoteserviceadmin/RemoteServiceAdminListener.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) OSGi Alliance (2009). All Rights Reserved. - * - * Licensed 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.osgi.service.remoteserviceadmin; - -/** - * A {@link RemoteServiceAdminEvent} listener is notified synchronously of any - * export or import registrations and unregistrations. - * - * <p> - * If the Java Runtime Environment supports permissions, then filtering is done. - * <code>RemoteServiceAdminEvent</code> objects are only delivered to the - * listener if the bundle which defines the listener object's class has the - * appropriate <code>EndpointPermission[endpoint,READ]</code> for the endpoint - * referenced by the event. - * - * - * @see RemoteServiceAdminEvent - * @ThreadSafe - * @version $Revision$ - */ - -public interface RemoteServiceAdminListener { - /** - * Receive notification of any export or import registrations and - * unregistrations as well as errors and warnings. - * - * @param event The {@link RemoteServiceAdminEvent} object. - */ - void remoteAdminEvent(RemoteServiceAdminEvent event); -} |