[DOSGI-229] Refactor api and fix some issues
diff --git a/dsw/cxf-dsw/pom.xml b/dsw/cxf-dsw/pom.xml
index 52727ae..3693a23 100644
--- a/dsw/cxf-dsw/pom.xml
+++ b/dsw/cxf-dsw/pom.xml
@@ -97,6 +97,11 @@
<artifactId>easymockclassextension</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-jdk14</artifactId>
+ <version>1.7.14</version>
+ </dependency>
</dependencies>
<build>
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/ConfigurationTypeHandler.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/ConfigurationTypeHandler.java
deleted file mode 100644
index fb42606..0000000
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/ConfigurationTypeHandler.java
+++ /dev/null
@@ -1,43 +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.cxf.dosgi.dsw.api;
-
-import java.util.Map;
-
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.remoteserviceadmin.EndpointDescription;
-
-public interface ConfigurationTypeHandler {
-
- String[] getSupportedTypes();
-
- ExportResult createServer(ServiceReference<?> serviceReference,
- BundleContext dswContext,
- BundleContext callingContext,
- Map<String, Object> sd,
- Class<?> iClass,
- Object serviceBean);
-
- Object createProxy(ServiceReference<?> serviceReference,
- BundleContext dswContext,
- BundleContext callingContext,
- Class<?> iClass,
- EndpointDescription endpoint) throws IntentUnsatisfiedException;
-}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/DistributionProvider.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/DistributionProvider.java
new file mode 100644
index 0000000..a16f2bd
--- /dev/null
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/DistributionProvider.java
@@ -0,0 +1,52 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.dosgi.dsw.api;
+
+import java.util.Map;
+
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.remoteserviceadmin.EndpointDescription;
+
+public interface DistributionProvider {
+
+ String[] getSupportedTypes();
+
+ /**
+ *
+ * @param sref reference of the service to be exported
+ * @param effectiveProperties combined properties of the service and additional properties from rsa
+ * @param exportedInterface name of the interface to be exported
+ * @return
+ */
+ Endpoint createServer(ServiceReference<?> sref,
+ Map<String, Object> effectiveProperties,
+ String exportedInterface);
+
+ /**
+ *
+ * @param sref reference of the service offered to the requesting bundle
+ * @param iClass
+ * @param endpoint description of the remote endpoint
+ * @return service proxy to be given to the requesting bundle
+ * @throws IntentUnsatisfiedException
+ */
+ Object createProxy(ServiceReference<?> sref,
+ Class<?> iClass,
+ EndpointDescription endpoint) throws IntentUnsatisfiedException;
+}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/Endpoint.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/Endpoint.java
new file mode 100644
index 0000000..f45b562
--- /dev/null
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/Endpoint.java
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.dosgi.dsw.api;
+
+import java.io.Closeable;
+
+import org.osgi.service.remoteserviceadmin.EndpointDescription;
+
+public interface Endpoint extends Closeable {
+ EndpointDescription description();
+}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/ExportResult.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/ExportResult.java
deleted file mode 100644
index 86acf8c..0000000
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/api/ExportResult.java
+++ /dev/null
@@ -1,53 +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.cxf.dosgi.dsw.api;
-
-import java.io.Closeable;
-import java.util.Map;
-
-public class ExportResult {
-
- private final Map<String, Object> endpointProps;
- private final Closeable server;
- private final Exception exception;
-
- public ExportResult(Map<String, Object> endpointProps, Closeable server) {
- this.endpointProps = endpointProps;
- this.server = server;
- this.exception = null;
- }
-
- public ExportResult(Map<String, Object> endpointProps, Exception ex) {
- this.endpointProps = endpointProps;
- this.server = null;
- this.exception = ex;
- }
-
- public Map<String, Object> getEndpointProps() {
- return endpointProps;
- }
-
- public Closeable getServer() {
- return server;
- }
-
- public Exception getException() {
- return exception;
- }
-}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/decorator/DecorationParser.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/decorator/DecorationParser.java
index c7a8f96..82753b1 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/decorator/DecorationParser.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/decorator/DecorationParser.java
@@ -18,6 +18,7 @@
*/
package org.apache.cxf.dosgi.dsw.decorator;
+import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
@@ -28,19 +29,17 @@
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
-import org.xml.sax.SAXException;
import org.apache.cxf.xmlns.service_decoration._1_0.ServiceDecorationType;
import org.apache.cxf.xmlns.service_decoration._1_0.ServiceDecorationsType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
class DecorationParser {
- private static final Logger LOG = LoggerFactory.getLogger(ServiceDecoratorImpl.class);
private JAXBContext jaxbContext;
private Schema schema;
@@ -51,29 +50,36 @@
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL resource = getClass().getResource("/service-decoration.xsd");
schema = schemaFactory.newSchema(resource);
- } catch (JAXBException e) {
- throw new RuntimeException(e.getMessage(), e);
- } catch (SAXException e) {
+ } catch (Exception e) {
throw new RuntimeException("Error loading decorations schema", e);
}
}
- List<ServiceDecorationType> getDecorations(URL resourceURL) {
- if (resourceURL == null) {
+ List<ServiceDecorationType> getDecorations(URL resourceURL) throws JAXBException, IOException {
+ if (resourceURL == null || !decorationType(resourceURL)) {
return new ArrayList<ServiceDecorationType>();
}
+ Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+ unmarshaller.setSchema(schema);
+ InputStream is = resourceURL.openStream();
+ Source source = new StreamSource(is);
+ JAXBElement<ServiceDecorationsType> jaxb = unmarshaller.unmarshal(source, ServiceDecorationsType.class);
+ ServiceDecorationsType decorations = jaxb.getValue();
+ return decorations.getServiceDecoration();
+ }
+
+ private boolean decorationType(URL resourceURL) {
try {
- Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
- unmarshaller.setSchema(schema);
InputStream is = resourceURL.openStream();
- Source source = new StreamSource(is);
- JAXBElement<ServiceDecorationsType> jaxb = unmarshaller.unmarshal(source, ServiceDecorationsType.class);
- ServiceDecorationsType decorations = jaxb.getValue();
- return decorations.getServiceDecoration();
- } catch (Exception ex) {
- LOG.warn("Problem parsing: " + resourceURL, ex);
- return new ArrayList<ServiceDecorationType>();
+ XMLInputFactory factory = XMLInputFactory.newInstance();
+ XMLStreamReader reader = factory.createXMLStreamReader(is);
+ reader.next();
+ String ns = reader.getNamespaceURI();
+ reader.close();
+ return ns.equals("http://cxf.apache.org/xmlns/service-decoration/1.0.0");
+ } catch (Exception e) {
+ return false;
}
}
}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/decorator/ServiceDecoratorImpl.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/decorator/ServiceDecoratorImpl.java
index cc8a2dc..20130c3 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/decorator/ServiceDecoratorImpl.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/decorator/ServiceDecoratorImpl.java
@@ -32,8 +32,11 @@
import org.apache.cxf.xmlns.service_decoration._1_0.ServiceDecorationType;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class ServiceDecoratorImpl implements ServiceDecorator {
+ private static final Logger LOG = LoggerFactory.getLogger(ServiceDecoratorImpl.class);
final List<Rule> decorations = new CopyOnWriteArrayList<Rule>();
private DecorationParser parser;
@@ -75,7 +78,11 @@
}
List<ServiceDecorationType> elements = new ArrayList<ServiceDecorationType>();
while (entries.hasMoreElements()) {
- elements.addAll(parser.getDecorations((URL)entries.nextElement()));
+ try {
+ elements.addAll(parser.getDecorations((URL)entries.nextElement()));
+ } catch (Exception e) {
+ LOG.warn("Error parsing remote-service descriptions in bundle" + bundle.getSymbolicName(), e);
+ }
}
return elements;
}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java
index 7992062..b1dffff 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/AbstractPojoConfigurationTypeHandler.java
@@ -31,8 +31,8 @@
import org.apache.cxf.BusFactory;
import org.apache.cxf.common.util.PackageUtils;
import org.apache.cxf.dosgi.dsw.Constants;
-import org.apache.cxf.dosgi.dsw.api.ConfigurationTypeHandler;
-import org.apache.cxf.dosgi.dsw.api.ExportResult;
+import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.apache.cxf.dosgi.dsw.qos.IntentManager;
import org.apache.cxf.dosgi.dsw.qos.IntentUtils;
import org.apache.cxf.dosgi.dsw.util.ClassUtils;
@@ -47,11 +47,12 @@
import org.apache.cxf.interceptor.Interceptor;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
+import org.osgi.service.remoteserviceadmin.EndpointDescription;
import org.osgi.service.remoteserviceadmin.RemoteConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public abstract class AbstractPojoConfigurationTypeHandler implements ConfigurationTypeHandler {
+public abstract class AbstractPojoConfigurationTypeHandler implements DistributionProvider {
private static final Logger LOG = LoggerFactory.getLogger(AbstractPojoConfigurationTypeHandler.class);
protected BundleContext bundleContext;
@@ -206,14 +207,13 @@
return bus;
}
- protected ExportResult createServerFromFactory(ServerFactoryBean factory, Map<String, Object> endpointProps) {
+ protected Endpoint createServerFromFactory(ServerFactoryBean factory, Map<String, Object> endpointProps) {
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(ServerFactoryBean.class.getClassLoader());
Server server = factory.create();
- return new ExportResult(endpointProps, new ServerWrapper(server));
- } catch (Exception e) {
- return new ExportResult(endpointProps, e);
+ EndpointDescription epd = new EndpointDescription(endpointProps);
+ return new ServerWrapper(epd, server);
} finally {
Thread.currentThread().setContextClassLoader(oldClassLoader);
}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/ConfigTypeHandlerFactory.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/ConfigTypeHandlerFactory.java
index 8c0a881..5d92eeb 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/ConfigTypeHandlerFactory.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/ConfigTypeHandlerFactory.java
@@ -25,7 +25,7 @@
import java.util.Map;
import org.apache.cxf.dosgi.dsw.Constants;
-import org.apache.cxf.dosgi.dsw.api.ConfigurationTypeHandler;
+import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
import org.apache.cxf.dosgi.dsw.qos.IntentManager;
import org.apache.cxf.dosgi.dsw.service.ConfigTypeHandlerFinder;
import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
@@ -65,19 +65,19 @@
}
@Override
- public ConfigurationTypeHandler getHandler(BundleContext dswBC,
+ public DistributionProvider getHandler(BundleContext dswBC,
Map<String, Object> serviceProperties) {
List<String> configurationTypes = determineConfigurationTypes(serviceProperties);
return getHandler(dswBC, configurationTypes, serviceProperties);
}
@Override
- public ConfigurationTypeHandler getHandler(BundleContext dswBC, EndpointDescription endpoint) {
+ public DistributionProvider getHandler(BundleContext dswBC, EndpointDescription endpoint) {
List<String> configurationTypes = determineConfigTypesForImport(endpoint);
return getHandler(dswBC, configurationTypes, endpoint.getProperties());
}
- private ConfigurationTypeHandler getHandler(BundleContext dswBC,
+ private DistributionProvider getHandler(BundleContext dswBC,
List<String> configurationTypes,
Map<String, Object> serviceProperties) {
intentManager.assertAllIntentsSupported(serviceProperties);
@@ -89,7 +89,8 @@
} else if (configurationTypes.contains(Constants.WSDL_CONFIG_TYPE)) {
return wsdlConfigurationTypeHandler;
}
- throw new RuntimeException("None of the configuration types in " + configurationTypes + " is supported.");
+ LOG.info("None of the configuration types in " + configurationTypes + " is supported.");
+ return null;
}
private boolean isJaxrsRequested(Collection<String> types, Map<String, Object> serviceProperties) {
@@ -138,20 +139,13 @@
configurationTypes.add(rct);
}
}
- LOG.info("configuration types selected for export: " + configurationTypes);
- if (configurationTypes.isEmpty()) {
- throw new RuntimeException("the requested configuration types are not supported");
- }
+ LOG.info("Configuration types selected for export: {}.", configurationTypes);
return configurationTypes;
}
private List<String> determineConfigTypesForImport(EndpointDescription endpoint) {
List<String> remoteConfigurationTypes = endpoint.getConfigurationTypes();
- if (remoteConfigurationTypes == null) {
- throw new RuntimeException("The supplied endpoint has no configuration type");
- }
-
List<String> usableConfigurationTypes = new ArrayList<String>();
for (String ct : supportedConfigurationTypes) {
if (remoteConfigurationTypes.contains(ct)) {
@@ -159,11 +153,8 @@
}
}
- if (usableConfigurationTypes.isEmpty()) {
- throw new RuntimeException("The supplied endpoint has no compatible configuration type. "
- + "Supported types are: " + supportedConfigurationTypes
- + " Types needed by the endpoint: " + remoteConfigurationTypes);
- }
+ LOG.info("Ignoring endpoint {} as it has no compatible configuration types: {}.",
+ endpoint.getId(), remoteConfigurationTypes);
return usableConfigurationTypes;
}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/JaxRSPojoConfigurationTypeHandler.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/JaxRSPojoConfigurationTypeHandler.java
index bf15c1c..7fc5956 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/JaxRSPojoConfigurationTypeHandler.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/JaxRSPojoConfigurationTypeHandler.java
@@ -25,9 +25,10 @@
import org.apache.cxf.Bus;
import org.apache.cxf.common.util.ProxyClassLoader;
import org.apache.cxf.dosgi.dsw.Constants;
-import org.apache.cxf.dosgi.dsw.api.ExportResult;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.apache.cxf.dosgi.dsw.api.IntentUnsatisfiedException;
import org.apache.cxf.dosgi.dsw.qos.IntentManager;
+import org.apache.cxf.dosgi.dsw.util.ClassUtils;
import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
@@ -55,18 +56,18 @@
return new String[] {Constants.RS_CONFIG_TYPE};
}
- public Object createProxy(ServiceReference<?> serviceReference, BundleContext dswContext,
- BundleContext callingContext, Class<?> iClass,
- EndpointDescription endpoint) throws IntentUnsatisfiedException {
+ public Object createProxy(ServiceReference<?> sref,
+ Class<?> iClass,
+ EndpointDescription endpoint) {
+ BundleContext callingContext = sref.getBundle().getBundleContext();
String address = getPojoAddress(endpoint, iClass);
if (address == null) {
LOG.warn("Remote address is unavailable");
return null;
}
-
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
try {
- return createJaxrsProxy(address, callingContext, dswContext, iClass, null, endpoint);
+ return createJaxrsProxy(address, callingContext, iClass, null, endpoint);
} catch (Throwable e) {
Thread.currentThread().setContextClassLoader(oldClassLoader);
}
@@ -74,7 +75,7 @@
try {
ProxyClassLoader cl = new ProxyClassLoader(iClass.getClassLoader());
cl.addLoader(Client.class.getClassLoader());
- return createJaxrsProxy(address, callingContext, dswContext, iClass, cl, endpoint);
+ return createJaxrsProxy(address, callingContext, iClass, cl, endpoint);
} catch (Throwable e) {
LOG.warn("proxy creation failed", e);
}
@@ -83,7 +84,6 @@
}
protected Object createJaxrsProxy(String address,
- BundleContext dswContext,
BundleContext callingContext,
Class<?> iClass,
ClassLoader loader,
@@ -110,11 +110,12 @@
return getProxy(bean.create(), iClass);
}
- public ExportResult createServer(ServiceReference<?> sref,
- BundleContext dswContext,
- BundleContext callingContext,
- Map<String, Object> sd, Class<?> iClass,
- Object serviceBean) throws IntentUnsatisfiedException {
+ public Endpoint createServer(ServiceReference<?> sref,
+ Map<String, Object> sd,
+ String exportedInterface) throws IntentUnsatisfiedException {
+ BundleContext callingContext = sref.getBundle().getBundleContext();
+ Object serviceBean = callingContext.getService(sref);
+ Class<?> iClass = ClassUtils.getInterfaceClass(serviceBean, exportedInterface);
String contextRoot = getServletContextRoot(sd);
String address;
if (contextRoot == null) {
@@ -125,7 +126,6 @@
address = "/";
}
}
-
Bus bus = createBus(sref, callingContext, contextRoot);
LOG.info("Creating a " + iClass.getName()
@@ -141,15 +141,14 @@
return createServerFromFactory(factory, endpointProps);
}
- private ExportResult createServerFromFactory(JAXRSServerFactoryBean factory,
+ private Endpoint createServerFromFactory(JAXRSServerFactoryBean factory,
Map<String, Object> endpointProps) {
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
try {
Thread.currentThread().setContextClassLoader(JAXRSServerFactoryBean.class.getClassLoader());
Server server = factory.create();
- return new ExportResult(endpointProps, new ServerWrapper(server));
- } catch (Exception e) {
- return new ExportResult(endpointProps, e);
+ EndpointDescription epd = new EndpointDescription(endpointProps);
+ return new ServerWrapper(epd, server);
} finally {
Thread.currentThread().setContextClassLoader(oldClassLoader);
}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandler.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandler.java
index dcea099..f57fcf3 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandler.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandler.java
@@ -26,9 +26,10 @@
import org.apache.cxf.aegis.databinding.AegisDatabinding;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.dosgi.dsw.Constants;
-import org.apache.cxf.dosgi.dsw.api.ExportResult;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.apache.cxf.dosgi.dsw.api.IntentUnsatisfiedException;
import org.apache.cxf.dosgi.dsw.qos.IntentManager;
+import org.apache.cxf.dosgi.dsw.util.ClassUtils;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.jaxb.JAXBDataBinding;
@@ -54,8 +55,9 @@
return new String[] {Constants.WS_CONFIG_TYPE, Constants.WS_CONFIG_TYPE_OLD};
}
- public Object createProxy(ServiceReference<?> sref, BundleContext dswContext, BundleContext callingContext,
- Class<?> iClass, EndpointDescription endpoint) throws IntentUnsatisfiedException {
+ public Object createProxy(ServiceReference<?> sref,
+ Class<?> iClass,
+ EndpointDescription endpoint) throws IntentUnsatisfiedException {
Map<String, Object> sd = endpoint.getProperties();
String address = getClientAddress(sd);
if (address == null) {
@@ -72,8 +74,9 @@
factory.getServiceFactory().setDataBinding(getDataBinding(sd, iClass));
factory.setServiceClass(iClass);
factory.setAddress(address);
+ BundleContext callingContext = sref.getBundle().getBundleContext();
addWsInterceptorsFeaturesProps(factory.getClientFactoryBean(), callingContext, sd);
- setClientWsdlProperties(factory.getClientFactoryBean(), dswContext, sd, false);
+ setClientWsdlProperties(factory.getClientFactoryBean(), bundleContext, sd, false);
intentManager.applyIntents(factory.getFeatures(), factory.getClientFactoryBean(), sd);
@@ -87,37 +90,35 @@
return null;
}
- public ExportResult createServer(ServiceReference<?> sref,
- BundleContext dswContext,
- BundleContext callingContext,
+ public Endpoint createServer(ServiceReference<?> sref,
Map<String, Object> sd,
- Class<?> iClass,
- Object serviceBean) throws IntentUnsatisfiedException {
- try {
- String address = getPojoAddress(sd, iClass);
- ServerFactoryBean factory = createServerFactoryBean(sd, iClass);
- factory.setDataBinding(getDataBinding(sd, iClass));
- String contextRoot = getServletContextRoot(sd);
- Bus bus = createBus(sref, callingContext, contextRoot);
- factory.setBus(bus);
- factory.setServiceClass(iClass);
- factory.setAddress(address);
- factory.setServiceBean(serviceBean);
- addWsInterceptorsFeaturesProps(factory, callingContext, sd);
- setWsdlProperties(factory, callingContext, sd, false);
- String[] intents = intentManager.applyIntents(factory.getFeatures(), factory, sd);
+ String exportedInterface) throws IntentUnsatisfiedException {
+ BundleContext callingContext = sref.getBundle().getBundleContext();
+ Object serviceBean = callingContext.getService(sref);
+ Class<?> iClass = ClassUtils.getInterfaceClass(serviceBean, exportedInterface);
+ String address = getPojoAddress(sd, iClass);
+ ServerFactoryBean factory = createServerFactoryBean(sd, iClass);
+ factory.setDataBinding(getDataBinding(sd, iClass));
+ String contextRoot = getServletContextRoot(sd);
- String completeEndpointAddress = httpServiceManager.getAbsoluteAddress(contextRoot, address);
+ Bus bus = createBus(sref, callingContext, contextRoot);
+ factory.setBus(bus);
+ factory.setServiceClass(iClass);
+ factory.setAddress(address);
+
+ factory.setServiceBean(serviceBean);
+ addWsInterceptorsFeaturesProps(factory, callingContext, sd);
+ setWsdlProperties(factory, callingContext, sd, false);
+ String[] intents = intentManager.applyIntents(factory.getFeatures(), factory, sd);
+
+ String completeEndpointAddress = httpServiceManager.getAbsoluteAddress(contextRoot, address);
// The properties for the EndpointDescription
- Map<String, Object> endpointProps = createEndpointProps(sd, iClass,
+ Map<String, Object> endpointProps = createEndpointProps(sd, iClass,
new String[]{Constants.WS_CONFIG_TYPE},
completeEndpointAddress, intents);
- return createServerFromFactory(factory, endpointProps);
- } catch (RuntimeException re) {
- return new ExportResult(sd, re);
- }
+ return createServerFromFactory(factory, endpointProps);
}
private String getPojoAddress(Map<String, Object> sd, Class<?> iClass) {
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/ServerWrapper.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/ServerWrapper.java
index 1c85a4e..67bcc63 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/ServerWrapper.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/ServerWrapper.java
@@ -18,27 +18,32 @@
*/
package org.apache.cxf.dosgi.dsw.handlers;
-import java.io.Closeable;
import java.io.IOException;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.apache.cxf.endpoint.Server;
+import org.osgi.service.remoteserviceadmin.EndpointDescription;
-public class ServerWrapper implements Closeable {
+public class ServerWrapper implements Endpoint {
+ private EndpointDescription desc;
private Server server;
- public ServerWrapper(Server server) {
+ public ServerWrapper(EndpointDescription desc, Server server) {
+ this.desc = desc;
this.server = server;
}
public Server getServer() {
- return server;
+ return this.server;
}
@Override
public void close() throws IOException {
- server.stop();
- server.destroy();
+ this.server.destroy();
}
-
-
+
+ @Override
+ public EndpointDescription description() {
+ return this.desc;
+ }
}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
index 2c9e34f..3c5e80e 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/WsdlConfigurationTypeHandler.java
@@ -29,8 +29,9 @@
import org.apache.cxf.common.util.PackageUtils;
import org.apache.cxf.databinding.DataBinding;
import org.apache.cxf.dosgi.dsw.Constants;
-import org.apache.cxf.dosgi.dsw.api.ExportResult;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.apache.cxf.dosgi.dsw.qos.IntentManager;
+import org.apache.cxf.dosgi.dsw.util.ClassUtils;
import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
@@ -55,8 +56,6 @@
}
public Object createProxy(ServiceReference<?> serviceReference,
- BundleContext dswContext,
- BundleContext callingContext,
Class<?> iClass,
EndpointDescription endpoint) {
String wsdlAddressProp = getWsdlAddress(endpoint, iClass);
@@ -101,17 +100,17 @@
return Service.create(wsdlAddress, serviceQname);
}
- public ExportResult createServer(ServiceReference<?> sref,
- BundleContext dswContext,
- BundleContext callingContext,
+ public Endpoint createServer(ServiceReference<?> sref,
Map<String, Object> sd,
- Class<?> iClass,
- Object serviceBean) {
+ String exportedInterface) {
+ BundleContext callingContext = sref.getBundle().getBundleContext();
+ Object serviceBean = callingContext.getService(sref);
+ Class<?> iClass = ClassUtils.getInterfaceClass(serviceBean, exportedInterface);
String location = OsgiUtils.getProperty(sd, Constants.WSDL_LOCATION);
if (location == null) {
throw new RuntimeException("WSDL location property is unavailable");
}
- URL wsdlURL = dswContext.getBundle().getResource(location);
+ URL wsdlURL = callingContext.getBundle().getResource(location);
if (wsdlURL == null) {
throw new RuntimeException("WSDL resource at " + location + " is unavailable");
}
@@ -132,7 +131,7 @@
factory.setServiceClass(iClass);
factory.setAddress(address != null ? address : "/");
factory.getServiceFactory().setDataBinding(databinding);
- factory.setServiceBean(serviceBean);
+ factory.setServiceBean(callingContext.getService(sref));
addWsInterceptorsFeaturesProps(factory, callingContext, sd);
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ClientServiceFactory.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ClientServiceFactory.java
index c6c4ee0..df62627 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ClientServiceFactory.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ClientServiceFactory.java
@@ -23,10 +23,9 @@
import java.util.Arrays;
import java.util.List;
-import org.apache.cxf.dosgi.dsw.api.ConfigurationTypeHandler;
+import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
import org.apache.cxf.dosgi.dsw.api.IntentUnsatisfiedException;
import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.remoteserviceadmin.EndpointDescription;
@@ -38,19 +37,15 @@
private static final Logger LOG = LoggerFactory.getLogger(ClientServiceFactory.class);
- private BundleContext dswContext;
- private Class<?> iClass;
private EndpointDescription endpoint;
- private ConfigurationTypeHandler handler;
+ private DistributionProvider handler;
private ImportRegistrationImpl importRegistration;
private boolean closeable;
private int serviceCounter;
- public ClientServiceFactory(BundleContext dswContext, Class<?> iClass, EndpointDescription endpoint,
- ConfigurationTypeHandler handler, ImportRegistrationImpl ir) {
- this.dswContext = dswContext;
- this.iClass = iClass;
+ public ClientServiceFactory(EndpointDescription endpoint,
+ DistributionProvider handler, ImportRegistrationImpl ir) {
this.endpoint = endpoint;
this.handler = handler;
this.importRegistration = ir;
@@ -61,10 +56,10 @@
String interfaceName = interfaces == null || interfaces.isEmpty() ? null : interfaces.get(0);
LOG.debug("getService() from serviceFactory for {}", interfaceName);
try {
+ final Class<?> iClass = requestingBundle.loadClass(interfaceName);
Object proxy = AccessController.doPrivileged(new PrivilegedAction<Object>() {
public Object run() {
- return handler.createProxy(sreg.getReference(), dswContext,
- requestingBundle.getBundleContext(), iClass, endpoint);
+ return handler.createProxy(sreg.getReference(), iClass, endpoint);
}
});
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ConfigTypeHandlerFinder.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ConfigTypeHandlerFinder.java
index 322bc1c..11e9514 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ConfigTypeHandlerFinder.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ConfigTypeHandlerFinder.java
@@ -21,15 +21,15 @@
import java.util.List;
import java.util.Map;
-import org.apache.cxf.dosgi.dsw.api.ConfigurationTypeHandler;
+import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
import org.osgi.framework.BundleContext;
import org.osgi.service.remoteserviceadmin.EndpointDescription;
public interface ConfigTypeHandlerFinder {
- ConfigurationTypeHandler getHandler(BundleContext dswBC, Map<String, Object> serviceProperties);
+ DistributionProvider getHandler(BundleContext dswBC, Map<String, Object> serviceProperties);
- ConfigurationTypeHandler getHandler(BundleContext dswBC, EndpointDescription endpoint);
+ DistributionProvider getHandler(BundleContext dswBC, EndpointDescription endpoint);
List<String> getSupportedConfigurationTypes();
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ExportRegistrationImpl.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ExportRegistrationImpl.java
index d6e5774..d80bd40 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ExportRegistrationImpl.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/ExportRegistrationImpl.java
@@ -24,6 +24,7 @@
import java.util.Map;
import java.util.Set;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.osgi.framework.ServiceReference;
import org.osgi.service.remoteserviceadmin.EndpointDescription;
import org.osgi.service.remoteserviceadmin.ExportReference;
@@ -62,15 +63,13 @@
}
// create a new (parent) instance which was exported successfully with the given server
- public ExportRegistrationImpl(ServiceReference sref, EndpointDescription endpoint,
- RemoteServiceAdminCore rsaCore, Closeable server) {
- this(null, rsaCore, new ExportReferenceImpl(sref, endpoint), server, null);
+ public ExportRegistrationImpl(ServiceReference sref, Endpoint endpoint, RemoteServiceAdminCore rsaCore) {
+ this(null, rsaCore, new ExportReferenceImpl(sref, endpoint.description()), endpoint, null);
}
// create a new (parent) instance which failed to be exported with the given exception
- public ExportRegistrationImpl(ServiceReference sref, EndpointDescription endpoint,
- RemoteServiceAdminCore rsaCore, Throwable exception) {
- this(null, rsaCore, new ExportReferenceImpl(sref, endpoint), null, exception);
+ public ExportRegistrationImpl(RemoteServiceAdminCore rsaCore, Throwable exception) {
+ this(null, rsaCore, null, null, exception);
}
private void ensureParent() {
@@ -80,6 +79,9 @@
}
public ExportReference getExportReference() {
+ if (exportReference == null) {
+ throw new IllegalStateException(getException());
+ }
return closed ? null : exportReference;
}
diff --git a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java
index 2007ec2..d561079 100644
--- a/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java
+++ b/dsw/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCore.java
@@ -32,9 +32,8 @@
import java.util.Map;
import java.util.Set;
-import org.apache.cxf.dosgi.dsw.api.ConfigurationTypeHandler;
-import org.apache.cxf.dosgi.dsw.api.ExportResult;
-import org.apache.cxf.dosgi.dsw.util.ClassUtils;
+import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
import org.apache.cxf.dosgi.dsw.util.Utils;
import org.osgi.framework.Bundle;
@@ -158,43 +157,28 @@
private List<ExportRegistration> exportInterfaces(List<String> interfaces,
ServiceReference<?> serviceReference, Map<String, Object> serviceProperties) {
LOG.info("interfaces selected for export: " + interfaces);
- ConfigurationTypeHandler handler;
+ DistributionProvider handler;
try {
- handler = findHandler(serviceProperties);
+ handler = configTypeHandlerFinder.getHandler(bctx, serviceProperties);
} catch (RuntimeException e) {
LOG.error(e.getMessage(), e);
return Collections.emptyList();
}
List<ExportRegistration> exportRegs = new ArrayList<ExportRegistration>(1);
- Object service = bctx.getService(serviceReference);
- Bundle bundle = serviceReference.getBundle();
-
- // if service has been unregistered in the meantime
- if (service == null || bundle == null) {
- LOG.info("service has been unregistered, aborting export");
- return exportRegs;
- }
-
for (String iface : interfaces) {
- LOG.info("creating server for interface " + iface);
- // this is an extra sanity check, but do we really need it now?
- Class<?> interfaceClass = ClassUtils.getInterfaceClass(service, iface);
- if (interfaceClass != null) {
- ExportResult exportResult = handler.createServer(serviceReference, bctx, bundle.getBundleContext(),
- serviceProperties, interfaceClass, service);
- EndpointDescription endpoint = new EndpointDescription(exportResult.getEndpointProps());
- ExportRegistrationImpl exportRegistration;
- if (exportResult.getException() == null) {
- LOG.info("created server for interface " + iface);
- exportRegistration = new ExportRegistrationImpl(serviceReference, endpoint, this,
- exportResult.getServer());
- } else {
- LOG.error("failed to create server for interface " + iface, exportResult.getException());
- exportRegistration = new ExportRegistrationImpl(serviceReference, endpoint, this,
- exportResult.getException());
- }
- exportRegs.add(exportRegistration);
+ ExportRegistrationImpl exportRegistration;
+ try {
+ LOG.info("creating server for interface " + iface);
+ Endpoint endpoint = handler.createServer(serviceReference, serviceProperties, iface);
+ exportRegistration = new ExportRegistrationImpl(serviceReference, endpoint, this);
+ LOG.info("created server for interface " + iface);
+ } catch (Exception e) {
+ LOG.debug("failed to create server for interface " + iface, e);
+ serviceProperties.put(RemoteConstants.ENDPOINT_ID, "failed");
+ serviceProperties.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "none");
+ exportRegistration = new ExportRegistrationImpl(this, e);
}
+ exportRegs.add(exportRegistration);
}
return exportRegs;
}
@@ -334,65 +318,64 @@
return ir;
}
- ConfigurationTypeHandler handler = findHandler(endpoint);
+ DistributionProvider handler = configTypeHandlerFinder.getHandler(bctx, endpoint);
// TODO: somehow select the interfaces that should be imported ---> job of the TopologyManager?
List<String> matchingInterfaces = endpoint.getInterfaces();
-
- LOG.info("Matching Interfaces for import: " + matchingInterfaces);
-
- if (handler != null && matchingInterfaces.size() == 1) {
- LOG.info("Proxifying interface: " + matchingInterfaces.get(0));
-
- ImportRegistrationImpl imReg = new ImportRegistrationImpl(endpoint, this);
-
- proxifyMatchingInterface(matchingInterfaces.get(0), imReg, handler, bctx);
- if (imRegs == null) {
- imRegs = new ArrayList<ImportRegistrationImpl>();
- importedServices.put(endpoint, imRegs);
- }
- imRegs.add(imReg);
- eventProducer.publishNotification(imReg);
- return imReg;
+
+ if (handler == null) {
+ LOG.info("No matching handler can be found for remote endpoint {}.", endpoint.getId());
+ return null;
}
- return null;
+ if (matchingInterfaces.size() == 0) {
+ LOG.info("No matching interfaces found for remote endpoint {}.", endpoint.getId());
+ return null;
+ }
+ if (matchingInterfaces.size() > 1) {
+ LOG.info("More than one interface {} found for remote endpoint {}. This is not supported.",
+ endpoint.getInterfaces(),
+ endpoint.getId());
+ return null;
+ }
+
+ LOG.info("Importing service {} with interfaces {} using handler {}.",
+ endpoint.getId(), endpoint.getInterfaces(), handler.getClass());
+
+ ImportRegistrationImpl imReg = exposeServiceFactory(matchingInterfaces.get(0), endpoint, handler);
+ if (imRegs == null) {
+ imRegs = new ArrayList<ImportRegistrationImpl>();
+ importedServices.put(endpoint, imRegs);
+ }
+ imRegs.add(imReg);
+ eventProducer.publishNotification(imReg);
+ return imReg;
}
}
- protected void proxifyMatchingInterface(String interfaceName, ImportRegistrationImpl imReg,
- ConfigurationTypeHandler handler, BundleContext requestingContext) {
+ protected ImportRegistrationImpl exposeServiceFactory(String interfaceName,
+ EndpointDescription epd,
+ DistributionProvider handler) {
+ ImportRegistrationImpl imReg = new ImportRegistrationImpl(epd, this);
try {
- // MARC: relies on dynamic imports?
- Class<?> iClass = bctx.getBundle().loadClass(interfaceName);
- if (iClass == null) {
- throw new ClassNotFoundException("Cannot load interface class");
- }
-
- BundleContext actualContext = bctx;
- Class<?> actualClass = requestingContext.getBundle().loadClass(interfaceName);
- if (actualClass != iClass) {
- LOG.info("Class " + interfaceName + " loaded by DSW's bundle context is not "
- + "equal to the one loaded by the requesting bundle context, "
- + "DSW will use the requesting bundle context to register a proxy service");
- iClass = actualClass;
- actualContext = requestingContext;
- }
-
+ // FIXME This should not be done here but without it the service factory
+ // does not seem to be picked up by the consumers
+ bctx.getBundle().loadClass(interfaceName);
+
EndpointDescription endpoint = imReg.getImportedEndpointDescription();
- /* TODO: add additional local params... */
Dictionary<String, Object> serviceProps = new Hashtable<String, Object>(endpoint.getProperties());
serviceProps.put(RemoteConstants.SERVICE_IMPORTED, true);
serviceProps.remove(RemoteConstants.SERVICE_EXPORTED_INTERFACES);
- ClientServiceFactory csf = new ClientServiceFactory(actualContext, iClass, endpoint, handler, imReg);
+ ClientServiceFactory csf = new ClientServiceFactory(endpoint, handler, imReg);
imReg.setClientServiceFactory(csf);
- ServiceRegistration<?> proxyReg = actualContext.registerService(interfaceName, csf, serviceProps);
- imReg.setImportedServiceRegistration(proxyReg);
+ ServiceRegistration<?> csfReg = bctx.registerService(interfaceName, csf, serviceProps);
+ imReg.setImportedServiceRegistration(csfReg);
} catch (Exception ex) {
// Only logging at debug level as this might be written to the log at the TopologyManager
LOG.debug("Can not proxy service with interface " + interfaceName + ": " + ex.getMessage(), ex);
imReg.setException(ex);
}
+ return imReg;
}
/**
@@ -474,9 +457,12 @@
List<ExportRegistration> bundleRegs = new ArrayList<ExportRegistration>();
for (Collection<ExportRegistration> regs : exportedServices.values()) {
if (!regs.isEmpty()) {
- Bundle regBundle = regs.iterator().next().getExportReference().getExportedService().getBundle();
- if (exportingBundle.equals(regBundle)) {
- bundleRegs.addAll(regs);
+ ExportRegistration exportRegistration = regs.iterator().next();
+ if (exportRegistration.getException() == null) {
+ Bundle regBundle = exportRegistration.getExportReference().getExportedService().getBundle();
+ if (exportingBundle.equals(regBundle)) {
+ bundleRegs.addAll(regs);
+ }
}
}
}
@@ -503,17 +489,4 @@
removeImportRegistrations();
bctx.removeServiceListener(exportedServiceListener);
}
-
- private ConfigurationTypeHandler findHandler(EndpointDescription endpoint) {
- try {
- return configTypeHandlerFinder.getHandler(bctx, endpoint);
- } catch (RuntimeException e) {
- LOG.error("No handler found: " + e.getMessage(), e);
- return null;
- }
- }
-
- private ConfigurationTypeHandler findHandler(Map<String, Object> serviceProperties) {
- return configTypeHandlerFinder.getHandler(bctx, serviceProperties);
- }
}
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/DecorationParserTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/DecorationParserTest.java
index 37c018a..270c7fa 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/DecorationParserTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/DecorationParserTest.java
@@ -18,9 +18,12 @@
*/
package org.apache.cxf.dosgi.dsw.decorator;
+import java.io.IOException;
import java.net.URL;
import java.util.List;
+import javax.xml.bind.JAXBException;
+
import org.apache.cxf.xmlns.service_decoration._1_0.AddPropertyType;
import org.apache.cxf.xmlns.service_decoration._1_0.MatchPropertyType;
import org.apache.cxf.xmlns.service_decoration._1_0.MatchType;
@@ -33,7 +36,7 @@
public class DecorationParserTest {
@Test
- public void testGetDecoratorForSD() {
+ public void testGetDecoratorForSD() throws JAXBException, IOException {
URL resource = getClass().getResource("/test-resources/sd.xml");
List<ServiceDecorationType> elements = new DecorationParser().getDecorations(resource);
assertEquals(1, elements.size());
@@ -53,7 +56,7 @@
}
@Test
- public void testGetDecorationForNull() {
+ public void testGetDecorationForNull() throws JAXBException, IOException {
List<ServiceDecorationType> elements = new DecorationParser().getDecorations(null);
Assert.assertEquals(0, elements.size());
}
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/InterfaceRuleTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/InterfaceRuleTest.java
index 8b45d28..c66642b 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/InterfaceRuleTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/InterfaceRuleTest.java
@@ -29,6 +29,7 @@
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
+@SuppressWarnings("rawtypes")
public class InterfaceRuleTest extends TestCase {
public void testDUMMY() {
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/ServiceDecoratorImplTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/ServiceDecoratorImplTest.java
index 5c59a55..400d793 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/ServiceDecoratorImplTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/decorator/ServiceDecoratorImplTest.java
@@ -173,6 +173,7 @@
Bundle b = EasyMock.createMock(Bundle.class);
EasyMock.expect(b.findEntries("OSGI-INF/remote-service", "*.xml", false)).andReturn(
Collections.enumeration(Arrays.asList(resources))).anyTimes();
+ EasyMock.expect(b.getSymbolicName()).andReturn("bundlename");
EasyMock.replay(b);
return b;
}
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ClientServiceFactoryTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ClientServiceFactoryTest.java
index 7d07227..bdbb93d 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ClientServiceFactoryTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ClientServiceFactoryTest.java
@@ -23,7 +23,7 @@
import junit.framework.TestCase;
-import org.apache.cxf.dosgi.dsw.api.ConfigurationTypeHandler;
+import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
import org.apache.cxf.dosgi.dsw.service.ClientServiceFactory;
import org.apache.cxf.dosgi.dsw.service.ImportRegistrationImpl;
import org.easymock.EasyMock;
@@ -38,35 +38,39 @@
public class ClientServiceFactoryTest extends TestCase {
- @SuppressWarnings("rawtypes")
- public void testGetService() {
+ @SuppressWarnings({
+ "rawtypes", "unchecked"
+ })
+ public void testGetService() throws ClassNotFoundException {
Object myTestProxyObject = new Object();
- IMocksControl control = EasyMock.createNiceControl();
- BundleContext dswContext = control.createMock(BundleContext.class);
+ IMocksControl control = EasyMock.createControl();
Map<String, Object> map = new HashMap<String, Object>();
map.put(RemoteConstants.ENDPOINT_ID, "http://google.de");
map.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "myGreatConfiguration");
- map.put(Constants.OBJECTCLASS, new String[]{"my.class"});
+ map.put(Constants.OBJECTCLASS, new String[]{String.class.getName()});
EndpointDescription endpoint = new EndpointDescription(map);
- ConfigurationTypeHandler handler = control.createMock(ConfigurationTypeHandler.class);
+
ImportRegistrationImpl iri = new ImportRegistrationImpl(endpoint, null);
BundleContext requestingContext = control.createMock(BundleContext.class);
Bundle requestingBundle = control.createMock(Bundle.class);
+ EasyMock.expect(requestingBundle.loadClass(String.class.getName())).andReturn((Class)String.class);
EasyMock.expect(requestingBundle.getBundleContext()).andReturn(requestingContext);
- ServiceReference sr = control.createMock(ServiceReference.class);
+ ServiceReference sref = control.createMock(ServiceReference.class);
+ EasyMock.expect(sref.getBundle()).andReturn(requestingBundle);
ServiceRegistration sreg = control.createMock(ServiceRegistration.class);
- EasyMock.expect(sreg.getReference()).andReturn(sr);
+ EasyMock.expect(sreg.getReference()).andReturn(sref);
- handler.createProxy(sr, dswContext, requestingContext, String.class, endpoint);
+ DistributionProvider handler = control.createMock(DistributionProvider.class);
+ handler.createProxy(sref, String.class, endpoint);
EasyMock.expectLastCall().andReturn(myTestProxyObject);
control.replay();
- ClientServiceFactory csf = new ClientServiceFactory(dswContext, String.class, endpoint, handler, iri);
+ ClientServiceFactory csf = new ClientServiceFactory(endpoint, handler, iri);
assertSame(myTestProxyObject, csf.getService(requestingBundle, sreg));
}
}
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ConfigTypeHandlerFactoryTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ConfigTypeHandlerFactoryTest.java
index 1508277..c96874e 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ConfigTypeHandlerFactoryTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/ConfigTypeHandlerFactoryTest.java
@@ -22,13 +22,14 @@
import java.util.Map;
import org.apache.cxf.dosgi.dsw.Constants;
-import org.apache.cxf.dosgi.dsw.api.ConfigurationTypeHandler;
+import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
import org.apache.cxf.dosgi.dsw.qos.DefaultIntentMapFactory;
import org.apache.cxf.dosgi.dsw.qos.IntentManager;
import org.apache.cxf.dosgi.dsw.qos.IntentManagerImpl;
import org.apache.cxf.dosgi.dsw.qos.IntentMap;
import org.apache.cxf.dosgi.dsw.service.ConfigTypeHandlerFinder;
import org.easymock.EasyMock;
+import org.junit.Assert;
import org.junit.Test;
import org.osgi.framework.BundleContext;
import org.osgi.service.remoteserviceadmin.RemoteConstants;
@@ -39,54 +40,55 @@
@Test
public void testGetDefaultHandlerNoIntents() {
- ConfigurationTypeHandler handler = getHandlerWith(null, null);
+ DistributionProvider handler = getHandlerWith(null, null);
assertTrue(handler instanceof PojoConfigurationTypeHandler);
}
@Test
public void testGetJaxrsHandlerNoIntents() {
- ConfigurationTypeHandler handler = getHandlerWith(Constants.RS_CONFIG_TYPE, null);
+ DistributionProvider handler = getHandlerWith(Constants.RS_CONFIG_TYPE, null);
assertTrue(handler instanceof JaxRSPojoConfigurationTypeHandler);
}
@Test
public void testGetJaxrsHandlerHttpIntents() {
- ConfigurationTypeHandler handler = getHandlerWith(Constants.RS_CONFIG_TYPE, "HTTP");
+ DistributionProvider handler = getHandlerWith(Constants.RS_CONFIG_TYPE, "HTTP");
assertTrue(handler instanceof JaxRSPojoConfigurationTypeHandler);
}
@Test
public void testJaxrsPropertyIgnored() {
- ConfigurationTypeHandler handler = getHandlerWith(Constants.RS_CONFIG_TYPE, "SOAP HTTP");
+ DistributionProvider handler = getHandlerWith(Constants.RS_CONFIG_TYPE, "SOAP HTTP");
assertTrue(handler instanceof PojoConfigurationTypeHandler);
assertTrue(!(handler instanceof JaxRSPojoConfigurationTypeHandler));
}
@Test
public void testJaxrsPropertyIgnored2() {
- ConfigurationTypeHandler handler = getHandlerWith2(Constants.RS_CONFIG_TYPE, new String[] {"HTTP", "SOAP"});
+ DistributionProvider handler = getHandlerWith2(Constants.RS_CONFIG_TYPE, new String[] {"HTTP", "SOAP"});
assertTrue(handler instanceof PojoConfigurationTypeHandler);
assertTrue(!(handler instanceof JaxRSPojoConfigurationTypeHandler));
}
@Test
public void testGetPojoHandler() {
- ConfigurationTypeHandler handler = getHandlerWith(Constants.WS_CONFIG_TYPE, null);
+ DistributionProvider handler = getHandlerWith(Constants.WS_CONFIG_TYPE, null);
assertTrue(handler instanceof PojoConfigurationTypeHandler);
}
@Test
public void testGetWSDLHandler() {
- ConfigurationTypeHandler handler = getHandlerWith(Constants.WSDL_CONFIG_TYPE, null);
+ DistributionProvider handler = getHandlerWith(Constants.WSDL_CONFIG_TYPE, null);
assertTrue(handler instanceof WsdlConfigurationTypeHandler);
}
- @Test(expected = RuntimeException.class)
+ @Test
public void testUnsupportedConfiguration() {
- getHandlerWith("notSupportedConfig", null);
+ DistributionProvider handler = getHandlerWith("notSupportedConfig", null);
+ Assert.assertNull(handler);
}
- private ConfigurationTypeHandler getHandlerWith(String configType, String intents) {
+ private DistributionProvider getHandlerWith(String configType, String intents) {
BundleContext bc = EasyMock.createNiceMock(BundleContext.class);
EasyMock.replay(bc);
Map<String, Object> serviceProps = new HashMap<String, Object>();
@@ -99,7 +101,7 @@
return f.getHandler(bc, serviceProps);
}
- private ConfigurationTypeHandler getHandlerWith2(String configType, String[] intents) {
+ private DistributionProvider getHandlerWith2(String configType, String[] intents) {
BundleContext bc = EasyMock.createNiceMock(BundleContext.class);
EasyMock.replay(bc);
Map<String, Object> serviceProps = new HashMap<String, Object>();
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandlerTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandlerTest.java
index 2c97b86..69f194d 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandlerTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/handlers/PojoConfigurationTypeHandlerTest.java
@@ -18,7 +18,6 @@
*/
package org.apache.cxf.dosgi.dsw.handlers;
-import java.io.Closeable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -29,16 +28,13 @@
import junit.framework.TestCase;
import org.apache.cxf.dosgi.dsw.Constants;
-import org.apache.cxf.dosgi.dsw.api.ExportResult;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.apache.cxf.dosgi.dsw.handlers.jaxws.MyJaxWsEchoService;
-import org.apache.cxf.dosgi.dsw.handlers.jaxws.MyJaxWsEchoServiceImpl;
import org.apache.cxf.dosgi.dsw.handlers.simple.MySimpleEchoService;
-import org.apache.cxf.dosgi.dsw.handlers.simple.MySimpleEchoServiceImpl;
import org.apache.cxf.dosgi.dsw.qos.IntentManager;
import org.apache.cxf.dosgi.dsw.qos.IntentManagerImpl;
import org.apache.cxf.dosgi.dsw.qos.IntentMap;
import org.apache.cxf.endpoint.AbstractEndpointFactory;
-import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.endpoint.EndpointImpl;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.feature.Feature;
@@ -53,11 +49,15 @@
import org.easymock.IAnswer;
import org.easymock.IMocksControl;
import org.junit.Assert;
+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;
+@SuppressWarnings({
+ "unchecked", "rawtypes"
+ })
public class PojoConfigurationTypeHandlerTest extends TestCase {
public void testGetPojoAddressEndpointURI() {
@@ -110,9 +110,13 @@
public void testCreateProxy() {
IMocksControl c = EasyMock.createNiceControl();
BundleContext bc1 = c.createMock(BundleContext.class);
- BundleContext bc2 = c.createMock(BundleContext.class);
- ServiceReference sref = c.createMock(ServiceReference.class);
+
+ ServiceReference<?> sref = c.createMock(ServiceReference.class);
+ Bundle requestingBundle = c.createMock(Bundle.class);
+ BundleContext requestingContext = c.createMock(BundleContext.class);
+ EasyMock.expect(requestingBundle.getBundleContext()).andReturn(requestingContext);
+ EasyMock.expect(sref.getBundle()).andReturn(requestingBundle);
final ClientProxyFactoryBean cpfb = c.createMock(ClientProxyFactoryBean.class);
ReflectionServiceFactoryBean sf = c.createMock(ReflectionServiceFactoryBean.class);
@@ -148,13 +152,13 @@
EasyMock.expectLastCall().atLeastOnce();
c.replay();
- Object proxy = p.createProxy(sref, bc1, bc2, CharSequence.class, endpoint);
+ Object proxy = p.createProxy(sref, CharSequence.class, endpoint);
assertNotNull(proxy);
assertTrue("Proxy is not of the requested type! ", proxy instanceof CharSequence);
c.verify();
}
- public void testCreateServerWithAddressProperty() {
+ public void testCreateServerWithAddressProperty() throws Exception {
BundleContext dswContext = EasyMock.createNiceMock(BundleContext.class);
EasyMock.replay(dswContext);
@@ -176,18 +180,23 @@
return sfb;
}
};
+ ServiceReference sref = EasyMock.createNiceMock(ServiceReference.class);
+
+ BundleContext bundleContext = EasyMock.createNiceMock(BundleContext.class);
+ EasyMock.expect(bundleContext.getService(sref)).andReturn(myService);
+ EasyMock.replay(bundleContext);
+ Bundle bundle = EasyMock.createNiceMock(Bundle.class);
+ EasyMock.expect(bundle.getBundleContext()).andReturn(bundleContext);
+ EasyMock.replay(bundle);
- ServiceReference sr = EasyMock.createNiceMock(ServiceReference.class);
- BundleContext callingContext = EasyMock.createNiceMock(BundleContext.class);
- EasyMock.replay(sr);
- EasyMock.replay(callingContext);
-
+ EasyMock.expect(sref.getBundle()).andReturn(bundle);
+ EasyMock.replay(sref);
+
Map<String, Object> props = new HashMap<String, Object>();
props.put(Constants.WS_ADDRESS_PROPERTY, "http://alternate_host:80/myString");
- ExportResult exportResult = p.createServer(sr, dswContext, callingContext, props, String.class, myService);
-
- Map<String, Object> edProps = exportResult.getEndpointProps();
+ Endpoint exportResult = p.createServer(sref, props, String.class.getName());
+ Map<String, Object> edProps = exportResult.description().getProperties();
assertNotNull(edProps.get(RemoteConstants.SERVICE_IMPORTED_CONFIGS));
assertEquals(1, ((String[])edProps.get(RemoteConstants.SERVICE_IMPORTED_CONFIGS)).length);
@@ -226,23 +235,29 @@
intentManager,
dummyHttpServiceManager()) {
@Override
- protected ExportResult createServerFromFactory(ServerFactoryBean factory,
+ protected Endpoint createServerFromFactory(ServerFactoryBean factory,
Map<String, Object> endpointProps) {
- return new ExportResult(endpointProps, (Closeable) null);
+ EndpointDescription epd = new EndpointDescription(endpointProps);
+ return new ServerWrapper(epd, null);
}
};
-
- ServiceReference sref = EasyMock.createNiceMock(ServiceReference.class);
- EasyMock.replay(sref);
-
Runnable myService = EasyMock.createMock(Runnable.class);
EasyMock.replay(myService);
- ExportResult result = handler.createServer(sref, null, null, properties, Runnable.class, myService);
- if (result.getException() != null) {
- throw result.getException();
- }
+
+ ServiceReference sref = EasyMock.createNiceMock(ServiceReference.class);
+ BundleContext bundleContext = EasyMock.createNiceMock(BundleContext.class);
+ EasyMock.expect(bundleContext.getService(sref)).andReturn(myService);
+ EasyMock.replay(bundleContext);
+ Bundle bundle = EasyMock.createNiceMock(Bundle.class);
+ EasyMock.expect(bundle.getBundleContext()).andReturn(bundleContext);
+ EasyMock.replay(bundle);
- Map<String, Object> props = result.getEndpointProps();
+ EasyMock.expect(sref.getBundle()).andReturn(bundle);
+ EasyMock.replay(sref);
+
+
+ Endpoint result = handler.createServer(sref, properties, Runnable.class.getName());
+ Map<String, Object> props = result.description().getProperties();
assertEquals(expectedAddress, props.get("org.apache.cxf.ws.address"));
assertEquals("Version of java. package is always 0", "0.0.0", props.get("endpoint.package.version.java.lang"));
assertTrue(Arrays.equals(new String[] {"org.apache.cxf.ws"}, (String[]) props.get("service.imported.configs")));
@@ -261,22 +276,25 @@
intentManager,
dummyHttpServiceManager()) {
@Override
- protected ExportResult createServerFromFactory(ServerFactoryBean factory,
+ protected Endpoint createServerFromFactory(ServerFactoryBean factory,
Map<String, Object> endpointProps) {
throw new TestException();
}
};
- ServiceReference sref = EasyMock.createNiceMock(ServiceReference.class);
+ ServiceReference<?> sref = EasyMock.createNiceMock(ServiceReference.class);
EasyMock.replay(sref);
Map<String, Object> props = new HashMap<String, Object>();
Runnable myService = EasyMock.createMock(Runnable.class);
EasyMock.replay(myService);
- ExportResult result = handler.createServer(sref, null, null, props, Runnable.class, myService);
- Assert.assertTrue(result.getException() instanceof TestException);
- Assert.assertEquals(props, result.getEndpointProps());
+ try {
+ handler.createServer(sref, props, Runnable.class.getName());
+ fail("Expected TestException");
+ } catch (TestException e) {
+ // Expected
+ }
}
private ServerFactoryBean createMockServerFactoryBean() {
@@ -366,18 +384,16 @@
intentManager,
dummyHttpServiceManager());
- Object serviceBean = new MyJaxWsEchoServiceImpl();
- ServiceReference sref = c.createMock(ServiceReference.class);
+ ServiceReference<?> sref = c.createMock(ServiceReference.class);
Map<String, Object> sd = new HashMap<String, Object>();
sd.put(Constants.WS_ADDRESS_PROPERTY, "/somewhere");
c.replay();
- ExportResult exportResult = handler.createServer(sref, dswBC, null, sd, MyJaxWsEchoService.class, serviceBean);
+ ServerWrapper serverWrapper = (ServerWrapper)handler.createServer(sref, sd, MyJaxWsEchoService.class.getName());
c.verify();
- ServerWrapper serverWrapper = (ServerWrapper)exportResult.getServer();
- Endpoint ep = serverWrapper.getServer().getEndpoint();
+ org.apache.cxf.endpoint.Endpoint ep = serverWrapper.getServer().getEndpoint();
QName bindingName = ep.getEndpointInfo().getBinding().getName();
Assert.assertEquals(JaxWsEndpointImpl.class, ep.getClass());
Assert.assertEquals(new QName("http://jaxws.handlers.dsw.dosgi.cxf.apache.org/",
@@ -391,17 +407,16 @@
IntentManager intentManager = new DummyIntentManager();
PojoConfigurationTypeHandler handler
= new PojoConfigurationTypeHandler(dswBC, intentManager, dummyHttpServiceManager());
- Object serviceBean = new MySimpleEchoServiceImpl();
- ServiceReference sref = c.createMock(ServiceReference.class);
+ ServiceReference<?> sref = c.createMock(ServiceReference.class);
Map<String, Object> sd = new HashMap<String, Object>();
sd.put(Constants.WS_ADDRESS_PROPERTY, "/somewhere_else");
c.replay();
- ExportResult exportResult = handler.createServer(sref, dswBC, null, sd, MySimpleEchoService.class, serviceBean);
- ServerWrapper serverWrapper = (ServerWrapper)exportResult.getServer();
+ ServerWrapper serverWrapper = (ServerWrapper)handler.createServer(sref, sd,
+ MySimpleEchoService.class.getName());
c.verify();
- Endpoint ep = serverWrapper.getServer().getEndpoint();
+ org.apache.cxf.endpoint.Endpoint ep = serverWrapper.getServer().getEndpoint();
QName bindingName = ep.getEndpointInfo().getBinding().getName();
Assert.assertEquals(EndpointImpl.class, ep.getClass());
Assert.assertEquals(new QName("http://simple.handlers.dsw.dosgi.cxf.apache.org/",
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/EventProducerTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/EventProducerTest.java
index eba5400..98b4cbf 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/EventProducerTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/EventProducerTest.java
@@ -18,13 +18,13 @@
*/
package org.apache.cxf.dosgi.dsw.service;
-import java.io.Closeable;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.Hashtable;
import java.util.List;
import java.util.UUID;
+import org.apache.cxf.dosgi.dsw.handlers.ServerWrapper;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.junit.Assert;
@@ -40,22 +40,24 @@
import org.osgi.service.remoteserviceadmin.ExportRegistration;
import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent;
+@SuppressWarnings({"rawtypes", "unchecked"})
public class EventProducerTest {
-
+
+
@Test
public void testPublishNotification() throws Exception {
RemoteServiceAdminCore remoteServiceAdminCore = EasyMock.createNiceMock(RemoteServiceAdminCore.class);
EasyMock.replay(remoteServiceAdminCore);
- final EndpointDescription endpoint = EasyMock.createNiceMock(EndpointDescription.class);
- EasyMock.expect(endpoint.getServiceId()).andReturn(Long.MAX_VALUE).anyTimes();
+ final EndpointDescription epd = EasyMock.createNiceMock(EndpointDescription.class);
+ EasyMock.expect(epd.getServiceId()).andReturn(Long.MAX_VALUE).anyTimes();
final String uuid = UUID.randomUUID().toString();
- EasyMock.expect(endpoint.getFrameworkUUID()).andReturn(uuid).anyTimes();
- EasyMock.expect(endpoint.getId()).andReturn("foo://bar").anyTimes();
+ EasyMock.expect(epd.getFrameworkUUID()).andReturn(uuid).anyTimes();
+ EasyMock.expect(epd.getId()).andReturn("foo://bar").anyTimes();
final List<String> interfaces = Arrays.asList("org.foo.Bar", "org.boo.Far");
- EasyMock.expect(endpoint.getInterfaces()).andReturn(interfaces).anyTimes();
- EasyMock.expect(endpoint.getConfigurationTypes()).andReturn(Arrays.asList("org.apache.cxf.ws")).anyTimes();
- EasyMock.replay(endpoint);
+ EasyMock.expect(epd.getInterfaces()).andReturn(interfaces).anyTimes();
+ EasyMock.expect(epd.getConfigurationTypes()).andReturn(Arrays.asList("org.apache.cxf.ws")).anyTimes();
+ EasyMock.replay(epd);
final ServiceReference sref = EasyMock.createNiceMock(ServiceReference.class);
EasyMock.replay(sref);
@@ -80,7 +82,7 @@
Assert.assertEquals("test.bundle", event.getProperty("bundle.symbolicname"));
Assert.assertEquals(new Version(1, 2, 3, "test"), event.getProperty("bundle.version"));
Assert.assertNull(event.getProperty("cause"));
- Assert.assertEquals(endpoint, event.getProperty("export.registration"));
+ Assert.assertEquals(epd, event.getProperty("export.registration"));
Assert.assertEquals(Long.MAX_VALUE, event.getProperty("service.remote.id"));
Assert.assertEquals(uuid, event.getProperty("service.remote.uuid"));
@@ -95,7 +97,7 @@
Assert.assertEquals(RemoteServiceAdminEvent.EXPORT_REGISTRATION, rsae.getType());
Assert.assertSame(bundle, rsae.getSource());
ExportReference er = rsae.getExportReference();
- Assert.assertSame(endpoint, er.getExportedEndpoint());
+ Assert.assertSame(epd, er.getExportedEndpoint());
Assert.assertSame(sref, er.getExportedService());
return null;
@@ -113,9 +115,8 @@
EasyMock.expect(bc.getService(eaSref)).andReturn(ea).anyTimes();
EasyMock.replay(bc);
EventProducer eventProducer = new EventProducer(bc);
-
- ExportRegistrationImpl ereg = new ExportRegistrationImpl(sref, endpoint, remoteServiceAdminCore,
- (Closeable)null);
+ ServerWrapper endpoint = new ServerWrapper(epd, null);
+ ExportRegistrationImpl ereg = new ExportRegistrationImpl(sref, endpoint, remoteServiceAdminCore);
eventProducer.publishNotification(ereg);
}
@@ -179,7 +180,7 @@
EasyMock.replay(bc);
EventProducer eventProducer = new EventProducer(bc);
- ExportRegistrationImpl ereg = new ExportRegistrationImpl(sref, endpoint, rsaCore, exportException);
+ ExportRegistrationImpl ereg = new ExportRegistrationImpl(rsaCore, exportException);
eventProducer.publishNotification(Arrays.<ExportRegistration>asList(ereg));
}
}
diff --git a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java
index f714eca..2900ce6 100644
--- a/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java
+++ b/dsw/cxf-dsw/src/test/java/org/apache/cxf/dosgi/dsw/service/RemoteServiceAdminCoreTest.java
@@ -18,7 +18,6 @@
*/
package org.apache.cxf.dosgi.dsw.service;
-import java.io.Closeable;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
@@ -28,10 +27,11 @@
import java.util.List;
import java.util.Map;
-import org.apache.cxf.dosgi.dsw.api.ConfigurationTypeHandler;
-import org.apache.cxf.dosgi.dsw.api.ExportResult;
+import org.apache.cxf.dosgi.dsw.api.DistributionProvider;
+import org.apache.cxf.dosgi.dsw.api.Endpoint;
import org.apache.cxf.dosgi.dsw.handlers.ConfigTypeHandlerFactory;
import org.apache.cxf.dosgi.dsw.handlers.HttpServiceManager;
+import org.apache.cxf.dosgi.dsw.handlers.ServerWrapper;
import org.apache.cxf.dosgi.dsw.qos.DefaultIntentMapFactory;
import org.apache.cxf.dosgi.dsw.qos.IntentManager;
import org.apache.cxf.dosgi.dsw.qos.IntentManagerImpl;
@@ -58,6 +58,9 @@
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
+@SuppressWarnings({
+ "rawtypes", "unchecked"
+ })
public class RemoteServiceAdminCoreTest {
@Test
@@ -129,9 +132,10 @@
RemoteServiceAdminCore rsaCore = new RemoteServiceAdminCore(bc, configTypeHandlerFactory) {
@Override
- protected void proxifyMatchingInterface(String interfaceName, ImportRegistrationImpl imReg,
- ConfigurationTypeHandler handler,
- BundleContext requestingContext) {
+ protected ImportRegistrationImpl exposeServiceFactory(String interfaceName,
+ EndpointDescription epd,
+ DistributionProvider handler) {
+ return new ImportRegistrationImpl(epd, this);
}
};
@@ -205,13 +209,10 @@
Map<String, Object> eProps = new HashMap<String, Object>(sProps);
eProps.put("endpoint.id", "http://something");
eProps.put("service.imported.configs", new String[] {"org.apache.cxf.ws"});
- ExportResult er = new ExportResult(eProps, (Closeable) null);
+ Endpoint er = new ServerWrapper(new EndpointDescription(eProps), null);
- ConfigurationTypeHandler handler = EasyMock.createNiceMock(ConfigurationTypeHandler.class);
- EasyMock.expect(handler.createServer(sref,
- bc,
- sref.getBundle().getBundleContext(),
- sProps, Runnable.class, svcObject)).andReturn(er).once();
+ DistributionProvider handler = EasyMock.createNiceMock(DistributionProvider.class);
+ EasyMock.expect(handler.createServer(sref, sProps, Runnable.class.getName())).andReturn(er).once();
EasyMock.replay(handler);
ConfigTypeHandlerFinder handlerFactory = EasyMock.createNiceMock(ConfigTypeHandlerFactory.class);
@@ -254,7 +255,6 @@
// Look at the exportedServices data structure
Field field = RemoteServiceAdminCore.class.getDeclaredField("exportedServices");
field.setAccessible(true);
- @SuppressWarnings("unchecked")
Map<Map<String, Object>, Collection<ExportRegistration>> exportedServices =
(Map<Map<String, Object>, Collection<ExportRegistration>>) field.get(rsaCore);
@@ -304,27 +304,23 @@
Map<String, Object> eProps = new HashMap<String, Object>(sProps);
eProps.put("endpoint.id", "http://something");
eProps.put("service.imported.configs", new String[] {"org.apache.cxf.ws"});
- ExportResult er = new ExportResult(eProps, new TestException());
- ConfigurationTypeHandler handler = EasyMock.createNiceMock(ConfigurationTypeHandler.class);
- EasyMock.expect(handler.createServer(sref, bc, sref.getBundle().getBundleContext(),
- sProps, Runnable.class, svcObject)).andReturn(er);
+ DistributionProvider handler = EasyMock.createMock(DistributionProvider.class);
+ EasyMock.expect(handler.createServer(sref, sProps, Runnable.class.getName())).andThrow(new TestException());
EasyMock.replay(handler);
- ConfigTypeHandlerFinder handlerFactory = EasyMock.createNiceMock(ConfigTypeHandlerFactory.class);
+ ConfigTypeHandlerFinder handlerFactory = EasyMock.createMock(ConfigTypeHandlerFactory.class);
EasyMock.expect(handlerFactory.getHandler(bc, sProps)).andReturn(handler).anyTimes();
EasyMock.replay(handlerFactory);
RemoteServiceAdminCore rsaCore = new RemoteServiceAdminCore(bc, handlerFactory);
- List<ExportRegistration> ereg = rsaCore.exportService(sref, null);
+ List<ExportRegistration> ereg = rsaCore.exportService(sref, sProps);
assertEquals(1, ereg.size());
assertTrue(ereg.get(0).getException() instanceof TestException);
- assertSame(sref, ereg.get(0).getExportReference().getExportedService());
// Look at the exportedServices data structure
Field field = RemoteServiceAdminCore.class.getDeclaredField("exportedServices");
field.setAccessible(true);
- @SuppressWarnings("unchecked")
Map<Map<String, Object>, Collection<ExportRegistration>> exportedServices =
(Map<Map<String, Object>, Collection<ExportRegistration>>) field.get(rsaCore);
@@ -332,9 +328,6 @@
assertEquals("There is 1 export registration",
1, exportedServices.values().iterator().next().size());
- // Remove all export registrations from the service bundle
- rsaCore.removeExportRegistrations(sref.getBundle());
- assertEquals("No more exported services", 0, exportedServices.size());
}
private ServiceReference mockServiceReference(final Map<String, Object> sProps) {
@@ -361,6 +354,6 @@
}
@SuppressWarnings("serial")
- private static class TestException extends Exception {
+ private static class TestException extends RuntimeException {
}
}
diff --git a/parent/pom.xml b/parent/pom.xml
index d529f9d..2ce6c48 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -189,10 +189,10 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
- <version>2.5.1</version>
+ <version>3.5.1</version>
<configuration>
- <source>1.6</source>
- <target>1.6</target>
+ <source>1.7</source>
+ <target>1.7</target>
<maxmem>256M</maxmem>
<fork>false</fork>
</configuration>
diff --git a/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/MultiBundleTools.java b/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/MultiBundleTools.java
index 48e87ac..1e4bf39 100644
--- a/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/MultiBundleTools.java
+++ b/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/MultiBundleTools.java
@@ -28,9 +28,6 @@
import java.util.Map;
import java.util.Properties;
import java.util.TreeMap;
-import java.util.jar.Attributes;
-import java.util.jar.JarInputStream;
-import java.util.jar.Manifest;
import org.ops4j.pax.exam.CoreOptions;
import org.ops4j.pax.exam.Option;
@@ -94,18 +91,8 @@
for (Map.Entry<Integer, String> entry : bundles.entrySet()) {
String bundleUri = entry.getValue();
- URL bundleURL = new URL(bundleUri);
- JarInputStream bundleJar = new JarInputStream(bundleURL.openStream());
- Manifest manifest = bundleJar.getManifest();
- Attributes host = manifest.getAttributes("Fragment-Host");
- if (host != null) {
- System.out.println(bundleUri);
- }
- bundleJar.close();
-
opts.add(CoreOptions.bundle(bundleUri));
}
- System.out.println(opts);
return opts.toArray(new Option[opts.size()]);
}
diff --git a/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestImportService.java b/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestImportService.java
index 0f8b0b8..efc334b 100644
--- a/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestImportService.java
+++ b/systests2/multi-bundle/src/test/java/org/apache/cxf/dosgi/systests2/multi/TestImportService.java
@@ -73,7 +73,7 @@
provision(createServiceConsumerBundle()),
// increase for debugging
systemProperty("org.apache.cxf.dosgi.test.serviceWaitTimeout").value(
- System.getProperty("org.apache.cxf.dosgi.test.serviceWaitTimeout", "20")),
+ System.getProperty("org.apache.cxf.dosgi.test.serviceWaitTimeout", "200")),
frameworkStartLevel(100),
//CoreOptions.vmOption("-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005")
};
@@ -110,17 +110,9 @@
// a service property.
// Set up a Server in the test
- ServerFactoryBean factory = new ServerFactoryBean();
- factory.setServiceClass(GreeterService.class);
- factory.setAddress("http://localhost:9191/grrr");
- factory.getServiceFactory().setDataBinding(new AegisDatabinding());
- factory.setServiceBean(new TestGreeter());
-
Server server = null;
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
try {
- Thread.currentThread().setContextClassLoader(ServerFactoryBean.class.getClassLoader());
- server = factory.create();
+ server = publishTestGreeter();
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put("testName", "test1");
@@ -134,6 +126,21 @@
if (server != null) {
server.stop();
}
+
+ }
+ }
+
+ private Server publishTestGreeter() {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(ServerFactoryBean.class.getClassLoader());
+ ServerFactoryBean factory = new ServerFactoryBean();
+ factory.setServiceClass(GreeterService.class);
+ factory.setAddress("http://localhost:9191/grrr");
+ factory.getServiceFactory().setDataBinding(new AegisDatabinding());
+ factory.setServiceBean(new TestGreeter());
+ return factory.create();
+ } finally {
Thread.currentThread().setContextClassLoader(cl);
}
}