You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by cs...@apache.org on 2016/07/01 19:56:59 UTC
[2/3] cxf-dosgi git commit: [DOSGI-242] Extract common module, use DS
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/common/src/test/java/org/apache/cxf/dosgi/common/qos/IntentMapTest.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/cxf/dosgi/common/qos/IntentMapTest.java b/common/src/test/java/org/apache/cxf/dosgi/common/qos/IntentMapTest.java
new file mode 100644
index 0000000..1bda059
--- /dev/null
+++ b/common/src/test/java/org/apache/cxf/dosgi/common/qos/IntentMapTest.java
@@ -0,0 +1,42 @@
+/**
+ * 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.common.qos;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cxf.dosgi.common.intent.IntentMap;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class IntentMapTest {
+
+ @Test
+ public void inheritanceTest() {
+ Map<String, Object> defaultMap = new HashMap<String, Object>();
+ defaultMap.put("key1", "defaultValue");
+ IntentMap intentMap = new IntentMap(defaultMap);
+ Assert.assertEquals("defaultValue", intentMap.get("key1"));
+ intentMap.put("key1", "overridden");
+ Assert.assertEquals("overridden", intentMap.get("key1"));
+ Object curValue = intentMap.remove("key1");
+ Assert.assertEquals("overridden", curValue);
+ Assert.assertEquals("defaultValue", intentMap.get("key1"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/common/src/test/java/org/apache/cxf/dosgi/common/qos/IntentTrackerTest.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/cxf/dosgi/common/qos/IntentTrackerTest.java b/common/src/test/java/org/apache/cxf/dosgi/common/qos/IntentTrackerTest.java
new file mode 100644
index 0000000..b1efd62
--- /dev/null
+++ b/common/src/test/java/org/apache/cxf/dosgi/common/qos/IntentTrackerTest.java
@@ -0,0 +1,82 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.dosgi.common.qos;
+
+import static org.easymock.EasyMock.expect;
+
+import org.apache.cxf.dosgi.common.intent.IntentManager;
+import org.apache.cxf.dosgi.common.intent.IntentMap;
+import org.apache.cxf.dosgi.common.intent.IntentTracker;
+import org.apache.cxf.feature.AbstractFeature;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+import org.easymock.IMocksControl;
+import org.junit.Assert;
+import org.junit.Test;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+public class IntentTrackerTest {
+
+ private static final String MY_INTENT_NAME = "myIntent";
+
+ @Test
+ public void testIntentAsService() throws InvalidSyntaxException {
+ IMocksControl c = EasyMock.createControl();
+ BundleContext bc = c.createMock(BundleContext.class);
+ Filter filter = c.createMock(Filter.class);
+ expect(bc.createFilter(EasyMock.<String>anyObject())).andReturn(filter);
+ final Capture<ServiceListener> capturedListener = EasyMock.newCapture();
+ bc.addServiceListener(EasyMock.capture(capturedListener), EasyMock.<String>anyObject());
+ EasyMock.expectLastCall().atLeastOnce();
+ expect(bc.getServiceReferences(EasyMock.<String>anyObject(),
+ EasyMock.<String>anyObject())).andReturn(new ServiceReference[]{});
+ IntentMap intentMap = new IntentMap();
+
+ // Create a custom intent
+ @SuppressWarnings("unchecked")
+ ServiceReference<AbstractFeature> reference = c.createMock(ServiceReference.class);
+ expect(reference.getProperty(IntentManager.INTENT_NAME_PROP)).andReturn(MY_INTENT_NAME);
+ AbstractFeature testIntent = new AbstractFeature() {
+ };
+ expect(bc.getService(reference)).andReturn(testIntent).atLeastOnce();
+
+ c.replay();
+
+ IntentTracker tracker = new IntentTracker(bc, intentMap);
+ tracker.open();
+
+ Assert.assertFalse("IntentMap should not contain " + MY_INTENT_NAME, intentMap.containsKey(MY_INTENT_NAME));
+ ServiceListener listener = capturedListener.getValue();
+
+ // Simulate adding custom intent service
+ ServiceEvent event = new ServiceEvent(ServiceEvent.REGISTERED, reference);
+ listener.serviceChanged(event);
+
+ // our custom intent should now be available
+ Assert.assertTrue("IntentMap should contain " + MY_INTENT_NAME, intentMap.containsKey(MY_INTENT_NAME));
+ Assert.assertEquals(testIntent, intentMap.get(MY_INTENT_NAME));
+
+ c.verify();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/common/src/test/java/org/apache/cxf/dosgi/common/util/ClassUtilsTest.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/cxf/dosgi/common/util/ClassUtilsTest.java b/common/src/test/java/org/apache/cxf/dosgi/common/util/ClassUtilsTest.java
new file mode 100644
index 0000000..233a18a
--- /dev/null
+++ b/common/src/test/java/org/apache/cxf/dosgi/common/util/ClassUtilsTest.java
@@ -0,0 +1,114 @@
+/**
+ * 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.common.util;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.easymock.EasyMock;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+import junit.framework.TestCase;
+
+public class ClassUtilsTest extends TestCase {
+
+ public void testLoadProvidersAsString() throws Exception {
+ BundleContext bc = mockBundleContext();
+ Map<String, Object> sd = Collections.<String, Object>singletonMap("providers", Provider.class.getName());
+ List<Object> providers = ClassUtils.loadProviderClasses(bc, sd, "providers");
+ assertEquals(1, providers.size());
+ assertTrue(providers.get(0) instanceof Provider);
+ }
+
+ public void testLoadProvidersAsStringArray() throws Exception {
+ BundleContext bc = mockBundleContext();
+ Map<String, Object> sd = Collections.<String, Object>singletonMap("providers",
+ new String[]{Provider.class.getName()});
+ List<Object> providers = ClassUtils.loadProviderClasses(bc, sd, "providers");
+ assertEquals(1, providers.size());
+ assertTrue(providers.get(0) instanceof Provider);
+ }
+
+ public void testLoadProvidersAsObject() throws Exception {
+ Map<String, Object> sd = Collections.<String, Object>singletonMap("providers", new Provider());
+ List<Object> providers = ClassUtils.loadProviderClasses(null, sd, "providers");
+ assertEquals(1, providers.size());
+ assertTrue(providers.get(0) instanceof Provider);
+ }
+
+ public void testLoadProvidersAsObjectArray() throws Exception {
+ Map<String, Object> sd = Collections.<String, Object>singletonMap("providers", new Object[]{new Provider()});
+ List<Object> providers = ClassUtils.loadProviderClasses(null, sd, "providers");
+ assertEquals(1, providers.size());
+ assertTrue(providers.get(0) instanceof Provider);
+ }
+
+ public void testLoadProvidersAsObjectList() throws Exception {
+ List<Object> list = new LinkedList<Object>();
+ list.add(new Provider());
+ Map<String, Object> sd = Collections.<String, Object>singletonMap("providers", list);
+ List<Object> providers = ClassUtils.loadProviderClasses(null, sd, "providers");
+ assertEquals(1, providers.size());
+ assertTrue(providers.get(0) instanceof Provider);
+ }
+
+ public void testLoadProvidersAsStringList() throws Exception {
+ List<Object> list = new LinkedList<Object>();
+ list.add(Provider.class.getName());
+ Map<String, Object> sd = Collections.<String, Object>singletonMap("providers", list);
+ List<Object> providers = ClassUtils.loadProviderClasses(mockBundleContext(), sd, "providers");
+ assertEquals(1, providers.size());
+ assertTrue(providers.get(0) instanceof Provider);
+ }
+
+ private BundleContext mockBundleContext() throws Exception {
+ BundleContext bc = EasyMock.createMock(BundleContext.class);
+ Bundle bundle = EasyMock.createMock(Bundle.class);
+ bc.getBundle();
+ EasyMock.expectLastCall().andReturn(bundle);
+ bundle.loadClass(Provider.class.getName());
+ EasyMock.expectLastCall().andReturn(Provider.class);
+ EasyMock.replay(bc, bundle);
+ return bc;
+ }
+
+ @SuppressWarnings({ "serial", "rawtypes" })
+ private static class MyMapSubclass extends HashMap {
+ }
+
+ @SuppressWarnings("serial")
+ static class MySubclassOne extends MyMapSubclass {
+ }
+
+ @SuppressWarnings("serial")
+ static class MySubclassTwo extends MySubclassOne {
+ }
+
+ @SuppressWarnings("serial")
+ static class MySubclassThree extends MySubclassTwo {
+ }
+
+ @SuppressWarnings("serial")
+ static class MySubclassFour extends MySubclassThree {
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/common/src/test/java/org/apache/cxf/dosgi/common/util/OsgiUtilsTest.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/cxf/dosgi/common/util/OsgiUtilsTest.java b/common/src/test/java/org/apache/cxf/dosgi/common/util/OsgiUtilsTest.java
new file mode 100644
index 0000000..9aabeef
--- /dev/null
+++ b/common/src/test/java/org/apache/cxf/dosgi/common/util/OsgiUtilsTest.java
@@ -0,0 +1,70 @@
+/**
+ * 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.common.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.service.remoteserviceadmin.EndpointDescription;
+import org.osgi.service.remoteserviceadmin.RemoteConstants;
+
+import junit.framework.TestCase;
+
+public class OsgiUtilsTest extends TestCase {
+
+ public void testMultiValuePropertyAsString() {
+ assertEquals(Collections.singleton("hi"),
+ OsgiUtils.getMultiValueProperty("hi"));
+ }
+
+ public void testMultiValuePropertyAsArray() {
+ assertEquals(Arrays.asList("a", "b"),
+ OsgiUtils.getMultiValueProperty(new String[] {"a", "b"}));
+ }
+
+ public void testMultiValuePropertyAsCollection() {
+ List<String> list = new ArrayList<String>();
+ list.add("1");
+ list.add("2");
+ list.add("3");
+ assertEquals(list, OsgiUtils.getMultiValueProperty(list));
+ }
+
+ public void testMultiValuePropertyNull() {
+ assertNull(OsgiUtils.getMultiValueProperty(null));
+ }
+
+ public void testGetProperty() {
+ Map<String, Object> p = new HashMap<String, Object>();
+ p.put(RemoteConstants.ENDPOINT_ID, "http://google.de");
+ p.put("notAString", new Object());
+ p.put(org.osgi.framework.Constants.OBJECTCLASS, new String[]{"my.class"});
+ p.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, new String[]{"my.config"});
+
+ EndpointDescription endpoint = new EndpointDescription(p);
+
+ assertNull(OsgiUtils.getProperty(endpoint, "unknownProp"));
+ assertEquals(p.get(RemoteConstants.ENDPOINT_ID), OsgiUtils.getProperty(endpoint, RemoteConstants.ENDPOINT_ID));
+ assertEquals(null, OsgiUtils.getProperty(endpoint, "notAString"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/common/src/test/java/org/apache/cxf/dosgi/common/util/Provider.java
----------------------------------------------------------------------
diff --git a/common/src/test/java/org/apache/cxf/dosgi/common/util/Provider.java b/common/src/test/java/org/apache/cxf/dosgi/common/util/Provider.java
new file mode 100644
index 0000000..baec66d
--- /dev/null
+++ b/common/src/test/java/org/apache/cxf/dosgi/common/util/Provider.java
@@ -0,0 +1,23 @@
+/**
+ * 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.common.util;
+
+
+public class Provider {
+}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/bnd.bnd
----------------------------------------------------------------------
diff --git a/cxf-dsw/bnd.bnd b/cxf-dsw/bnd.bnd
index b0ee3dc..017457a 100644
--- a/cxf-dsw/bnd.bnd
+++ b/cxf-dsw/bnd.bnd
@@ -1,3 +1,2 @@
Import-Package: javax.servlet;version='[2,4)', javax.servlet.http;version='[2,4)', *
-Private-Package: org.apache.cxf.dosgi.dsw.*
-Bundle-Activator: org.apache.cxf.dosgi.dsw.osgi.Activator
+
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/pom.xml
----------------------------------------------------------------------
diff --git a/cxf-dsw/pom.xml b/cxf-dsw/pom.xml
index 091dce9..d3f54aa 100644
--- a/cxf-dsw/pom.xml
+++ b/cxf-dsw/pom.xml
@@ -37,6 +37,12 @@
<dependencies>
<dependency>
+ <groupId>org.apache.cxf.dosgi</groupId>
+ <artifactId>cxf-dosgi-ri-common</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+
+ <dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>${cxf.version}</version>
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java
index 638e6ca..49ee272 100644
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java
+++ b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/CXFDistributionProvider.java
@@ -18,10 +18,14 @@
*/
package org.apache.cxf.dosgi.dsw.handlers;
+import static org.osgi.service.remoteserviceadmin.RemoteConstants.REMOTE_CONFIGS_SUPPORTED;
+import static org.osgi.service.remoteserviceadmin.RemoteConstants.REMOTE_INTENTS_SUPPORTED;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.Dictionary;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -30,47 +34,84 @@ import java.util.Set;
import org.apache.aries.rsa.spi.DistributionProvider;
import org.apache.aries.rsa.spi.Endpoint;
import org.apache.aries.rsa.spi.IntentUnsatisfiedException;
+import org.apache.cxf.dosgi.common.httpservice.HttpServiceManager;
+import org.apache.cxf.dosgi.common.intent.IntentManager;
+import org.apache.cxf.dosgi.common.util.OsgiUtils;
+import org.apache.cxf.dosgi.common.util.StringPlus;
import org.apache.cxf.dosgi.dsw.handlers.pojo.PojoConfigurationTypeHandler;
import org.apache.cxf.dosgi.dsw.handlers.pojo.WsdlConfigurationTypeHandler;
import org.apache.cxf.dosgi.dsw.handlers.rest.JaxRSPojoConfigurationTypeHandler;
-import org.apache.cxf.dosgi.dsw.httpservice.HttpServiceManager;
import org.apache.cxf.dosgi.dsw.osgi.Constants;
-import org.apache.cxf.dosgi.dsw.qos.IntentManager;
-import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
-import org.apache.cxf.dosgi.dsw.util.StringPlus;
import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
import org.osgi.service.remoteserviceadmin.EndpointDescription;
import org.osgi.service.remoteserviceadmin.RemoteConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
+@Component(configurationPid = "cxf-dsw", property = //
+{//
+ REMOTE_CONFIGS_SUPPORTED + "=" + Constants.WS_CONFIG_TYPE,
+ REMOTE_CONFIGS_SUPPORTED + "=" + Constants.WSDL_CONFIG_TYPE,
+ REMOTE_CONFIGS_SUPPORTED + "=" + Constants.RS_CONFIG_TYPE,
+ REMOTE_CONFIGS_SUPPORTED + "=" + Constants.WS_CONFIG_TYPE_OLD,
+ REMOTE_INTENTS_SUPPORTED + "="
+})
public class CXFDistributionProvider implements DistributionProvider {
+ public static final String[] SUPPORTED_CONFIGS = new String[] //
+ {//
+ Constants.WS_CONFIG_TYPE, Constants.WSDL_CONFIG_TYPE, Constants.RS_CONFIG_TYPE,
+ Constants.WS_CONFIG_TYPE_OLD
+ };
protected static final String DEFAULT_CONFIGURATION_TYPE = Constants.WS_CONFIG_TYPE;
private static final Logger LOG = LoggerFactory.getLogger(CXFDistributionProvider.class);
- // protected because of tests
- protected final String[] supportedConfigurationTypes;
private IntentManager intentManager;
private PojoConfigurationTypeHandler pojoConfigurationTypeHandler;
private JaxRSPojoConfigurationTypeHandler jaxRsPojoConfigurationTypeHandler;
private WsdlConfigurationTypeHandler wsdlConfigurationTypeHandler;
private Set<String> configTypesSet;
+ private HttpServiceManager httpServiceManager;
+
+ public CXFDistributionProvider() {
+ configTypesSet = new HashSet<>(Arrays.asList(SUPPORTED_CONFIGS));
+ }
- public CXFDistributionProvider(BundleContext bc, IntentManager intentManager,
- HttpServiceManager httpServiceManager) {
+ @Reference
+ public void setHttpServiceManager(HttpServiceManager httpServiceManager) {
+ this.httpServiceManager = httpServiceManager;
+ }
+
+ @Reference
+ public void setIntentManager(IntentManager intentManager) {
this.intentManager = intentManager;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Activate
+ public synchronized void activate(ComponentContext compContext) {
+ Dictionary<String, Object> config = compContext.getProperties();
+ init(compContext.getBundleContext(), config);
+ // String[] supportedIntents = intentMap.keySet().toArray(new String[] {});
+ // props.put(Constants.REMOTE_INTENTS_SUPPORTED, supportedIntents);
+ }
+
+ void init(BundleContext bc, Dictionary<String, Object> config) {
+ // Disable the fast infoset as it's not compatible (yet) with OSGi
+ System.setProperty("org.apache.cxf.nofastinfoset", "true");
+ LOG.debug("RemoteServiceAdmin Implementation is starting up with {}", config);
+ System.setProperty("org.apache.cxf.nofastinfoset", "true");
this.pojoConfigurationTypeHandler = new PojoConfigurationTypeHandler(bc, intentManager, httpServiceManager);
this.jaxRsPojoConfigurationTypeHandler = new JaxRSPojoConfigurationTypeHandler(bc,
intentManager,
httpServiceManager);
this.wsdlConfigurationTypeHandler = new WsdlConfigurationTypeHandler(bc, intentManager, httpServiceManager);
- supportedConfigurationTypes = new String[] {Constants.WS_CONFIG_TYPE,
- Constants.WSDL_CONFIG_TYPE,
- Constants.RS_CONFIG_TYPE,
- Constants.WS_CONFIG_TYPE_OLD};
- configTypesSet = new HashSet<>(Arrays.asList(supportedConfigurationTypes));
}
@SuppressWarnings("rawtypes")
@@ -164,7 +205,7 @@ public class CXFDistributionProvider implements DistributionProvider {
List<String> remoteConfigurationTypes = endpoint.getConfigurationTypes();
List<String> usableConfigurationTypes = new ArrayList<String>();
- for (String ct : supportedConfigurationTypes) {
+ for (String ct : SUPPORTED_CONFIGS) {
if (remoteConfigurationTypes.contains(ct)) {
usableConfigurationTypes.add(ct);
}
@@ -176,7 +217,7 @@ public class CXFDistributionProvider implements DistributionProvider {
}
public String[] getSupportedTypes() {
- return supportedConfigurationTypes;
+ return SUPPORTED_CONFIGS;
}
}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/AbstractPojoConfigurationTypeHandler.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/AbstractPojoConfigurationTypeHandler.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/AbstractPojoConfigurationTypeHandler.java
index aa543e0..50baf0a 100644
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/AbstractPojoConfigurationTypeHandler.java
+++ b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/AbstractPojoConfigurationTypeHandler.java
@@ -20,6 +20,8 @@ package org.apache.cxf.dosgi.dsw.handlers.pojo;
import java.lang.reflect.Proxy;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -30,14 +32,13 @@ import org.apache.aries.rsa.spi.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.common.util.PackageUtils;
-import org.apache.cxf.dosgi.dsw.httpservice.HttpServiceManager;
+import org.apache.cxf.dosgi.common.httpservice.HttpServiceManager;
+import org.apache.cxf.dosgi.common.intent.IntentManager;
+import org.apache.cxf.dosgi.common.util.ClassUtils;
+import org.apache.cxf.dosgi.common.util.OsgiUtils;
+import org.apache.cxf.dosgi.common.util.ServerWrapper;
+import org.apache.cxf.dosgi.common.util.StringPlus;
import org.apache.cxf.dosgi.dsw.osgi.Constants;
-import org.apache.cxf.dosgi.dsw.qos.IntentManager;
-import org.apache.cxf.dosgi.dsw.qos.IntentUtils;
-import org.apache.cxf.dosgi.dsw.util.ClassUtils;
-import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
-import org.apache.cxf.dosgi.dsw.util.ServerWrapper;
-import org.apache.cxf.dosgi.dsw.util.StringPlus;
import org.apache.cxf.endpoint.AbstractEndpointFactory;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.feature.AbstractFeature;
@@ -84,11 +85,30 @@ public abstract class AbstractPojoConfigurationTypeHandler implements Distributi
}
}
String[] sIntents = StringPlus.normalize(props.get(RemoteConstants.SERVICE_INTENTS));
- String[] allIntents = IntentUtils.mergeArrays(intents, sIntents);
+ String[] allIntents = mergeArrays(intents, sIntents);
props.put(RemoteConstants.SERVICE_INTENTS, allIntents);
props.put(RemoteConstants.ENDPOINT_ID, address);
return new EndpointDescription(props);
}
+
+ public static String[] mergeArrays(String[] a1, String[] a2) {
+ if (a1 == null) {
+ return a2;
+ }
+ if (a2 == null) {
+ return a1;
+ }
+
+ List<String> list = new ArrayList<String>(a1.length + a2.length);
+ Collections.addAll(list, a1);
+ for (String s : a2) {
+ if (!list.contains(s)) {
+ list.add(s);
+ }
+ }
+
+ return list.toArray(new String[list.size()]);
+ }
protected void setCommonWsdlProperties(AbstractWSDLBasedEndpointFactory factory, BundleContext context,
Map<String, Object> sd, boolean wsdlType) {
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/PojoConfigurationTypeHandler.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/PojoConfigurationTypeHandler.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/PojoConfigurationTypeHandler.java
index a0784fb..aa49f99 100644
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/PojoConfigurationTypeHandler.java
+++ b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/PojoConfigurationTypeHandler.java
@@ -27,9 +27,9 @@ import org.apache.aries.rsa.spi.IntentUnsatisfiedException;
import org.apache.cxf.Bus;
import org.apache.cxf.aegis.databinding.AegisDatabinding;
import org.apache.cxf.databinding.DataBinding;
-import org.apache.cxf.dosgi.dsw.httpservice.HttpServiceManager;
+import org.apache.cxf.dosgi.common.httpservice.HttpServiceManager;
+import org.apache.cxf.dosgi.common.intent.IntentManager;
import org.apache.cxf.dosgi.dsw.osgi.Constants;
-import org.apache.cxf.dosgi.dsw.qos.IntentManager;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
import org.apache.cxf.frontend.ServerFactoryBean;
import org.apache.cxf.jaxb.JAXBDataBinding;
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/WsdlConfigurationTypeHandler.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/WsdlConfigurationTypeHandler.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/WsdlConfigurationTypeHandler.java
index b818354..7e7ad44 100644
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/WsdlConfigurationTypeHandler.java
+++ b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/pojo/WsdlConfigurationTypeHandler.java
@@ -29,10 +29,10 @@ import org.apache.aries.rsa.spi.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.common.util.PackageUtils;
import org.apache.cxf.databinding.DataBinding;
-import org.apache.cxf.dosgi.dsw.httpservice.HttpServiceManager;
+import org.apache.cxf.dosgi.common.httpservice.HttpServiceManager;
+import org.apache.cxf.dosgi.common.intent.IntentManager;
+import org.apache.cxf.dosgi.common.util.OsgiUtils;
import org.apache.cxf.dosgi.dsw.osgi.Constants;
-import org.apache.cxf.dosgi.dsw.qos.IntentManager;
-import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.osgi.framework.BundleContext;
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSPojoConfigurationTypeHandler.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSPojoConfigurationTypeHandler.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSPojoConfigurationTypeHandler.java
index 49e9d39..385993d 100644
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSPojoConfigurationTypeHandler.java
+++ b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSPojoConfigurationTypeHandler.java
@@ -26,12 +26,12 @@ import org.apache.aries.rsa.spi.Endpoint;
import org.apache.aries.rsa.spi.IntentUnsatisfiedException;
import org.apache.cxf.Bus;
import org.apache.cxf.common.util.ProxyClassLoader;
+import org.apache.cxf.dosgi.common.httpservice.HttpServiceManager;
+import org.apache.cxf.dosgi.common.intent.IntentManager;
+import org.apache.cxf.dosgi.common.util.OsgiUtils;
+import org.apache.cxf.dosgi.common.util.ServerWrapper;
import org.apache.cxf.dosgi.dsw.handlers.pojo.AbstractPojoConfigurationTypeHandler;
-import org.apache.cxf.dosgi.dsw.httpservice.HttpServiceManager;
import org.apache.cxf.dosgi.dsw.osgi.Constants;
-import org.apache.cxf.dosgi.dsw.qos.IntentManager;
-import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
-import org.apache.cxf.dosgi.dsw.util.ServerWrapper;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.client.Client;
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSUtils.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSUtils.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSUtils.java
index c03a29f..e8f0a75 100644
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSUtils.java
+++ b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/handlers/rest/JaxRSUtils.java
@@ -24,8 +24,8 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import org.apache.cxf.dosgi.dsw.util.ClassUtils;
-import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
+import org.apache.cxf.dosgi.common.util.ClassUtils;
+import org.apache.cxf.dosgi.common.util.OsgiUtils;
import org.apache.cxf.jaxrs.model.UserResource;
import org.apache.cxf.jaxrs.provider.aegis.AegisElementProvider;
import org.apache.cxf.jaxrs.utils.ResourceUtils;
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/HttpServiceManager.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/HttpServiceManager.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/HttpServiceManager.java
deleted file mode 100644
index f6ebda1..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/HttpServiceManager.java
+++ /dev/null
@@ -1,176 +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.httpservice;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-
-import org.apache.cxf.Bus;
-import org.apache.cxf.transport.http.DestinationRegistry;
-import org.apache.cxf.transport.http.DestinationRegistryImpl;
-import org.apache.cxf.transport.servlet.CXFNonSpringServlet;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceException;
-import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.http.HttpContext;
-import org.osgi.service.http.HttpService;
-import org.osgi.util.tracker.ServiceTracker;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class HttpServiceManager {
-
- private static final Logger LOG = LoggerFactory.getLogger(HttpServiceManager.class);
- private static final long SERVICE_LOOKUP_TIMEOUT = 10000;
- private ServiceTracker<HttpService, HttpService> tracker;
- private BundleContext bundleContext;
- private Map<Long, String> exportedAliases = Collections.synchronizedMap(new HashMap<Long, String>());
- private String httpBase;
- private String cxfServletAlias;
-
- public HttpServiceManager(BundleContext bundleContext, String httpBase, String cxfServletAlias) {
- this(bundleContext, httpBase, cxfServletAlias,
- new ServiceTracker<HttpService, HttpService>(bundleContext, HttpService.class, null));
- this.tracker.open();
- }
-
- // Only for tests
- public HttpServiceManager(BundleContext bundleContext,
- String httpBase, String cxfServletAlias,
- ServiceTracker<HttpService, HttpService> tracker) {
- this.bundleContext = bundleContext;
- this.tracker = tracker;
- this.httpBase = getWithDefault(httpBase, "http://" + LocalHostUtil.getLocalIp() + ":8181");
- this.cxfServletAlias = getWithDefault(cxfServletAlias, "/cxf");
- }
-
- private String getWithDefault(String value, String defaultValue) {
- return value == null ? defaultValue : value;
- }
-
- public Bus registerServlet(Bus bus, String contextRoot, BundleContext callingContext, Long sid) {
- bus.setExtension(new DestinationRegistryImpl(), DestinationRegistry.class);
- CXFNonSpringServlet cxf = new CXFNonSpringServlet();
- cxf.setBus(bus);
- try {
- HttpService httpService = getHttpService();
- httpService.registerServlet(contextRoot, cxf, new Hashtable<String, String>(),
- getHttpContext(callingContext, httpService));
-
- registerUnexportHook(sid, contextRoot);
-
- LOG.info("Successfully registered CXF DOSGi servlet at " + contextRoot);
- } catch (Exception e) {
- throw new ServiceException("CXF DOSGi: problem registering CXF HTTP Servlet", e);
- }
- return bus;
- }
-
- protected HttpService getHttpService() {
- HttpService service = null;
- try {
- service = tracker.waitForService(SERVICE_LOOKUP_TIMEOUT);
- } catch (InterruptedException ex) {
- LOG.warn("waitForService interrupeted", ex);
- }
- if (service == null) {
- throw new RuntimeException("No HTTPService found");
- }
- return service;
- }
-
- private HttpContext getHttpContext(BundleContext bc, HttpService httpService) {
- HttpContext httpContext = httpService.createDefaultHttpContext();
- return new SecurityDelegatingHttpContext(bc, httpContext);
- }
-
- /**
- * This listens for service removal events and "un-exports" the service
- * from the HttpService.
- *
- * @param sref the service reference to track
- * @param alias the HTTP servlet context alias
- */
- private void registerUnexportHook(Long sid, String alias) {
- LOG.debug("Registering service listener for service with ID {}", sid);
-
- String previous = exportedAliases.put(sid, alias);
- if (previous != null) {
- LOG.warn("Overwriting service export for service with ID {}", sid);
- }
-
- try {
- Filter f = bundleContext.createFilter("(" + org.osgi.framework.Constants.SERVICE_ID + "=" + sid + ")");
- if (f != null) {
- bundleContext.addServiceListener(new UnregisterListener(), f.toString());
- } else {
- LOG.warn("Service listener could not be started. The service will not be automatically unexported.");
- }
- } catch (InvalidSyntaxException e) {
- LOG.warn("Service listener could not be started. The service will not be automatically unexported.", e);
- }
- }
-
- public String getDefaultAddress(Class<?> type) {
- return "/" + type.getName().replace('.', '/');
- }
-
- public String getAbsoluteAddress(String contextRoot, String relativeEndpointAddress) {
- if (relativeEndpointAddress.startsWith("http")) {
- return relativeEndpointAddress;
- }
- String effContextRoot = contextRoot == null ? cxfServletAlias : contextRoot;
- return this.httpBase + effContextRoot + relativeEndpointAddress;
- }
-
- public void close() {
- tracker.close();
- }
-
- private final class UnregisterListener implements ServiceListener {
-
- public void serviceChanged(ServiceEvent event) {
- if (!(event.getType() == ServiceEvent.UNREGISTERING)) {
- return;
- }
- final ServiceReference<?> sref = event.getServiceReference();
- final Long sid = (Long) sref.getProperty(org.osgi.framework.Constants.SERVICE_ID);
- final String alias = exportedAliases.remove(sid);
- if (alias == null) {
- LOG.error("Unable to unexport HTTP servlet for service class '{}',"
- + " service-id {}: no servlet alias found",
- sref.getProperty(org.osgi.framework.Constants.OBJECTCLASS), sid);
- return;
- }
- LOG.debug("Unexporting HTTP servlet for alias '{}'", alias);
- try {
- HttpService http = getHttpService();
- http.unregister(alias);
- } catch (Exception e) {
- LOG.warn("An exception occurred while unregistering service for HTTP servlet alias '{}'", alias, e);
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/LocalHostUtil.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/LocalHostUtil.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/LocalHostUtil.java
deleted file mode 100644
index f2fefe9..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/LocalHostUtil.java
+++ /dev/null
@@ -1,92 +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.httpservice;
-
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-
-/**
- * Utility methods to get the local address even on a linux host.
- */
-final class LocalHostUtil {
-
- private LocalHostUtil() {
- // Util Class
- }
-
- /**
- * Returns an InetAddress representing the address of the localhost. Every
- * attempt is made to find an address for this host that is not the loopback
- * address. If no other address can be found, the loopback will be returned.
- *
- * @return InetAddress the address of localhost
- * @throws UnknownHostException if there is a problem determining the address
- */
- public static InetAddress getLocalHost() throws UnknownHostException {
- InetAddress localHost = InetAddress.getLocalHost();
- if (!localHost.isLoopbackAddress()) {
- return localHost;
- }
- InetAddress[] addrs = getAllLocalUsingNetworkInterface();
- for (InetAddress addr : addrs) {
- if (!addr.isLoopbackAddress() && !addr.getHostAddress().contains(":")) {
- return addr;
- }
- }
- return localHost;
- }
-
- /**
- * Utility method that delegates to the methods of NetworkInterface to
- * determine addresses for this machine.
- *
- * @return all addresses found from the NetworkInterfaces
- * @throws UnknownHostException if there is a problem determining addresses
- */
- private static InetAddress[] getAllLocalUsingNetworkInterface() throws UnknownHostException {
- try {
- List<InetAddress> addresses = new ArrayList<InetAddress>();
- Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
- while (e.hasMoreElements()) {
- NetworkInterface ni = e.nextElement();
- for (Enumeration<InetAddress> e2 = ni.getInetAddresses(); e2.hasMoreElements();) {
- addresses.add(e2.nextElement());
- }
- }
- return addresses.toArray(new InetAddress[] {});
- } catch (SocketException ex) {
- throw new UnknownHostException("127.0.0.1");
- }
- }
-
- public static String getLocalIp() {
- String localIP;
- try {
- localIP = getLocalHost().getHostAddress();
- } catch (Exception e) {
- localIP = "localhost";
- }
- return localIP;
- }
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/SecurityDelegatingHttpContext.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/SecurityDelegatingHttpContext.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/SecurityDelegatingHttpContext.java
deleted file mode 100644
index 042f2d5..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/httpservice/SecurityDelegatingHttpContext.java
+++ /dev/null
@@ -1,133 +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.httpservice;
-
-import java.io.IOException;
-import java.net.URL;
-
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.http.HttpContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * <p>
- * An HttpContext that delegates to another HttpContext for all things other than security. This implementation handles
- * security by delegating to a {@link FilterChain} based on the set of {@link Filter}s registered with a
- * {@link #FILTER_PROP} property.
- * </p>
- * <p>
- * If the {@link BundleContext} contains a {@link #FILTER_REQUIRED_PROP} property with value "true", requests will not
- * be allowed until at least one {@link Filter} with a {@link #FILTER_PROP} property is registered.
- * </p>
- */
-class SecurityDelegatingHttpContext implements HttpContext {
-
- public static final String FILTER_PROP = "org.apache.cxf.httpservice.filter";
- public static final String FILTER_REQUIRED_PROP = "org.apache.cxf.httpservice.requirefilter";
- private static final Logger LOG = LoggerFactory.getLogger(SecurityDelegatingHttpContext.class);
- private static final String FILTER_FILTER = "(" + FILTER_PROP + "=*)";
-
- BundleContext bundleContext;
- HttpContext delegate;
- boolean requireFilter;
-
- SecurityDelegatingHttpContext(BundleContext bundleContext, HttpContext delegate) {
- this.bundleContext = bundleContext;
- this.delegate = delegate;
- requireFilter = Boolean.TRUE.toString().equalsIgnoreCase(bundleContext.getProperty(FILTER_REQUIRED_PROP));
- }
-
- public String getMimeType(String name) {
- return delegate.getMimeType(name);
- }
-
- public URL getResource(String name) {
- return delegate.getResource(name);
- }
-
- @SuppressWarnings({
- "unchecked", "rawtypes"
- })
- public boolean handleSecurity(HttpServletRequest request, HttpServletResponse response) throws IOException {
- ServiceReference[] refs;
- try {
- refs = bundleContext.getServiceReferences(Filter.class.getName(), FILTER_FILTER);
- } catch (InvalidSyntaxException e) {
- LOG.warn(e.getMessage(), e);
- return false;
- }
- if (refs == null || refs.length == 0) {
- LOG.info("No filter registered.");
- return !requireFilter;
- }
- Filter[] filters = new Filter[refs.length];
- try {
- for (int i = 0; i < refs.length; i++) {
- filters[i] = (Filter)bundleContext.getService(refs[i]);
- }
- try {
- new Chain(filters).doFilter(request, response);
- return !response.isCommitted();
- } catch (ServletException e) {
- LOG.warn(e.getMessage(), e);
- return false;
- }
- } finally {
- for (int i = 0; i < refs.length; i++) {
- if (filters[i] != null) {
- bundleContext.ungetService(refs[i]);
- }
- }
- }
- }
-}
-
-/**
- * A {@link FilterChain} composed of {@link Filter}s with the
- */
-class Chain implements FilterChain {
-
- private static final Logger LOG = LoggerFactory.getLogger(Chain.class);
-
- int current;
- final Filter[] filters;
-
- Chain(Filter[] filters) {
- this.filters = filters;
- }
-
- public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {
- if (current < filters.length && !response.isCommitted()) {
- Filter filter = filters[current++];
- LOG.info("doFilter() on {}", filter);
- filter.doFilter(request, response, this);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Activator.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Activator.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Activator.java
deleted file mode 100644
index 13ef30f..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Activator.java
+++ /dev/null
@@ -1,153 +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.osgi;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-
-import org.apache.aries.rsa.spi.DistributionProvider;
-import org.apache.cxf.Bus;
-import org.apache.cxf.BusFactory;
-import org.apache.cxf.dosgi.dsw.handlers.CXFDistributionProvider;
-import org.apache.cxf.dosgi.dsw.httpservice.HttpServiceManager;
-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.qos.IntentTracker;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleListener;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.cm.ConfigurationException;
-import org.osgi.service.cm.ManagedService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-// registered as spring bean -> start / stop called accordingly
-public class Activator implements ManagedService, BundleActivator {
-
- private static final Logger LOG = LoggerFactory.getLogger(Activator.class);
- private static final int DEFAULT_INTENT_TIMEOUT = 30000;
- private static final String CONFIG_SERVICE_PID = "cxf-dsw";
- private ServiceRegistration<?> rsaFactoryReg;
- private ServiceRegistration<?> decoratorReg;
- private IntentTracker intentTracker;
- private HttpServiceManager httpServiceManager;
- private BundleContext bc;
- private BundleListener bundleListener;
- private Dictionary<String, Object> curConfiguration;
- private Bus bus;
-
- public void start(BundleContext bundlecontext) throws Exception {
- LOG.debug("RemoteServiceAdmin Implementation is starting up");
- this.bc = bundlecontext;
- // Disable the fast infoset as it's not compatible (yet) with OSGi
- System.setProperty("org.apache.cxf.nofastinfoset", "true");
- curConfiguration = getDefaultConfig();
- init(curConfiguration);
- registerManagedService(bc);
- }
-
- private Dictionary<String, Object> getDefaultConfig() {
- return new Hashtable<String, Object>();
- }
-
- private synchronized void init(Dictionary<String, Object> config) {
- bus = BusFactory.newInstance().createBus();
-
- String httpBase = (String) config.get(org.apache.cxf.dosgi.dsw.osgi.Constants.HTTP_BASE);
- String cxfServletAlias = (String) config.get(org.apache.cxf.dosgi.dsw.osgi.Constants.CXF_SERVLET_ALIAS);
-
- IntentMap intentMap = new IntentMap(new DefaultIntentMapFactory().create());
- intentTracker = new IntentTracker(bc, intentMap);
- intentTracker.open();
- IntentManager intentManager = new IntentManagerImpl(intentMap, DEFAULT_INTENT_TIMEOUT);
- httpServiceManager = new HttpServiceManager(bc, httpBase, cxfServletAlias);
- DistributionProvider cxfProvider
- = new CXFDistributionProvider(bc, intentManager, httpServiceManager);
- Dictionary<String, Object> props = new Hashtable<String, Object>();
- String[] supportedIntents = intentMap.keySet().toArray(new String[] {});
- props.put(Constants.REMOTE_INTENTS_SUPPORTED, supportedIntents);
- props.put(Constants.REMOTE_CONFIGS_SUPPORTED, cxfProvider.getSupportedTypes());
- rsaFactoryReg = bc.registerService(DistributionProvider.class.getName(), cxfProvider, props);
- }
-
- private synchronized void uninit() {
- if (decoratorReg != null) {
- decoratorReg.unregister();
- decoratorReg = null;
- }
- if (bundleListener != null) {
- bc.removeBundleListener(bundleListener);
- bundleListener = null;
- }
- if (rsaFactoryReg != null) {
- // This also triggers the unimport and unexport of the remote services
- rsaFactoryReg.unregister();
- rsaFactoryReg = null;
- }
- if (httpServiceManager != null) {
- httpServiceManager.close();
- httpServiceManager = null;
- }
- if (intentTracker != null) {
- intentTracker.close();
- intentTracker = null;
- }
- }
-
- private void registerManagedService(BundleContext bundlecontext) {
- Dictionary<String, String> props = new Hashtable<String, String>();
- props.put(Constants.SERVICE_PID, CONFIG_SERVICE_PID);
- // No need to store the registration. Will be unregistered in stop by framework
- bundlecontext.registerService(ManagedService.class.getName(), this, props);
- }
-
- public void stop(BundleContext context) throws Exception {
- LOG.debug("RemoteServiceAdmin Implementation is shutting down now");
- uninit();
- shutdownCXFBus();
- }
-
- /**
- * Causes also the shutdown of the embedded HTTP server
- */
- private void shutdownCXFBus() {
- if (bus != null) {
- LOG.debug("Shutting down the CXF Bus");
- bus.shutdown(true);
- }
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public synchronized void updated(Dictionary config) throws ConfigurationException {
- LOG.debug("RemoteServiceAdmin Implementation configuration is updated with {}", config);
- // config is null if it doesn't exist, is being deleted or has not yet been loaded
- // in which case we run with defaults (just like we do manually when bundle is first started)
- Dictionary<String, Object> configMap = config == null ? getDefaultConfig() : config;
- if (!configMap.equals(curConfiguration)) { // only if something actually changed
- curConfiguration = configMap;
- uninit();
- init(configMap);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Constants.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Constants.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Constants.java
index 87c2c21..5619b5f 100644
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Constants.java
+++ b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/osgi/Constants.java
@@ -18,36 +18,8 @@
*/
package org.apache.cxf.dosgi.dsw.osgi;
-import org.osgi.service.remoteserviceadmin.RemoteConstants;
-
public final class Constants {
- // Constants from RFC 119, they should ultimately be picked up from an OSGi class.
- @Deprecated
- public static final String EXPORTED_INTERFACES = RemoteConstants.SERVICE_EXPORTED_INTERFACES;
- @Deprecated
- public static final String EXPORTED_INTERFACES_OLD = "osgi.remote.interfaces"; // for BW compatibility
-
- @Deprecated
- public static final String EXPORTED_CONFIGS = RemoteConstants.SERVICE_EXPORTED_CONFIGS;
- @Deprecated
- public static final String EXPORTED_CONFIGS_OLD = "osgi.remote.configuration.type"; // for BW compatibility
-
- @Deprecated
- public static final String EXPORTED_INTENTS = RemoteConstants.SERVICE_EXPORTED_INTENTS;
- @Deprecated
- public static final String EXPORTED_INTENTS_EXTRA = RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA;
- @Deprecated
- public static final String EXPORTED_INTENTS_OLD = "osgi.remote.requires.intents";
-
- @Deprecated
- public static final String IMPORTED = RemoteConstants.SERVICE_IMPORTED;
- @Deprecated
- public static final String IMPORTD_CONFIGS = RemoteConstants.SERVICE_IMPORTED_CONFIGS;
-
- @Deprecated
- public static final String INTENTS = RemoteConstants.SERVICE_INTENTS;
-
// WSDL
public static final String WSDL_CONFIG_TYPE = "wsdl";
public static final String WSDL_CONFIG_PREFIX = "osgi.remote.configuration" + "." + WSDL_CONFIG_TYPE;
@@ -56,11 +28,9 @@ public final class Constants {
public static final String WSDL_PORT_NAME = WSDL_CONFIG_PREFIX + ".port.name";
public static final String WSDL_LOCATION = WSDL_CONFIG_PREFIX + ".location";
public static final String WSDL_HTTP_SERVICE_CONTEXT = WSDL_CONFIG_PREFIX + ".httpservice.context";
- // Provider prefix
- public static final String PROVIDER_PREFIX = "org.apache.cxf";
// WS
- public static final String WS_CONFIG_TYPE = PROVIDER_PREFIX + ".ws";
+ public static final String WS_CONFIG_TYPE = "org.apache.cxf" + ".ws";
public static final String WS_ADDRESS_PROPERTY = WS_CONFIG_TYPE + ".address";
public static final String WS_PORT_PROPERTY = WS_CONFIG_TYPE + ".port";
public static final String WS_HTTP_SERVICE_CONTEXT = WS_CONFIG_TYPE + ".httpservice.context";
@@ -85,8 +55,9 @@ public final class Constants {
public static final String WS_WSDL_SERVICE_NAME = WS_CONFIG_TYPE + ".service.name";
public static final String WS_WSDL_PORT_NAME = WS_CONFIG_TYPE + ".port.name";
public static final String WS_WSDL_LOCATION = WS_CONFIG_TYPE + ".wsdl.location";
+
// Rest
- public static final String RS_CONFIG_TYPE = PROVIDER_PREFIX + ".rs";
+ public static final String RS_CONFIG_TYPE = "org.apache.cxf" + ".rs";
public static final String RS_ADDRESS_PROPERTY = RS_CONFIG_TYPE + ".address";
public static final String RS_HTTP_SERVICE_CONTEXT = RS_CONFIG_TYPE + ".httpservice.context";
public static final String RS_DATABINDING_PROP_KEY = RS_CONFIG_TYPE + ".databinding";
@@ -100,46 +71,13 @@ public final class Constants {
public static final String RS_PROVIDER_EXPECTED_PROP_KEY = RS_PROVIDER_PROP_KEY + ".expected";
public static final String RS_PROVIDER_GLOBAL_PROP_KEY = RS_PROVIDER_PROP_KEY + ".globalquery";
public static final String RS_WADL_LOCATION = RS_CONFIG_TYPE + ".wadl.location";
+
// POJO (old value for WS)
public static final String WS_CONFIG_TYPE_OLD = "pojo";
public static final String WS_CONFIG_OLD_PREFIX = "osgi.remote.configuration." + WS_CONFIG_TYPE_OLD;
public static final String WS_ADDRESS_PROPERTY_OLD = WS_CONFIG_OLD_PREFIX + ".address";
public static final String WS_HTTP_SERVICE_CONTEXT_OLD = WS_CONFIG_OLD_PREFIX + ".httpservice.context";
- // Common Configuration Properties
- public static final String CHECK_BUNDLE = "check.bundle";
-
- // The following constants are not evaluated anymore
- @Deprecated
- public static final String DEFAULT_PORT_CONFIG = "default.port";
- @Deprecated
- public static final String DEFAULT_HOST_CONFIG = "default.host";
- @Deprecated
- public static final String DEFAULT_PORT_VALUE = "9000";
- @Deprecated
- public static final String DEFAULT_HOST_VALUE = "localhost";
- @Deprecated
- public static final String USE_MASTER_MAP = "use.master.map";
-
- // DSW Identification - TODO do we really need this one?
- public static final String DSW_CLIENT_ID = PROVIDER_PREFIX + ".remote.dsw.client";
-
- public static final String INTENT_NAME_PROP = "org.apache.cxf.dosgi.IntentName";
-
- /**
- * Prefix to create an absolute URL from a relative URL.
- * See HttpServiceManager.getAbsoluteAddress
- *
- * Defaults to: http://<host name>:8181
- */
- public static final String HTTP_BASE = "httpBase";
-
- /**
- * Name of the cxf servlet alias
- */
- public static final String CXF_SERVLET_ALIAS = "cxfServletAlias";
- public static final String DEFAULT_CXF_SERVLET_ALIAS = "/cxf";
-
private Constants() {
// never constructed
}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/DefaultIntentMapFactory.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/DefaultIntentMapFactory.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/DefaultIntentMapFactory.java
deleted file mode 100644
index 7e0dd2e..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/DefaultIntentMapFactory.java
+++ /dev/null
@@ -1,52 +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.qos;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cxf.binding.soap.Soap11;
-import org.apache.cxf.binding.soap.Soap12;
-import org.apache.cxf.binding.soap.SoapBindingConfiguration;
-import org.apache.cxf.binding.soap.SoapVersion;
-import org.apache.cxf.feature.LoggingFeature;
-
-public class DefaultIntentMapFactory {
-
- public Map<String, Object> create() {
- Map<String, Object> intentMap = new HashMap<String, Object>();
- intentMap.put("logging", getLoggingFeature());
- Object soap11 = getSoapBinding(Soap11.getInstance());
- intentMap.put("SOAP", soap11);
- intentMap.put("SOAP.1_1", soap11);
- intentMap.put("SOAP.1_2", getSoapBinding(Soap12.getInstance()));
- intentMap.put("HTTP", "PROVIDED");
- return intentMap;
- }
-
- private Object getLoggingFeature() {
- return new LoggingFeature();
- }
-
- private Object getSoapBinding(SoapVersion soapVersion) {
- SoapBindingConfiguration soapBindingConfig = new SoapBindingConfiguration();
- soapBindingConfig.setVersion(soapVersion);
- return soapBindingConfig;
- }
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentManager.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentManager.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentManager.java
deleted file mode 100644
index ecaf070..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentManager.java
+++ /dev/null
@@ -1,31 +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.qos;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cxf.endpoint.AbstractEndpointFactory;
-import org.apache.cxf.feature.Feature;
-
-public interface IntentManager {
-
- String[] applyIntents(List<Feature> features, AbstractEndpointFactory factory, Map<String, Object> props);
- void assertAllIntentsSupported(Map<String, Object> serviceProperties);
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentManagerImpl.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentManagerImpl.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentManagerImpl.java
deleted file mode 100644
index e161ef0..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentManagerImpl.java
+++ /dev/null
@@ -1,155 +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.qos;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.aries.rsa.spi.IntentUnsatisfiedException;
-import org.apache.cxf.binding.BindingConfiguration;
-import org.apache.cxf.endpoint.AbstractEndpointFactory;
-import org.apache.cxf.feature.Feature;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class IntentManagerImpl implements IntentManager {
-
- static final Logger LOG = LoggerFactory.getLogger(IntentManagerImpl.class);
- private static final String PROVIDED_INTENT_VALUE = "PROVIDED";
-
- private final IntentMap intentMap;
- private final long maxIntentWaitTime;
-
- public IntentManagerImpl(IntentMap intentMap) {
- this(intentMap, 0);
- }
-
- public IntentManagerImpl(IntentMap intentMap, int maxIntentWaitTime) {
- this.intentMap = intentMap;
- this.maxIntentWaitTime = maxIntentWaitTime;
- }
-
- public String[] applyIntents(List<Feature> features, AbstractEndpointFactory factory,
- Map<String, Object> props) throws IntentUnsatisfiedException {
- Set<String> requestedIntents = IntentUtils.getRequestedIntents(props);
- Set<String> appliedIntents = new HashSet<String>();
- appliedIntents.addAll(reverseLookup(intentMap, PROVIDED_INTENT_VALUE));
- boolean bindingApplied = false;
- for (String intentName : requestedIntents) {
- bindingApplied |= processIntent(features, factory, intentName, intentMap.get(intentName));
- appliedIntents.add(intentName);
- }
- if (!bindingApplied) {
- String defaultBindingName = "SOAP";
- processIntent(features, factory, defaultBindingName, intentMap.get(defaultBindingName));
- appliedIntents.add(defaultBindingName);
- }
- appliedIntents.addAll(addSynonymIntents(appliedIntents, intentMap));
- return appliedIntents.toArray(new String[appliedIntents.size()]);
- }
-
- private boolean processIntent(List<Feature> features, AbstractEndpointFactory factory,
- String intentName, Object intent) throws IntentUnsatisfiedException {
- if (intent instanceof String) {
- if (PROVIDED_INTENT_VALUE.equalsIgnoreCase((String) intent)) {
- return false;
- }
- } else if (intent instanceof BindingConfiguration) {
- BindingConfiguration bindingCfg = (BindingConfiguration)intent;
- LOG.info("Applying intent: " + intentName + " via binding config: " + bindingCfg);
- factory.setBindingConfig(bindingCfg);
- return true;
- } else if (intent instanceof Feature) {
- Feature feature = (Feature) intent;
- LOG.info("Applying intent: " + intentName + " via feature: " + feature);
- features.add(feature);
- return false;
- } else {
- LOG.info("No mapping for intent: " + intentName);
- throw new IntentUnsatisfiedException(intentName);
- }
- return false;
- }
-
- private static Collection<String> addSynonymIntents(Collection<String> appliedIntents,
- IntentMap map) {
- // E.g. SOAP and SOAP.1_1 are synonyms
- List<Object> values = new ArrayList<Object>();
- for (String key : appliedIntents) {
- values.add(map.get(key));
- }
- return reverseLookup(map, values);
- }
-
- private static Collection<String> reverseLookup(IntentMap im, Object obj) {
- return reverseLookup(im, Collections.singleton(obj));
- }
-
- /**
- * Retrieves all keys whose mapped values are found in the given collection.
- *
- * @param im an intent map
- * @param values a collection of potential values
- * @return all keys whose mapped values are found in the given collection
- */
- private static Collection<String> reverseLookup(IntentMap im, Collection<?> values) {
- Set<String> intentsFound = new HashSet<String>();
- for (Map.Entry<String, Object> entry : im.entrySet()) {
- if (values.contains(entry.getValue())) {
- intentsFound.add(entry.getKey());
- }
- }
- return intentsFound;
- }
-
- public void assertAllIntentsSupported(Map<String, Object> serviceProperties) {
- long endTime = System.currentTimeMillis() + maxIntentWaitTime;
- Set<String> requiredIntents = IntentUtils.getRequestedIntents(serviceProperties);
- List<String> unsupportedIntents = new ArrayList<String>();
- do {
- unsupportedIntents.clear();
- for (String ri : requiredIntents) {
- if (!intentMap.containsKey(ri)) {
- unsupportedIntents.add(ri);
- }
- }
- long remainingSeconds = (endTime - System.currentTimeMillis()) / 1000;
- if (!unsupportedIntents.isEmpty() && remainingSeconds > 0) {
- LOG.debug("Waiting for custom intents " + unsupportedIntents + " timeout in " + remainingSeconds);
- try {
- synchronized (intentMap) {
- intentMap.wait(1000);
- }
- } catch (InterruptedException e) {
- LOG.warn(e.getMessage(), e);
- }
- }
- } while (!unsupportedIntents.isEmpty() && System.currentTimeMillis() < endTime);
-
- if (!unsupportedIntents.isEmpty()) {
- throw new RuntimeException("service cannot be exported because the following "
- + "intents are not supported by this RSA: " + unsupportedIntents);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentMap.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentMap.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentMap.java
deleted file mode 100644
index 5ed4ef6..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentMap.java
+++ /dev/null
@@ -1,62 +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.qos;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Maps intent names to intent objects
- * An intent object can be a Feature, a BindingConfiguration or a String
- *
- * Also supports a default intent map. Custom intents can override the defaults
- */
-public class IntentMap extends ConcurrentHashMap<String, Object> {
-
- private static final long serialVersionUID = 2606460607920520767L;
- private Map<String, Object> defaultMap;
-
- public IntentMap() {
- this(new HashMap<String, Object>());
- }
-
- public IntentMap(Map<String, Object> defaultMap) {
- this.defaultMap = defaultMap;
- putAll(defaultMap);
- }
-
- @Override
- public Object put(String key, Object value) {
- Object result = super.put(key, value);
- synchronized (this) {
- notifyAll();
- }
- return result;
- }
-
- @Override
- public Object remove(Object key) {
- Object old = super.remove(key);
- if (defaultMap.containsKey(key)) {
- put((String)key, defaultMap.get(key));
- }
- return old;
- }
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentTracker.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentTracker.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentTracker.java
deleted file mode 100644
index bdbe7c5..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentTracker.java
+++ /dev/null
@@ -1,62 +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.qos;
-
-import org.apache.cxf.dosgi.dsw.osgi.Constants;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-
-@SuppressWarnings({"rawtypes", "unchecked"})
-public class IntentTracker extends ServiceTracker {
-
- private final IntentMap intentMap;
-
-
- public IntentTracker(BundleContext context, IntentMap intentMap) {
- super(context, getFilter(context), null);
- this.intentMap = intentMap;
- }
-
- static Filter getFilter(BundleContext context) {
- try {
- return context.createFilter("(" + Constants.INTENT_NAME_PROP + "=*)");
- } catch (InvalidSyntaxException e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- }
-
- @Override
- public Object addingService(ServiceReference reference) {
- String intentName = (String) reference.getProperty(Constants.INTENT_NAME_PROP);
- Object intent = super.addingService(reference);
- IntentManagerImpl.LOG.info("Adding custom intent " + intentName);
- intentMap.put(intentName, intent);
- return intent;
- }
-
- @Override
- public void removedService(ServiceReference reference, Object service) {
- String intentName = (String) reference.getProperty(Constants.INTENT_NAME_PROP);
- intentMap.remove(intentName);
- super.removedService(reference, service);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentUtils.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentUtils.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentUtils.java
deleted file mode 100644
index 5ee288c..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/qos/IntentUtils.java
+++ /dev/null
@@ -1,86 +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.qos;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.cxf.dosgi.dsw.osgi.Constants;
-import org.apache.cxf.dosgi.dsw.util.OsgiUtils;
-import org.osgi.service.remoteserviceadmin.RemoteConstants;
-
-public final class IntentUtils {
-
- private IntentUtils() {
- // never constructed
- }
-
- public static String[] mergeArrays(String[] a1, String[] a2) {
- if (a1 == null) {
- return a2;
- }
- if (a2 == null) {
- return a1;
- }
-
- List<String> list = new ArrayList<String>(a1.length + a2.length);
- Collections.addAll(list, a1);
- for (String s : a2) {
- if (!list.contains(s)) {
- list.add(s);
- }
- }
-
- return list.toArray(new String[list.size()]);
- }
-
- public static Set<String> getRequestedIntents(Map<String, Object> sd) {
- Collection<String> intents = OsgiUtils.getMultiValueProperty(sd.get(RemoteConstants.SERVICE_EXPORTED_INTENTS));
- Collection<String> intents2
- = OsgiUtils.getMultiValueProperty(sd.get(RemoteConstants.SERVICE_EXPORTED_INTENTS_EXTRA));
- @SuppressWarnings("deprecation")
- Collection<String> oldIntents = OsgiUtils.getMultiValueProperty(sd.get(Constants.EXPORTED_INTENTS_OLD));
- Set<String> allIntents = new HashSet<String>();
- if (intents != null) {
- allIntents.addAll(parseIntents(intents));
- }
- if (intents2 != null) {
- allIntents.addAll(parseIntents(intents2));
- }
- if (oldIntents != null) {
- allIntents.addAll(parseIntents(oldIntents));
- }
-
- return allIntents;
- }
-
- private static Collection<String> parseIntents(Collection<String> intents) {
- List<String> parsed = new ArrayList<String>();
- for (String intent : intents) {
- parsed.addAll(Arrays.asList(intent.split("[ ]")));
- }
- return parsed;
- }
-}
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/d2a3c75f/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/util/ClassUtils.java
----------------------------------------------------------------------
diff --git a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/util/ClassUtils.java b/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/util/ClassUtils.java
deleted file mode 100644
index cd1a323..0000000
--- a/cxf-dsw/src/main/java/org/apache/cxf/dosgi/dsw/util/ClassUtils.java
+++ /dev/null
@@ -1,86 +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.util;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cxf.helpers.CastUtils;
-import org.osgi.framework.BundleContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class ClassUtils {
-
- private static final Logger LOG = LoggerFactory.getLogger(ClassUtils.class);
-
- private ClassUtils() {
- }
-
- public static List<Object> loadProviderClasses(BundleContext callingContext,
- Map<String, Object> sd, String propName) {
- Object serviceProviders = sd.get(propName);
- if (serviceProviders != null) {
- if (serviceProviders.getClass().isArray()) {
- if (serviceProviders.getClass().getComponentType() == String.class) {
- return loadProviders(callingContext, (String[])serviceProviders);
- } else {
- return Arrays.asList((Object[])serviceProviders);
- }
- } else if (serviceProviders.getClass() == String.class) {
- String[] classNames = serviceProviders.toString().split(",");
- return loadProviders(callingContext, classNames);
- } else if (serviceProviders instanceof List) {
- List<Object> list = CastUtils.cast((List<?>)serviceProviders);
- if (!list.isEmpty()) {
- List<Object> providers;
- if (list.get(0).getClass() == String.class) {
- providers = loadProviders(callingContext, list.toArray(new String[]{}));
- } else {
- providers = list;
- }
- return providers;
- }
- } else {
- return Arrays.asList(serviceProviders);
- }
- }
- return Collections.emptyList();
-
- }
-
- private static List<Object> loadProviders(BundleContext callingContext, String[] classNames) {
- List<Object> providers = new ArrayList<Object>();
- for (String className : classNames) {
- try {
- String realName = className.trim();
- if (!realName.isEmpty()) {
- Class<?> pClass = callingContext.getBundle().loadClass(realName);
- providers.add(pClass.newInstance());
- }
- } catch (Exception ex) {
- LOG.warn("Provider " + className.trim() + " can not be loaded or created " + ex.getMessage(), ex);
- }
- }
- return providers;
- }
-}