Repository: cxf-dosgi Updated Branches: refs/heads/master 9ed37bef0 -> 1425743fb
http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/FilterHelper.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/FilterHelper.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/FilterHelper.java deleted file mode 100644 index 3739f16..0000000 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/FilterHelper.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.topologymanager.importer; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.osgi.framework.Constants; - -public final class FilterHelper { - private static final String OBJECTCLASS_EXPRESSION = ".*\\(" + Constants.OBJECTCLASS + "=([a-zA-Z_0-9.]+)\\).*"; - private static final Pattern OBJECTCLASS_PATTERN = Pattern.compile(OBJECTCLASS_EXPRESSION); - - private FilterHelper() { - // prevent instantiation - } - - public static String getObjectClass(String filter) { - if (filter != null) { - Matcher matcher = OBJECTCLASS_PATTERN.matcher(filter); - if (matcher.matches() && matcher.groupCount() >= 1) { - return matcher.group(1); - } - } - return null; - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ListenerHookImpl.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ListenerHookImpl.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ListenerHookImpl.java deleted file mode 100644 index 03ec9da..0000000 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ListenerHookImpl.java +++ /dev/null @@ -1,119 +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.topologymanager.importer; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.framework.hooks.service.ListenerHook; -import org.osgi.service.remoteserviceadmin.RemoteConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Listens for service listeners and informs ServiceInterestListener about added and removed interest - * in services - */ -public class ListenerHookImpl implements ListenerHook { - - private static final Logger LOG = LoggerFactory.getLogger(ListenerHookImpl.class); - - // From the old impl. - private static final Set<String> SYSTEM_PACKAGES; - static { - SYSTEM_PACKAGES = new HashSet<String>(); - SYSTEM_PACKAGES.add("org.osgi.service"); - SYSTEM_PACKAGES.add("org.apache.felix"); - SYSTEM_PACKAGES.add("org.ops4j.pax.logging"); - SYSTEM_PACKAGES.add("ch.ethz.iks.slp"); - SYSTEM_PACKAGES.add("org.ungoverned.osgi.service"); - SYSTEM_PACKAGES.add("org.springframework.osgi.context.event.OsgiBundleApplicationContextListener"); - SYSTEM_PACKAGES.add("java.net.ContentHandler"); - } - - private final BundleContext bctx; - private final ServiceInterestListener serviceInterestListener; - private final String frameworkUUID; - - public ListenerHookImpl(BundleContext bc, ServiceInterestListener serviceInterestListener) { - this.bctx = bc; - this.frameworkUUID = bctx.getProperty(Constants.FRAMEWORK_UUID); - this.serviceInterestListener = serviceInterestListener; - } - - @Override - public void added(Collection<ListenerInfo> listeners) { - LOG.debug("added listeners {}", listeners); - for (ListenerInfo listenerInfo : listeners) { - LOG.debug("Filter {}", listenerInfo.getFilter()); - - String className = FilterHelper.getObjectClass(listenerInfo.getFilter()); - - if (listenerInfo.getBundleContext().equals(bctx)) { - LOG.debug("ListenerHookImpl: skipping request from myself"); - continue; - } - - if (listenerInfo.getFilter() == null) { - LOG.debug("skipping empty filter"); - continue; - } - - if (isClassExcluded(className)) { - LOG.debug("Skipping import request for excluded class [{}]", className); - continue; - } - String exFilter = extendFilter(listenerInfo.getFilter()); - serviceInterestListener.addServiceInterest(exFilter); - } - } - - @Override - public void removed(Collection<ListenerInfo> listeners) { - LOG.debug("removed listeners {}", listeners); - - for (ListenerInfo listenerInfo : listeners) { - LOG.debug("Filter {}", listenerInfo.getFilter()); - - // TODO: determine if service was handled? - String exFilter = extendFilter(listenerInfo.getFilter()); - serviceInterestListener.removeServiceInterest(exFilter); - } - } - - private static boolean isClassExcluded(String className) { - if (className == null) { - return true; - } - - for (String p : SYSTEM_PACKAGES) { - if (className.startsWith(p)) { - return true; - } - } - return false; - } - - String extendFilter(String filter) { - return "(&" + filter + "(!(" + RemoteConstants.ENDPOINT_FRAMEWORK_UUID + "=" + frameworkUUID + ")))"; - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/RSATracker.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/RSATracker.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/RSATracker.java deleted file mode 100644 index 56e98e8..0000000 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/RSATracker.java +++ /dev/null @@ -1,26 +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.topologymanager.importer; - -import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin; - -public interface RSATracker { - void added(RemoteServiceAdmin rsa); - void removed(RemoteServiceAdmin rsa); -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ReferenceCounter.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ReferenceCounter.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ReferenceCounter.java deleted file mode 100644 index 6ecff31..0000000 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ReferenceCounter.java +++ /dev/null @@ -1,76 +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.topologymanager.importer; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -/** - * Manages a reference count per key. - * - * @param <K> the key type - */ -public class ReferenceCounter<K> { - - private final ConcurrentMap<K, Integer> counts = new ConcurrentHashMap<K, Integer>(); - - /** - * Increases the reference count for the given key, - * or sets it to 1 if the key has no existing count. - * - * @param key a key - * @return the updated reference count - */ - public int add(K key) { - while (true) { - Integer count = counts.get(key); - if (count == null) { - if (counts.putIfAbsent(key, 1) == null) { - return 1; - } - } else if (counts.replace(key, count, count + 1)) { - return count + 1; - } - } - } - - /** - * Decreases the reference count for the given key, - * and removes it if it reaches 0. - * If the key has no existing count, -1 is returned. - * - * @param key a key - * @return the updated reference count, or -1 if the key has no existing count - */ - public int remove(K key) { - while (true) { - Integer count = counts.get(key); - if (count == null) { - return -1; - } - if (count == 1) { - if (counts.remove(key, 1)) { - return 0; - } - } else if (counts.replace(key, count, count - 1)) { - return count - 1; - } - } - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ServiceInterestListener.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ServiceInterestListener.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ServiceInterestListener.java deleted file mode 100644 index f4db92e..0000000 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/ServiceInterestListener.java +++ /dev/null @@ -1,26 +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.topologymanager.importer; - -public interface ServiceInterestListener { - - void addServiceInterest(String filter); - - void removeServiceInterest(String filter); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java deleted file mode 100644 index 30fe4c2..0000000 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java +++ /dev/null @@ -1,345 +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.topologymanager.importer; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import org.osgi.framework.BundleContext; -import org.osgi.framework.hooks.service.ListenerHook; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.service.remoteserviceadmin.ImportReference; -import org.osgi.service.remoteserviceadmin.ImportRegistration; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdminEvent; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdminListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Listens for remote endpoints using the EndpointListener interface and the EndpointListenerManager. - * Listens for local service interests using the ListenerHookImpl that calls back through the - * ServiceInterestListener interface. - * Manages local creation and destruction of service imports using the available RemoteServiceAdmin services. - */ -public class TopologyManagerImport implements EndpointListener, RemoteServiceAdminListener, ServiceInterestListener { - - private static final Logger LOG = LoggerFactory.getLogger(TopologyManagerImport.class); - private ExecutorService execService; - - private final EndpointListenerManager endpointListenerManager; - private final BundleContext bctx; - private Set<RemoteServiceAdmin> rsaSet; - private final ListenerHookImpl listenerHook; - - /** - * If set to false only one service is imported for each import interest even it multiple services are - * available. If set to true, all available services are imported. - * - * TODO: Make this available as a configuration option - */ - private boolean importAllAvailable = true; - - /** - * Contains an instance of the Class Import Interest for each distinct import request. If the same filter - * is requested multiple times the existing instance of the Object increments an internal reference - * counter. If an interest is removed, the related ServiceInterest object is used to reduce the reference - * counter until it reaches zero. in this case the interest is removed. - */ - private final ReferenceCounter<String> importInterestsCounter = new ReferenceCounter<String>(); - - /** - * List of Endpoints by matched filter that were reported by the EndpointListener and can be imported - */ - private final Map<String /* filter */, List<EndpointDescription>> importPossibilities - = new HashMap<String, List<EndpointDescription>>(); - - /** - * List of already imported Endpoints by their matched filter - */ - private final Map<String /* filter */, List<ImportRegistration>> importedServices - = new HashMap<String, List<ImportRegistration>>(); - - - public TopologyManagerImport(BundleContext bc) { - this.rsaSet = new HashSet<RemoteServiceAdmin>(); - bctx = bc; - endpointListenerManager = new EndpointListenerManager(bctx, this); - execService = new ThreadPoolExecutor(5, 10, 50, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); - listenerHook = new ListenerHookImpl(bc, this); - } - - public void start() { - bctx.registerService(RemoteServiceAdminListener.class, this, null); - bctx.registerService(ListenerHook.class, listenerHook, null); - endpointListenerManager.start(); - } - - public void stop() { - endpointListenerManager.stop(); - execService.shutdown(); - // this is called from Activator.stop(), which implicitly unregisters our registered services - } - - /* (non-Javadoc) - * @see org.apache.cxf.dosgi.topologymanager.ServiceInterestListener#addServiceInterest(java.lang.String) - */ - public void addServiceInterest(String filter) { - if (importInterestsCounter.add(filter) == 1) { - endpointListenerManager.extendScope(filter); - } - } - - /* (non-Javadoc) - * @see org.apache.cxf.dosgi.topologymanager.ServiceInterestListener#removeServiceInterest(java.lang.String) - */ - public void removeServiceInterest(String filter) { - if (importInterestsCounter.remove(filter) == 0) { - LOG.debug("last reference to import interest is gone -> removing interest filter: {}", filter); - endpointListenerManager.reduceScope(filter); - synchronized (importedServices) { - List<ImportRegistration> irs = importedServices.remove(filter); - if (irs != null) { - for (ImportRegistration ir : irs) { - ir.close(); - } - } - } - } - } - - public void endpointAdded(EndpointDescription endpoint, String filter) { - if (filter == null) { - LOG.error("Endpoint is not handled because no matching filter was provided!"); - return; - } - LOG.debug("importable service added for filter {}, endpoint {}", filter, endpoint); - addImportPossibility(endpoint, filter); - triggerImport(filter); - } - - public void endpointRemoved(EndpointDescription endpoint, String filter) { - LOG.debug("EndpointRemoved {}", endpoint); - removeImportPossibility(endpoint, filter); - triggerImport(filter); - } - - private void addImportPossibility(EndpointDescription endpoint, String filter) { - synchronized (importPossibilities) { - List<EndpointDescription> endpoints = importPossibilities.get(filter); - if (endpoints == null) { - endpoints = new ArrayList<EndpointDescription>(); - importPossibilities.put(filter, endpoints); - } - // prevent adding the same endpoint multiple times, which can happen sometimes, - // and which causes imports to remain available even when services are actually down - if (!endpoints.contains(endpoint)) { - endpoints.add(endpoint); - } - } - } - - private void removeImportPossibility(EndpointDescription endpoint, String filter) { - synchronized (importPossibilities) { - List<EndpointDescription> endpoints = importPossibilities.get(filter); - if (endpoints != null) { - endpoints.remove(endpoint); - if (endpoints.isEmpty()) { - importPossibilities.remove(filter); - } - } - } - } - - public void add(RemoteServiceAdmin rsa) { - rsaSet.add(rsa); - synchronized (importPossibilities) { - for (String filter : importPossibilities.keySet()) { - triggerImport(filter); - } - } - } - - public void remove(RemoteServiceAdmin rsa) { - rsaSet.remove(rsa); - } - - - private void triggerImport(final String filter) { - LOG.debug("Import of a service for filter {} was queued", filter); - - execService.execute(new Runnable() { - public void run() { - try { - unexportNotAvailableServices(filter); - importServices(filter); - } catch (Exception e) { - LOG.error(e.getMessage(), e); - } - // Notify EndpointListeners? NO! - } - }); - } - - private void unexportNotAvailableServices(String filter) { - synchronized (importedServices) { - List<ImportRegistration> importRegistrations = importedServices.get(filter); - if (importRegistrations != null) { - // iterate over a copy - for (ImportRegistration ir : new ArrayList<ImportRegistration>(importRegistrations)) { - EndpointDescription endpoint = ir.getImportReference().getImportedEndpoint(); - if (!isImportPossibilityAvailable(endpoint, filter)) { - removeImport(ir, null); // also unexports the service - } - } - } - } - } - - private boolean isImportPossibilityAvailable(EndpointDescription endpoint, String filter) { - synchronized (importPossibilities) { - List<EndpointDescription> endpoints = importPossibilities.get(filter); - return endpoints != null && endpoints.contains(endpoint); - } - } - - // return a copy to prevent sync issues - private List<EndpointDescription> getImportPossibilitiesCopy(String filter) { - synchronized (importPossibilities) { - List<EndpointDescription> possibilities = importPossibilities.get(filter); - return possibilities == null - ? Collections.<EndpointDescription>emptyList() - : new ArrayList<EndpointDescription>(possibilities); - } - } - - private void importServices(String filter) { - synchronized (importedServices) { - List<ImportRegistration> importRegistrations = importedServices.get(filter); - for (EndpointDescription endpoint : getImportPossibilitiesCopy(filter)) { - // TODO but optional: if the service is already imported and the endpoint is still - // in the list of possible imports check if a "better" endpoint is now in the list - if (!alreadyImported(endpoint, importRegistrations)) { - // service not imported yet -> import it now - ImportRegistration ir = importService(endpoint); - if (ir != null) { - // import was successful - if (importRegistrations == null) { - importRegistrations = new ArrayList<ImportRegistration>(); - importedServices.put(filter, importRegistrations); - } - importRegistrations.add(ir); - if (!importAllAvailable) { - return; - } - } - } - } - } - } - - private boolean alreadyImported(EndpointDescription endpoint, List<ImportRegistration> importRegistrations) { - if (importRegistrations != null) { - for (ImportRegistration ir : importRegistrations) { - if (endpoint.equals(ir.getImportReference().getImportedEndpoint())) { - return true; - } - } - } - return false; - } - - /** - * Tries to import the service with each rsa until one import is successful - * - * @param endpoint endpoint to import - * @return import registration of the first successful import - */ - private ImportRegistration importService(EndpointDescription endpoint) { - for (RemoteServiceAdmin rsa : rsaSet) { - ImportRegistration ir = rsa.importService(endpoint); - if (ir != null) { - if (ir.getException() == null) { - LOG.debug("Service import was successful {}", ir); - return ir; - } else { - LOG.info("Error importing service " + endpoint, ir.getException()); - } - } - } - return null; - } - - /** - * Remove and close (unexport) the given import. The import is specified either - * by its ImportRegistration or by its ImportReference (only one of them must - * be specified). - * <p> - * If this method is called from within iterations on the underlying data structure, - * the iterations must be made on copies of the structures rather than the original - * references in order to prevent ConcurrentModificationExceptions. - * - * @param reg the import registration to remove - * @param ref the import reference to remove - */ - private void removeImport(ImportRegistration reg, ImportReference ref) { - // this method may be called recursively by calling ImportRegistration.close() - // and receiving a RemoteServiceAdminEvent for its unregistration, which results - // in a ConcurrentModificationException. We avoid this by closing the registrations - // only after data structure manipulation is done, and being re-entrant. - synchronized (importedServices) { - List<ImportRegistration> removed = new ArrayList<ImportRegistration>(); - for (Iterator<List<ImportRegistration>> it1 = importedServices.values().iterator(); it1.hasNext();) { - Collection<ImportRegistration> irs = it1.next(); - for (Iterator<ImportRegistration> it2 = irs.iterator(); it2.hasNext();) { - ImportRegistration ir = it2.next(); - if (ir.equals(reg) || ir.getImportReference().equals(ref)) { - removed.add(ir); - it2.remove(); - } - } - if (irs.isEmpty()) { - it1.remove(); - } - } - for (ImportRegistration ir : removed) { - ir.close(); - } - } - } - - public void remoteAdminEvent(RemoteServiceAdminEvent event) { - if (event.getType() == RemoteServiceAdminEvent.IMPORT_UNREGISTRATION) { - removeImport(null, event.getImportReference()); - } - } - -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ActivatorTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ActivatorTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ActivatorTest.java deleted file mode 100644 index 100e3a3..0000000 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/ActivatorTest.java +++ /dev/null @@ -1,68 +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.topologymanager; - -import org.apache.cxf.dosgi.topologymanager.exporter.DefaultExportPolicy; -import org.apache.cxf.dosgi.topologymanager.exporter.TopologyManagerExport; -import org.easymock.Capture; -import org.easymock.EasyMock; -import org.easymock.IAnswer; -import org.easymock.IMocksControl; -import org.junit.Test; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.framework.Filter; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; - -public class ActivatorTest { - - @Test - public void testStart() throws Exception { - IMocksControl c = EasyMock.createNiceControl(); - BundleContext context = c.createMock(BundleContext.class); - EasyMock.expect(context.getProperty(Constants.FRAMEWORK_UUID)).andReturn("myid"); - context.addServiceListener(EasyMock.isA(TopologyManagerExport.class)); - EasyMock.expectLastCall(); - final Capture<String> filter = EasyMock.newCapture(); - EasyMock.expect(context.createFilter(EasyMock.capture(filter))) - .andAnswer(new IAnswer<Filter>() { - public Filter answer() throws Throwable { - return FrameworkUtil.createFilter(filter.getValue()); - } - }).times(2); - ServiceReference<?> sref = c.createMock(ServiceReference.class); - Bundle bundle = c.createMock(Bundle.class); - EasyMock.expect(sref.getBundle()).andReturn(bundle).anyTimes(); - EasyMock.expect(context.getServiceReferences((String)null, Activator.DOSGI_SERVICES)) - .andReturn(new ServiceReference[]{sref}); - - c.replay(); - Activator activator = new Activator(); - activator.doStart(context, new DefaultExportPolicy()); - c.verify(); - - c.reset(); - c.replay(); - activator.doStop(context); - c.verify(); - } - -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java deleted file mode 100644 index 04bd017..0000000 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointListenerNotifierTest.java +++ /dev/null @@ -1,160 +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.topologymanager.exporter; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Dictionary; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -import org.easymock.EasyMock; -import org.junit.Assert; -import org.junit.Test; -import org.osgi.framework.Filter; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.service.remoteserviceadmin.RemoteConstants; - -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; - -@SuppressWarnings({ - "rawtypes", "unchecked" - }) -public class EndpointListenerNotifierTest { - - @Test - public void testNotifyListener() throws InvalidSyntaxException { - EndpointDescription endpoint1 = createEndpoint("myClass"); - EndpointDescription endpoint2 = createEndpoint("notMyClass"); - - // Expect listener to be called for endpoint1 but not for endpoint2 - EndpointListener epl = listenerExpects(endpoint1, "(objectClass=myClass)"); - - EndpointRepository exportRepository = new EndpointRepository(); - EndpointListenerNotifier tm = new EndpointListenerNotifier(exportRepository); - - EasyMock.replay(epl); - Set<Filter> filters = new HashSet<Filter>(); - filters.add(FrameworkUtil.createFilter("(objectClass=myClass)")); - tm.add(epl, filters); - tm.endpointAdded(endpoint1, null); - tm.endpointAdded(endpoint2, null); - tm.endpointRemoved(endpoint1, null); - tm.endpointRemoved(endpoint2, null); - EasyMock.verify(epl); - } - - private EndpointListener listenerExpects(EndpointDescription endpoint, String filter) { - EndpointListener epl = EasyMock.createStrictMock(EndpointListener.class); - epl.endpointAdded(EasyMock.eq(endpoint), EasyMock.eq(filter)); - EasyMock.expectLastCall().once(); - epl.endpointRemoved(EasyMock.eq(endpoint), EasyMock.eq(filter)); - EasyMock.expectLastCall().once(); - return epl; - } - - @Test - public void testNotifyListeners() throws InvalidSyntaxException { - EndpointDescription endpoint1 = createEndpoint("myClass"); - - EndpointListener epl = EasyMock.createStrictMock(EndpointListener.class); - epl.endpointAdded(EasyMock.eq(endpoint1), EasyMock.eq("(objectClass=myClass)")); - EasyMock.expectLastCall().once(); - epl.endpointRemoved(EasyMock.eq(endpoint1), EasyMock.eq("(objectClass=myClass)")); - EasyMock.expectLastCall().once(); - - EndpointRepository exportRepository = new EndpointRepository(); - EndpointListenerNotifier tm = new EndpointListenerNotifier(exportRepository); - - EasyMock.replay(epl); - Set<Filter> filters = new HashSet<Filter>(); - filters.add(FrameworkUtil.createFilter("(objectClass=myClass)")); - tm.add(epl, filters); - tm.endpointAdded(endpoint1, null); - tm.endpointRemoved(endpoint1, null); - tm.remove(epl); - EasyMock.verify(epl); - } - - public EndpointDescription createEndpoint(String iface) { - Map<String, Object> props = new Hashtable<String, Object>(); - props.put("objectClass", new String[]{iface}); - props.put(RemoteConstants.ENDPOINT_ID, iface); - props.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "any"); - return new EndpointDescription(props); - } - - @Test - public void testNormalizeScopeForSingleString() { - ServiceReference sr = createListenerServiceWithFilter("(myProp=A)"); - Set<Filter> res = EndpointListenerNotifier.getFiltersFromEndpointListenerScope(sr); - assertEquals(1, res.size()); - Filter filter = res.iterator().next(); - filterMatches(filter); - } - - @Test - public void testNormalizeScopeForStringArray() { - String[] filters = {"(myProp=A)", "(otherProp=B)"}; - ServiceReference sr = createListenerServiceWithFilter(filters); - Set<Filter> res = EndpointListenerNotifier.getFiltersFromEndpointListenerScope(sr); - assertEquals(filters.length, res.size()); - Iterator<Filter> it = res.iterator(); - Filter filter1 = it.next(); - Filter filter2 = it.next(); - Dictionary<String, String> props = new Hashtable(); - props.put("myProp", "A"); - assertThat(filter1.match(props) || filter2.match(props), is(true)); - } - - @Test - public void testNormalizeScopeForCollection() { - Collection<String> collection = Arrays.asList("(myProp=A)", "(otherProp=B)"); - ServiceReference sr = createListenerServiceWithFilter(collection); - Set<Filter> res = EndpointListenerNotifier.getFiltersFromEndpointListenerScope(sr); - Iterator<Filter> it = res.iterator(); - Filter filter1 = it.next(); - Filter filter2 = it.next(); - Dictionary<String, String> props = new Hashtable(); - props.put("myProp", "A"); - Assert.assertThat(filter1.match(props) || filter2.match(props), is(true)); - } - - private void filterMatches(Filter filter) { - Dictionary<String, String> props = new Hashtable(); - props.put("myProp", "A"); - Assert.assertTrue("Filter should match", filter.match(props)); - } - - private ServiceReference createListenerServiceWithFilter(Object filters) { - ServiceReference sr = EasyMock.createMock(ServiceReference.class); - EasyMock.expect(sr.getProperty(EndpointListener.ENDPOINT_LISTENER_SCOPE)).andReturn(filters); - EasyMock.replay(sr); - return sr; - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepositoryTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepositoryTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepositoryTest.java deleted file mode 100644 index cb07f43..0000000 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/EndpointRepositoryTest.java +++ /dev/null @@ -1,82 +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.topologymanager.exporter; - -import java.util.Arrays; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; - -import org.easymock.EasyMock; -import org.easymock.IMocksControl; -import org.junit.Test; -import org.osgi.framework.Bundle; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.service.remoteserviceadmin.RemoteConstants; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin; - -public class EndpointRepositoryTest { - - @Test - public void testAddRemove() throws InvalidSyntaxException { - EndpointDescription ep1 = createEndpoint("my"); - - IMocksControl c = EasyMock.createControl(); - ServiceReference<?> sref = createService(c); - RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class); - EndpointListener notifier = c.createMock(EndpointListener.class); - - notifier.endpointAdded(ep1, null); - EasyMock.expectLastCall(); - - c.replay(); - EndpointRepository repo = new EndpointRepository(); - repo.setNotifier(notifier); - List<EndpointDescription> endpoints = Arrays.asList(ep1); - repo.addEndpoints(sref, rsa, endpoints); - c.verify(); - - c.reset(); - notifier.endpointRemoved(ep1, null); - EasyMock.expectLastCall(); - - c.replay(); - repo.removeRemoteServiceAdmin(rsa); - c.verify(); - } - - private ServiceReference<?> createService(IMocksControl c) { - ServiceReference<?> sref = c.createMock(ServiceReference.class); - Bundle bundle = c.createMock(Bundle.class); - EasyMock.expect(bundle.getSymbolicName()).andReturn("myBundle"); - EasyMock.expect(sref.getBundle()).andReturn(bundle); - return sref; - } - - public EndpointDescription createEndpoint(String iface) { - Map<String, Object> props = new Hashtable<String, Object>(); - props.put("objectClass", new String[]{iface}); - props.put(RemoteConstants.ENDPOINT_ID, iface); - props.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "any"); - return new EndpointDescription(props); - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExportTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExportTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExportTest.java deleted file mode 100644 index 0eda150..0000000 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExportTest.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.topologymanager.exporter; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Executor; - -import org.apache.cxf.dosgi.dsw.api.ExportPolicy; -import org.easymock.EasyMock; -import org.easymock.IMocksControl; -import org.junit.Test; -import org.osgi.framework.Bundle; -import org.osgi.framework.Constants; -import org.osgi.framework.ServiceEvent; -import org.osgi.framework.ServiceReference; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.EndpointListener; -import org.osgi.service.remoteserviceadmin.ExportReference; -import org.osgi.service.remoteserviceadmin.ExportRegistration; -import org.osgi.service.remoteserviceadmin.RemoteConstants; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin; - -import static org.easymock.EasyMock.expectLastCall; - -@SuppressWarnings({"rawtypes", "unchecked"}) -public class TopologyManagerExportTest { - - /** - * This tests if the topology manager handles a service marked to be exported correctly by exporting it to - * an available RemoteServiceAdmin and notifying an EndpointListener afterwards. - * - * @throws Exception - */ - @Test - public void testServiceExportUnexport() throws Exception { - IMocksControl c = EasyMock.createControl(); - RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class); - final EndpointListener notifier = c.createMock(EndpointListener.class); - final ServiceReference sref = createUserService(c); - EndpointDescription epd = createEndpoint(); - expectServiceExported(c, rsa, notifier, sref, epd); - - c.replay(); - EndpointRepository endpointRepo = new EndpointRepository(); - endpointRepo.setNotifier(notifier); - Executor executor = syncExecutor(); - ExportPolicy policy = new DefaultExportPolicy(); - TopologyManagerExport exportManager = new TopologyManagerExport(endpointRepo, executor, policy); - exportManager.add(rsa); - exportManager.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, sref)); - c.verify(); - - c.reset(); - notifier.endpointRemoved(epd, null); - expectLastCall().once(); - c.replay(); - exportManager.serviceChanged(new ServiceEvent(ServiceEvent.UNREGISTERING, sref)); - c.verify(); - - c.reset(); - c.replay(); - exportManager.serviceChanged(new ServiceEvent(ServiceEvent.MODIFIED, sref)); - c.verify(); - - c.reset(); - c.replay(); - exportManager.remove(rsa); - c.verify(); - } - - @Test - public void testExportExisting() throws Exception { - IMocksControl c = EasyMock.createControl(); - RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class); - final EndpointListenerNotifier mockEpListenerNotifier = c.createMock(EndpointListenerNotifier.class); - final ServiceReference sref = createUserService(c); - expectServiceExported(c, rsa, mockEpListenerNotifier, sref, createEndpoint()); - c.replay(); - - EndpointRepository endpointRepo = new EndpointRepository(); - endpointRepo.setNotifier(mockEpListenerNotifier); - ExportPolicy policy = new DefaultExportPolicy(); - TopologyManagerExport exportManager = new TopologyManagerExport(endpointRepo, syncExecutor(), policy); - exportManager.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, sref)); - exportManager.add(rsa); - c.verify(); - } - - private void expectServiceExported(IMocksControl c, RemoteServiceAdmin rsa, - final EndpointListener listener, - final ServiceReference sref, EndpointDescription epd) { - ExportRegistration exportRegistration = createExportRegistration(c, epd); - EasyMock.expect(rsa.exportService(EasyMock.same(sref), (Map<String, Object>)EasyMock.anyObject())) - .andReturn(Collections.singletonList(exportRegistration)).once(); - listener.endpointAdded(epd, null); - EasyMock.expectLastCall().once(); - } - - private Executor syncExecutor() { - return new Executor() { - @Override - public void execute(Runnable command) { - command.run(); - } - }; - } - - private ExportRegistration createExportRegistration(IMocksControl c, EndpointDescription endpoint) { - ExportRegistration exportRegistration = c.createMock(ExportRegistration.class); - ExportReference exportReference = c.createMock(ExportReference.class); - EasyMock.expect(exportRegistration.getExportReference()).andReturn(exportReference).anyTimes(); - EasyMock.expect(exportRegistration.getException()).andReturn(null).anyTimes(); - EasyMock.expect(exportReference.getExportedEndpoint()).andReturn(endpoint).anyTimes(); - return exportRegistration; - } - - private EndpointDescription createEndpoint() { - Map<String, Object> props = new HashMap<String, Object>(); - props.put(RemoteConstants.ENDPOINT_ID, "1"); - props.put(Constants.OBJECTCLASS, new String[] {"abc"}); - props.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "cxf"); - return new EndpointDescription(props); - } - - private ServiceReference createUserService(IMocksControl c) { - final ServiceReference sref = c.createMock(ServiceReference.class); - EasyMock.expect(sref.getProperty(EasyMock.same(RemoteConstants.SERVICE_EXPORTED_INTERFACES))) - .andReturn("*").anyTimes(); - Bundle srefBundle = c.createMock(Bundle.class); - EasyMock.expect(sref.getBundle()).andReturn(srefBundle).atLeastOnce(); - EasyMock.expect(sref.getProperty("objectClass")).andReturn("org.My").anyTimes(); - EasyMock.expect(srefBundle.getSymbolicName()).andReturn("serviceBundleName").atLeastOnce(); - return sref; - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/EndpointListenerImplTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/EndpointListenerImplTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/EndpointListenerImplTest.java deleted file mode 100644 index c736197..0000000 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/EndpointListenerImplTest.java +++ /dev/null @@ -1,111 +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.topologymanager.importer; - -import java.util.Dictionary; -import java.util.List; - -import org.easymock.EasyMock; -import org.easymock.IAnswer; -import org.easymock.IMocksControl; -import org.junit.Assert; -import org.junit.Test; -import org.osgi.framework.BundleContext; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.remoteserviceadmin.EndpointListener; - -public class EndpointListenerImplTest extends Assert { - - int testCase; - - @SuppressWarnings({ - "rawtypes", "unchecked" - }) - @Test - public void testScopeChange() { - IMocksControl c = EasyMock.createNiceControl(); - BundleContext bc = c.createMock(BundleContext.class); - TopologyManagerImport tm = c.createMock(TopologyManagerImport.class); - ServiceRegistration sr = c.createMock(ServiceRegistration.class); - - // expect Listener registration - EasyMock.expect(bc.registerService(EasyMock.anyObject(Class.class), - EasyMock.anyObject(), - (Dictionary)EasyMock.anyObject())).andReturn(sr).atLeastOnce(); - - sr.setProperties((Dictionary)EasyMock.anyObject()); - - // expect property changes based on later calls - EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() { - - public Object answer() throws Throwable { - Object[] args = EasyMock.getCurrentArguments(); - Dictionary props = (Dictionary)args[0]; - List<String> scope = (List<String>)props.get(EndpointListener.ENDPOINT_LISTENER_SCOPE); - switch (testCase) { - case 1: - assertEquals(1, scope.size()); - assertEquals("(a=b)", scope.get(0)); - break; - case 2: - assertEquals(0, scope.size()); - break; - case 3: - assertEquals("adding entry to empty list failed", 1, scope.size()); - assertEquals("(a=b)", scope.get(0)); - break; - case 4: - assertEquals("adding second entry failed", 2, scope.size()); - assertNotNull(scope.contains("(a=b)")); - assertNotNull(scope.contains("(c=d)")); - break; - case 5: - assertEquals("remove failed", 1, scope.size()); - assertEquals("(c=d)", scope.get(0)); - break; - default: - assertTrue("This should not happen!", false); - } - return null; - } - }).atLeastOnce(); - - c.replay(); - - EndpointListenerManager endpointListener = new EndpointListenerManager(bc, tm); - - endpointListener.start(); - - testCase = 1; - endpointListener.extendScope("(a=b)"); - testCase = 2; - endpointListener.reduceScope("(a=b)"); - - testCase = 3; - endpointListener.extendScope("(a=b)"); - testCase = 4; - endpointListener.extendScope("(c=d)"); - testCase = 5; - endpointListener.reduceScope("(a=b)"); - - endpointListener.stop(); - - c.verify(); - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/ListenerHookImplTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/ListenerHookImplTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/ListenerHookImplTest.java deleted file mode 100644 index 1e2f90c..0000000 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/ListenerHookImplTest.java +++ /dev/null @@ -1,89 +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.topologymanager.importer; - -import java.util.Collection; -import java.util.Collections; -import java.util.Dictionary; -import java.util.Hashtable; - -import org.easymock.EasyMock; -import org.easymock.IMocksControl; -import org.junit.Test; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Filter; -import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.hooks.service.ListenerHook.ListenerInfo; -import org.osgi.service.remoteserviceadmin.RemoteConstants; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class ListenerHookImplTest { - - @Test - public void testExtendFilter() throws InvalidSyntaxException { - String filter = "(a=b)"; - BundleContext bc = createBundleContext(); - filter = new ListenerHookImpl(bc, null).extendFilter(filter); - - Filter f = FrameworkUtil.createFilter(filter); - - Dictionary<String, String> m = new Hashtable<String, String>(); - m.put("a", "b"); - assertTrue(filter + " filter must match as uuid is missing", f.match(m)); - m.put(RemoteConstants.ENDPOINT_FRAMEWORK_UUID, "MyUUID"); - assertFalse(filter + " filter must NOT match as uuid is the local one", f.match(m)); - } - - @Test - public void testAddedRemoved() throws InvalidSyntaxException { - IMocksControl c = EasyMock.createControl(); - String filter = "(objectClass=My)"; - BundleContext bc = createBundleContext(); - BundleContext listenerBc = createBundleContext(); - ServiceInterestListener serviceInterestListener = c.createMock(ServiceInterestListener.class); - ListenerHookImpl listenerHook = new ListenerHookImpl(bc, serviceInterestListener); - - ListenerInfo listener = c.createMock(ListenerInfo.class); - EasyMock.expect(listener.getBundleContext()).andReturn(listenerBc); - EasyMock.expect(listener.getFilter()).andReturn(filter).atLeastOnce(); - - // Main assertions - serviceInterestListener.addServiceInterest(listenerHook.extendFilter(filter)); - EasyMock.expectLastCall(); - serviceInterestListener.removeServiceInterest(listenerHook.extendFilter(filter)); - EasyMock.expectLastCall(); - - Collection<ListenerInfo> listeners = Collections.singletonList(listener); - - c.replay(); - listenerHook.added(listeners); - listenerHook.removed(listeners); - c.verify(); - } - - private BundleContext createBundleContext() { - BundleContext bc = EasyMock.createNiceMock(BundleContext.class); - EasyMock.expect(bc.getProperty(EasyMock.eq("org.osgi.framework.uuid"))).andReturn("MyUUID").atLeastOnce(); - EasyMock.replay(bc); - return bc; - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/ReferenceCounterTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/ReferenceCounterTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/ReferenceCounterTest.java deleted file mode 100644 index 3ab78db..0000000 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/ReferenceCounterTest.java +++ /dev/null @@ -1,42 +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.topologymanager.importer; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class ReferenceCounterTest { - - @Test - public void testCounter() { - ReferenceCounter<String> counter = new ReferenceCounter<String>(); - assertEquals(-1, counter.remove("a")); - assertEquals(-1, counter.remove("a")); - assertEquals(1, counter.add("a")); - assertEquals(2, counter.add("a")); - assertEquals(3, counter.add("a")); - assertEquals(2, counter.remove("a")); - assertEquals(1, counter.remove("a")); - assertEquals(2, counter.add("a")); - assertEquals(1, counter.remove("a")); - assertEquals(0, counter.remove("a")); - assertEquals(-1, counter.remove("a")); - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImportTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImportTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImportTest.java deleted file mode 100644 index 00be969..0000000 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImportTest.java +++ /dev/null @@ -1,87 +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.topologymanager.importer; - -import java.util.Dictionary; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -import org.easymock.EasyMock; -import org.easymock.IAnswer; -import org.easymock.IMocksControl; -import org.junit.Test; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; -import org.osgi.framework.ServiceRegistration; -import org.osgi.service.remoteserviceadmin.EndpointDescription; -import org.osgi.service.remoteserviceadmin.ImportReference; -import org.osgi.service.remoteserviceadmin.ImportRegistration; -import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin; - -import static org.junit.Assert.assertTrue; - -public class TopologyManagerImportTest { - - @SuppressWarnings({ - "rawtypes", "unchecked" - }) - @Test - public void testImportForNewlyAddedRSA() throws InterruptedException { - IMocksControl c = EasyMock.createControl(); - - c.makeThreadSafe(true); - - final Semaphore sema = new Semaphore(0); - - ServiceRegistration sreg = c.createMock(ServiceRegistration.class); - sreg.unregister(); - EasyMock.expectLastCall().once(); - - BundleContext bc = c.createMock(BundleContext.class); - EasyMock.expect(bc.registerService(EasyMock.anyObject(Class.class), - EasyMock.anyObject(), - (Dictionary)EasyMock.anyObject())).andReturn(sreg).anyTimes(); - EasyMock.expect(bc.getProperty(Constants.FRAMEWORK_UUID)).andReturn("myid"); - - EndpointDescription endpoint = c.createMock(EndpointDescription.class); - RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class); - final ImportRegistration ireg = c.createMock(ImportRegistration.class); - EasyMock.expect(ireg.getException()).andReturn(null).anyTimes(); - ImportReference iref = c.createMock(ImportReference.class); - EasyMock.expect(ireg.getImportReference()).andReturn(iref).anyTimes(); - EasyMock.expect(iref.getImportedEndpoint()).andReturn(endpoint).anyTimes(); - - EasyMock.expect(rsa.importService(EasyMock.eq(endpoint))).andAnswer(new IAnswer<ImportRegistration>() { - public ImportRegistration answer() throws Throwable { - sema.release(); - return ireg; - } - }).once(); - c.replay(); - - TopologyManagerImport tm = new TopologyManagerImport(bc); - tm.start(); - tm.endpointAdded(endpoint, "myFilter"); - tm.add(rsa); - assertTrue("rsa.ImportService should have been called", - sema.tryAcquire(100, TimeUnit.SECONDS)); - tm.stop(); - c.verify(); - } -} http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/dsw/pom.xml ---------------------------------------------------------------------- diff --git a/dsw/pom.xml b/dsw/pom.xml deleted file mode 100644 index 375d8fc..0000000 --- a/dsw/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version='1.0' encoding='UTF-8' ?> -<!-- - 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - - <modelVersion>4.0.0</modelVersion> - <artifactId>cxf-dosgi-ri-dsw</artifactId> - <packaging>pom</packaging> - <name>Distributed OSGI Distributed Software Modules</name> - <url>http://cxf.apache.org</url> - - <parent> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-parent</artifactId> - <version>1.8-SNAPSHOT</version> - <relativePath>../parent/pom.xml</relativePath> - </parent> - - <properties> - <topDirectoryLocation>..</topDirectoryLocation> - </properties> - - <modules> - <module>cxf-topology-manager</module> - <module>cxf-dosgi-provider-api</module> - <module>cxf-dosgi-rsa</module> - <module>cxf-dsw</module> - <module>cxf-dosgi-tcp</module> - </modules> -</project> http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/osgi-api/pom.xml ---------------------------------------------------------------------- diff --git a/osgi-api/pom.xml b/osgi-api/pom.xml deleted file mode 100644 index 6a123eb..0000000 --- a/osgi-api/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ -<?xml version='1.0' encoding='UTF-8' ?> -<!-- - 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. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - <artifactId>cxf-dosgi-ri-osgi-api</artifactId> - <packaging>bundle</packaging> - <name>CXF dOSGi Required OSGi Compendium APIs</name> - <description>The minimal set of OSGi Compendium APIs required by DOSGi</description> - <!-- - This bundle should be deployed instead of the full OSGi Compendium bundle to prevent issues - caused by multiple exports of other OSGi APIs that are not used by DOSGi. See DOSGI-208. - --> - - <parent> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-parent</artifactId> - <version>1.8-SNAPSHOT</version> - <relativePath>../parent/pom.xml</relativePath> - </parent> - - <properties> - <!-- the minimal set of OSGi Compendium packages that is required for DOSGi to run --> - <required-packages>org.osgi.service.remoteserviceadmin,org.osgi.service.event</required-packages> - </properties> - - <dependencies> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.compendium</artifactId> - <scope>provided</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.felix</groupId> - <artifactId>maven-bundle-plugin</artifactId> - <configuration> - <instructions> - <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> - <!-- we must both import and export to prevent trouble if another bundle exports them too --> - <Import-Package>${required-packages},*</Import-Package> - <Export-Package>${required-packages}</Export-Package> - <!-- embed the packages in this bundle --> - <Private-Package>${required-packages}</Private-Package> - </instructions> - </configuration> - </plugin> - </plugins> - </build> - -</project> http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/parent/pom.xml ---------------------------------------------------------------------- diff --git a/parent/pom.xml b/parent/pom.xml index ea56f96..cf58737 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -173,6 +173,9 @@ <artifactId>maven-bundle-plugin</artifactId> <version>${felix.plugin.version}</version> <extensions>true</extensions> + <configuration> + <obrRepository>NONE</obrRepository> + </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 039c837..d5c2fa4 100644 --- a/pom.xml +++ b/pom.xml @@ -102,11 +102,8 @@ <modules> <module>parent</module> - <module>felix</module> - <module>dsw</module> - <module>discovery</module> + <module>cxf-dsw</module> <module>samples</module> - <module>osgi-api</module> <module>distribution</module> <module>systests2</module> </modules> http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/systests2/multi-bundle/pom.xml ---------------------------------------------------------------------- diff --git a/systests2/multi-bundle/pom.xml b/systests2/multi-bundle/pom.xml index baa9d01..f1efaff 100644 --- a/systests2/multi-bundle/pom.xml +++ b/systests2/multi-bundle/pom.xml @@ -130,12 +130,6 @@ </exclusions> </dependency> <dependency> - <groupId>org.apache.cxf.dosgi</groupId> - <artifactId>cxf-dosgi-ri-discovery-distributed-zookeeper-server</artifactId> - <version>${project.version}</version> - <scope>test</scope> - </dependency> - <dependency> <groupId>org.apache.cxf.dosgi.samples</groupId> <artifactId>cxf-dosgi-ri-samples-greeter-impl</artifactId> <version>${project.version}</version> http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/tck/apply-to-tck.sh.template ---------------------------------------------------------------------- diff --git a/tck/apply-to-tck.sh.template b/tck/apply-to-tck.sh.template deleted file mode 100755 index b6d4455..0000000 --- a/tck/apply-to-tck.sh.template +++ /dev/null @@ -1,15 +0,0 @@ -#This script pretends the current build to be the same as the version in the R5 TCK repo. -#This puts the wrong version numbers on the files copied to the repo, so it could be improved -#but it keeps changes to a minimum. -# -#Run this script before executing the CT tests to get the CT tests to run with the current CXF DOSGi build - -TCK_HOME=... the osgi build clone root directory... -ZOOKEEPER_JAR=... the zookeeper server jar, can be obtained from a zookeeper download... -cp $ZOOKEEPER_JAR $TCK_HOME/licensed/repo/org.apache.cxf.dosgi.discovery.zookeeper/org.apache.cxf.dosgi.discovery.zookeeper-1.2.0.jar - -cp org.osgi.impl.service.remoteserviceadmin-4.3.0.lib $TCK_HOME/cnf/repo/org.osgi.impl.service.remoteserviceadmin - -cp ../distribution/single-bundle/target/cxf-dosgi-ri-singlebundle-distribution-1.5-SNAPSHOT.jar $TCK_HOME/licensed/repo/org.apache.cxf.dosgi.singlebundle/org.apache.cxf.dosgi.singlebundle-1.3.1.jar -cp ../discovery/distributed/zookeeper-server/target/cxf-dosgi-ri-discovery-distributed-zookeeper-server-1.5-SNAPSHOT.jar $TCK_HOME/licensed/repo/org.apache.cxf.dosgi.discovery.server/org.apache.cxf.dosgi.discovery.server-1.2.0.jar -cp ../discovery/distributed/zookeeper-server-config/target/cxf-dosgi-ri-discovery-distributed-zookeeper-server-config-1.5-SNAPSHOT.jar $TCK_HOME/licensed/repo/org.apache.cxf.dosgi.discovery.server.config/org.apache.cxf.dosgi.discovery.server.config-1.2.0.jar http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/1425743f/tck/org.osgi.impl.service.remoteserviceadmin-4.3.0.lib ---------------------------------------------------------------------- diff --git a/tck/org.osgi.impl.service.remoteserviceadmin-4.3.0.lib b/tck/org.osgi.impl.service.remoteserviceadmin-4.3.0.lib deleted file mode 100644 index 66a532c..0000000 --- a/tck/org.osgi.impl.service.remoteserviceadmin-4.3.0.lib +++ /dev/null @@ -1,5 +0,0 @@ -org.apache.cxf.dosgi.singlebundle; version=1.3.1 -com.springsource.org.apache.log4j; version=1.2.15 -slf4j.api; version=1.6.1 -slf4j.nop; version=1.6.1 -
