Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin')
-rw-r--r--bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/Activator.java147
-rw-r--r--bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/EventDispatcher.java260
-rw-r--r--bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/NotificationEvent.java38
-rw-r--r--bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/TracerMap.java51
-rw-r--r--bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireAdminImpl.java602
-rw-r--r--bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireImpl.java846
-rw-r--r--bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireProperties.java40
-rw-r--r--bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireReDispatcher.java317
8 files changed, 0 insertions, 2301 deletions
diff --git a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/Activator.java b/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/Activator.java
deleted file mode 100644
index 19e209d17..000000000
--- a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/Activator.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2007 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.wireadmin;
-
-import org.eclipse.equinox.internal.util.ref.Log;
-import org.osgi.framework.*;
-import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.wireadmin.*;
-
-/**
- * @author Pavlin Dobrev
- * @version 1.0
- */
-
-public class Activator implements BundleActivator, ServiceListener, ServiceFactory {
-
- static final String PREFIX = "[WireAdmin]: ";
-
- public static boolean LOG_DEBUG;
- static Log log;
-
- private WireAdminImpl wireAdmin;
- private ServiceReference cmRef;
-
- public static BundleContext bc;
-
- WireReDispatcher wireReDispatcher;
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(BundleContext bc) throws Exception {
- Activator.bc = bc;
- log = new Log(bc, false);
- log.setPrintOnConsole(getBoolean("equinox.services.wireadmin.console"));
-
- LOG_DEBUG = getBoolean("equinox.services.wireadmin.debug");
- log.setDebug(LOG_DEBUG);
-
- cmRef = bc.getServiceReference(ConfigurationAdmin.class.getName());
-
- ConfigurationAdmin cm = null;
- if (cmRef != null) {
- cm = (ConfigurationAdmin) bc.getService(cmRef);
- }
-
- try {
- bc.addServiceListener(this, '(' + Constants.OBJECTCLASS + '=' + ConfigurationAdmin.class.getName() + ')');
- } catch (InvalidSyntaxException ise) {
- /* syntax is valid */
- }
-
- wireAdmin = new WireAdminImpl(bc, cm);
-
- try {
- bc.addServiceListener(wireAdmin, "(|(" + Constants.OBJECTCLASS + '=' + WireAdminListener.class.getName() + ')' + '(' + Constants.OBJECTCLASS + '=' + Consumer.class.getName() + ')' + '(' + Constants.OBJECTCLASS + '=' + Producer.class.getName() + "))");
- } catch (InvalidSyntaxException ise) {
- /* syntax is valid */
- // ise.printStackTrace();
- }
- wireReDispatcher = new WireReDispatcher();
- wireReDispatcher.start(bc);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop(BundleContext bc) throws Exception {
- if (wireReDispatcher != null) {
- wireReDispatcher.stop();
- wireReDispatcher = null;
- }
-
- wireAdmin.unregister();
-
- bc.removeServiceListener(wireAdmin);
- bc.removeServiceListener(this);
-
- if (cmRef != null) {
- bc.ungetService(cmRef);
- cmRef = null;
- }
-
- log.close();
- log = null;
-
- wireAdmin = null;
-
- bc = null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
- */
- public void serviceChanged(ServiceEvent e) {
- switch (e.getType()) {
- case ServiceEvent.MODIFIED :
- case ServiceEvent.REGISTERED :
- this.cmRef = e.getServiceReference();
- wireAdmin.cm = (ConfigurationAdmin) bc.getService(cmRef);
- break;
- case ServiceEvent.UNREGISTERING :
- this.cmRef = null;
- wireAdmin.cm = null;
- break;
- }
- }
-
- public Object getService(Bundle bundle, ServiceRegistration registration) {
- return null;
- }
-
- public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
- }
-
- public static boolean getBoolean(String property) {
- String prop = (bc != null) ? bc.getProperty(property) : System.getProperty(property);
- return ((prop != null) && prop.equalsIgnoreCase("true"));
- }
-
- public static int getInteger(String property, int defaultValue) {
- String prop = (bc != null) ? bc.getProperty(property) : System.getProperty(property);
- if (prop != null) {
- try {
- return Integer.decode(prop).intValue();
- } catch (NumberFormatException e) {
- //do nothing
- }
- }
- return defaultValue;
- }
-}
diff --git a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/EventDispatcher.java b/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/EventDispatcher.java
deleted file mode 100644
index 027325f4a..000000000
--- a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/EventDispatcher.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2007 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.wireadmin;
-
-import java.util.*;
-import org.osgi.framework.*;
-import org.osgi.service.wireadmin.*;
-
-/**
- * This class is responsible for dispatching notifications to WireAdminListeners
- * and Consumers and Producers.
- *
- * @author Stoyan Boshev
- * @author Pavlin Dobrev
- *
- * @version 1.0
- */
-public class EventDispatcher implements Runnable {
-
- private BundleContext bc;
-
- private WireAdminImpl wa;
-
- private Hashtable refToList;
-
- private Vector events;
-
- private Object synch = new Object();
- private Object listenersLock = new Object();
-
- private boolean running = true;
-
- private Thread dispatcher;
-
- public EventDispatcher(BundleContext bc, WireAdminImpl wa) {
- this.bc = bc;
- this.wa = wa;
- this.refToList = new Hashtable(5);
- this.events = new Vector(5, 5);
-
- ServiceReference[] sRefs = null;
-
- try {
- sRefs = bc.getServiceReferences(WireAdminListener.class.getName(), null);
- } catch (InvalidSyntaxException ise) {
- /* filter is null */
- }
-
- if (sRefs != null) {
- WireAdminListener listener;
-
- for (int i = 0; i < sRefs.length; i++) {
- listener = (WireAdminListener) bc.getService(sRefs[i]);
-
- if (listener != null) {
- refToList.put(sRefs[i], listener);
- }
- }
- }
- dispatcher = new Thread(this, "[WireAdmin] - Event Dispatcher");
- dispatcher.start();
- }
-
- void addEvent(WireAdminEvent evt) {
- if (dispatcher == null) {
- // synchronous
- notifyListeners(new EventData(evt, refToList));
- } else {
- // synchronized (listenersLock) { //because it does not change the
- // Hashtable;
- events.addElement(new EventData(evt, refToList));
- // }
- synchronized (synch) {
- synch.notify();
- }
- }
- }
-
- void addNotificationEvent(NotificationEvent ne) {
- if (dispatcher == null) {
- // synchronous
- notifyConsumerProducer(ne);
- } else {
- events.addElement(ne);
- synchronized (synch) {
- synch.notify();
- }
- }
- }
-
- private String printWires(Wire[] wires) {
- if (wires != null) {
- StringBuffer buff = new StringBuffer(100);
- buff.append("\n");
- for (int i = 0; i < wires.length; i++) {
- buff.append(wires[i]).append("\n");
- }
- return buff.toString();
- }
- return "null";
- }
-
- private void notifyConsumerProducer(NotificationEvent ne) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug("Notification event " + ((ne.producer != null) ? "; Producer " + ne.producer : "; Consumer " + ne.consumer) + "; source: " + ne.source + "; wires " + printWires(ne.wires), null);
-
- Activator.log.debug(0, 10001, ((dispatcher != null) ? "asynchronous" : "synchronous"), null, false);
- }
- if (ne.producer != null) {
- try {
- ne.producer.consumersConnected(ne.wires);
- } catch (Throwable t) {
- wa.notifyListeners(ne.source, WireAdminEvent.PRODUCER_EXCEPTION, t);
- }
- } else if (ne.consumer != null) {
- try {
- ne.consumer.producersConnected(ne.wires);
- } catch (Throwable t) {
- wa.notifyListeners(ne.source, WireAdminEvent.CONSUMER_EXCEPTION, t);
- }
- }
- }
-
- private void notifyListeners(EventData event) {
- WireAdminEvent evt = (WireAdminEvent) event.event;
- Hashtable refToList = event.listeners;
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10002, getEvent(evt.getType()) + evt.getWire(), evt.getThrowable(), false);
- Activator.log.debug(0, 10001, ((dispatcher != null) ? "asynchronous" : "synchronous"), null, false);
- }
-
- for (Enumeration en = refToList.keys(); running && en.hasMoreElements();) {
- ServiceReference current = (ServiceReference) en.nextElement();
- Integer accepts = (Integer) current.getProperty(WireConstants.WIREADMIN_EVENTS);
- if ((accepts != null) && ((accepts.intValue() & evt.getType()) == evt.getType())) {
- try {
- ((WireAdminListener) refToList.get(current)).wireAdminEvent(evt);
- } catch (Throwable t) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10003, ((WireAdminListener) refToList.get(current)).toString(), t, false);
- }
- }
- }
- }
- }
-
- /**
- * @param ref
- */
- public void removeListener(ServiceReference ref) {
- if (refToList.containsKey(ref)) {
- synchronized (listenersLock) {
- refToList = (Hashtable) refToList.clone();
- if (refToList.remove(ref) != null) {
- bc.ungetService(ref);
- }
- }
- }
- }
-
- /**
- * @param ref
- * @param object
- */
- public void addListener(ServiceReference ref, Object object) {
- synchronized (listenersLock) {
- refToList = (Hashtable) refToList.clone();
- refToList.put(ref, object);
- }
- }
-
- public void run() {
- while (running) {
- synchronized (synch) {
- while (running && events.size() == 0) {
- try {
- synch.wait();
- } catch (InterruptedException ie) {
- }
- }
- }
-
- EventData evt = null;
- NotificationEvent ne = null;
- while (running && events.size() > 0) {
- Object event = events.elementAt(0);
- events.removeElementAt(0);
- if (event instanceof EventData) {
- evt = (EventData) event;
- notifyListeners(evt);
- } else {
- ne = (NotificationEvent) event;
- notifyConsumerProducer(ne);
- }
- }
- }
- }
-
- void terminate() {
- running = false;
-
- if (dispatcher != null) {
- synchronized (synch) {
- synch.notify();
- }
- }
-
- synchronized (listenersLock) {
- for (Enumeration en = refToList.keys(); en.hasMoreElements();) {
- bc.ungetService((ServiceReference) en.nextElement());
- }
- refToList.clear();
- refToList = null;
- }
- events.removeAllElements();
- events = null;
- }
-
- private String getEvent(int type) {
- switch (type) {
- case WireAdminEvent.WIRE_CREATED :
- return "WIRE_CREATED";
- case WireAdminEvent.WIRE_CONNECTED :
- return "WIRE_CONNECTED";
- case WireAdminEvent.WIRE_UPDATED :
- return "WIRE_UPDATED";
- case WireAdminEvent.WIRE_TRACE :
- return "WIRE_TRACE";
- case WireAdminEvent.WIRE_DISCONNECTED :
- return "WIRE_DISCONNECTED";
- case WireAdminEvent.WIRE_DELETED :
- return "WIRE_DELETED";
- case WireAdminEvent.PRODUCER_EXCEPTION :
- return "PRODUCER_EXCEPTION";
- case WireAdminEvent.CONSUMER_EXCEPTION :
- return "CONSUMER_EXCEPTION";
- default :
- return null;
- }
- }
-
- class EventData {
- Object event;
- Hashtable listeners;
-
- public EventData(Object event, Hashtable listenersData) {
- this.event = event;
- listeners = listenersData;
- }
- }
-}
diff --git a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/NotificationEvent.java b/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/NotificationEvent.java
deleted file mode 100644
index 679beaca4..000000000
--- a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/NotificationEvent.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2007 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.wireadmin;
-
-import org.osgi.service.wireadmin.*;
-
-/**
- * This class holds the producer and consumer which have to be notified for
- * changes in their wires
- *
- * @author Stoyan Boshev
- * @author Pavlin Dobrev
- * @version 1.0
- */
-public class NotificationEvent {
-
- Producer producer;
- Consumer consumer;
- Wire source;
- Wire[] wires;
-
- public NotificationEvent(Producer pr, Consumer cm, Wire source, Wire[] wires) {
- producer = pr;
- consumer = cm;
- this.source = source;
- this.wires = wires;
- }
-
-}
diff --git a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/TracerMap.java b/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/TracerMap.java
deleted file mode 100644
index 8324ac90f..000000000
--- a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/TracerMap.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2007 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.wireadmin;
-
-import org.eclipse.equinox.internal.util.hash.HashIntObjNS;
-
-/**
- * @author Lubomir Mitev
- * @author Pavlin Dobrev
- * @version 1.0
- */
-public class TracerMap {
-
- public static HashIntObjNS getMap() {
- HashIntObjNS map = new HashIntObjNS(18);
-
- map.put(0, "WireAdmin");
- map.put(10001, "Event model is ");
- map.put(10002, "Event type / source : ");
- map.put(10003, "Exception while notifying WireAdminListener: ");
- map.put(10004, "Will create wire producerPID/consumerPID/props : ");
- map.put(10005, "I/O error creating a configuration!");
- map.put(10006, "Found case variants while updating wire properties");
- map.put(10007, "deleting wire with pid ");
- map.put(10008, "deleting complete");
- map.put(10009, "Updating properties for wire with pid=");
- map.put(10011, "Will set new properties for wire ");
- map.put(10012, "Filter doesn't match value : ");
- map.put(10013, "Wire started : ");
- map.put(10014, "Disconnecting ");
- map.put(10015, "Service is not connected to any producer/consumer : ");
- map.put(10016, "The producer and consumer could not interoperate using wire ");
- map.put(10017, "No ServiceReference for Wire events! event: ");
- map.put(10018, "WireAdminEvent redispatched: ");
-
- return map;
- }
-
- public static HashIntObjNS getStarts() {
- return null;
- }
-}
diff --git a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireAdminImpl.java b/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireAdminImpl.java
deleted file mode 100644
index b2b5a9372..000000000
--- a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireAdminImpl.java
+++ /dev/null
@@ -1,602 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2007 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.wireadmin;
-
-import java.io.IOException;
-import java.util.*;
-import org.osgi.framework.*;
-import org.osgi.service.cm.*;
-import org.osgi.service.wireadmin.*;
-
-/**
- * Wire Admin service implementation
- *
- * @author Pavlin Dobrev
- * @author Stoyan Boshev
- * @version 1.0
- */
-class WireAdminImpl implements WireAdmin, ManagedServiceFactory, ServiceListener {
-
- private EventDispatcher evtDisp;
-
- private static final String PID_PREFIX = "WA_GENERATED_PID_";
- private static final String FACTORY_PID = "equinox.wireadmin.fpid";
-
- private BundleContext bc;
-
- ConfigurationAdmin cm;
-
- private Hashtable wires; // maps wire pid to the WireImpl object
- private ServiceRegistration regWireAdmin;
- private ServiceRegistration regManagedFactory;
-
- private Vector waitForUpdate = new Vector();
-
- long counter = System.currentTimeMillis();
-
- /**
- * Constructs an <code>WireAdminImpl</code> object, which provides
- * Framework with methods for manipulating a <code>Wire</code> objects.
- * Initialazed are hashtables for storing created wires, wires per
- * <code>Producer</code>, and wires per <code>Consumer</code>.
- *
- * @param bc
- * is the BundleContext object used for interaction with
- * Framework.
- */
-
- WireAdminImpl(BundleContext bc, ConfigurationAdmin cm) {
- this.bc = bc;
- this.cm = cm;
- wires = new Hashtable();
- evtDisp = new EventDispatcher(bc, this);
-
- Hashtable props = new Hashtable(2, 1.0f);
- props.put(Constants.SERVICE_PID, FACTORY_PID);
- props.put("service.factoryPid", FACTORY_PID);
-
- if (cm != null) {
- try {
- Configuration[] all = cm.listConfigurations("(service.factoryPid=" + FACTORY_PID + ")");
- if (all != null) {
- WireImpl wire;
-
- for (int i = 0; i < all.length; i++) {
- Dictionary properties = all[i].getProperties();
- String pid = (String) properties.get(WireConstants.WIREADMIN_PID);
-
- if (pid == null) {
- pid = all[i].getPid();
- properties.put(WireConstants.WIREADMIN_PID, pid);
- }
-
- wire = new WireImpl(bc, this, properties);
- wires.put(pid, wire);
- wire.start();
- }
- }
- } catch (IOException ioe) {
- /* blocking won't be made */
- } catch (InvalidSyntaxException ise) {
- /* syntax is valid */
- }
- }
-
- // register as ManagedServiceFactory after loading the current config
- // values and creating the wires !!!!!!!!
- // This will not lead to bugs because of updating wire props while wire
- // is not preloaded
- regManagedFactory = bc.registerService(ManagedServiceFactory.class.getName(), this, props);
- regWireAdmin = bc.registerService(WireAdmin.class.getName(), this, props);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.WireAdmin#createWire(java.lang.String,
- * java.lang.String, java.util.Dictionary)
- */
- public Wire createWire(String producerPID, String consumerPID, Dictionary props) {
- return createWire(producerPID, consumerPID, props, null);
- }
-
- private Wire createWire(String producerPID, String consumerPID, Dictionary props, String pid) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10004, producerPID + " / " + consumerPID + " / =" + props, null, false);
- }
-
- if ((pid == null) && (producerPID == null || consumerPID == null)) {
- throw new IllegalArgumentException("PIDs can not be null");
- }
-
- if (props == null) {
- props = new Hashtable(7, 1.0f);
- } else if (caseVariants(props)) {
- throw new IllegalArgumentException("Illegal wire properties. Two or more keys with the same value, or incorrect key type!");
- }
-
- if (pid == null) {
- // put the keys
- props.put(WireConstants.WIREADMIN_PRODUCER_PID, producerPID);
- props.put(WireConstants.WIREADMIN_CONSUMER_PID, consumerPID);
- }
- WireImpl wire = null;
-
- if (pid != null) {
- wire = new WireImpl(bc, this, props);
- wires.put(pid, wire);
- wire.start();
- } else if (cm != null) {
- try {
- Configuration config = cm.createFactoryConfiguration(FACTORY_PID);
- props.put(WireConstants.WIREADMIN_PID, config.getPid());
- wire = new WireImpl(bc, this, props);
- /* Object oldWire = */wires.put(config.getPid(), wire);
- // if (oldWire != null) {
- // System.out.println("\n\n@@@@@@@@@@@@@@@@@@ Old wire lost!!!!
- // Wire is "+oldWire);
- // System.out.println("@@@@@@@@@@@@@@@@@@ New Wire is "+wire);
- // }
- wire.start();
- waitForUpdate.addElement(wire);
- config.update(props);
- } catch (IOException ioe) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10005, null, ioe, false);
- }
- }
- } else {
- String wirePID = getNextPID();
- props.put(WireConstants.WIREADMIN_PID, wirePID);
- props.put("service.factoryPid", "equinox.wireadmin.fpid");
- wire = new WireImpl(bc, this, props);
- wires.put(wirePID, wire);
- wire.start();
-
- Activator.log.info(Activator.PREFIX + "CM not available! The created wire from Producer=" + producerPID + " and Consumer=" + consumerPID + " won't be presistently stored!");
-
- }
-
- notifyListeners(wire, WireAdminEvent.WIRE_CREATED, null);
- return wire;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.WireAdmin#updateWire(org.osgi.service.wireadmin.Wire,
- * java.util.Dictionary)
- */
- public void updateWire(Wire wire, Dictionary properties) {
- WireImpl wireImpl = (WireImpl) wire;
-
- if (wireImpl == null || !wireImpl.isValid) {// fix #1064
- return;
- }
-
- if (properties == null) {
- properties = new Hashtable(7, 1.0f);
- }
-
- for (Enumeration en = properties.keys(); en.hasMoreElements();) {
- if (!(en.nextElement() instanceof String)) {
- throw new IllegalArgumentException("Illegal keys, must be String type");
- }
- }
-
- if (caseVariants(properties)) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10006, null, null, false);
- }
- throw new IllegalArgumentException("Found case variants in properties' keys");
- }
-
- String wirePID = (String) wire.getProperties().get(WireConstants.WIREADMIN_PID);
-
- if ((cm != null) && (wirePID.charAt(0) != 'W')) {
- // CM is available and this wire was not created
- // when the CM was not available
-
- wireImpl.setProperties(properties);
- wires.put(wirePID, wire);
- waitForUpdate.addElement(wire);
-
- try {
- Configuration conf = cm.getConfiguration(wirePID);
- conf.update(properties);
- } catch (IOException ioe) {
- Activator.log.error(Activator.PREFIX + "I/O error updating configuration!", ioe);
- }
-
- } else {
- // either CM is not available, or
- // this wire was created when CM was not available
- wires.remove(wirePID);
- wireImpl.setProperties(properties);
- wires.put(wirePID, wire);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.WireAdmin#deleteWire(org.osgi.service.wireadmin.Wire)
- */
- public void deleteWire(Wire wire) {
- WireImpl wireImpl = (WireImpl) wire;
- try {
- if (cm != null) {
- Configuration current = cm.getConfiguration(wireImpl.getWirePID());
- if (current != null) {
- current.delete();
- }
- } else {
- disconnectWire(wireImpl);
- }
- } catch (IOException ioe) {
- Activator.log.error(Activator.PREFIX + "I/O error getting a configuration!", ioe);
- }
- }
-
- private Wire[] getWires(String pid, boolean isProducer) throws InvalidSyntaxException {
- if (isProducer) {
- return getWires('(' + WireConstants.WIREADMIN_PRODUCER_PID + '=' + WireImpl.escapeSpecialCharacters(pid) + ')');
- }
-
- return getWires('(' + WireConstants.WIREADMIN_CONSUMER_PID + '=' + WireImpl.escapeSpecialCharacters(pid) + ')');
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.WireAdmin#getWires(java.lang.String)
- */
- public Wire[] getWires(String filterString) throws InvalidSyntaxException {
- if (filterString == null) {
- return getAllWires();
- }
-
- Filter filter = bc.createFilter(filterString);
-
- if (filter == null) {
- return getAllWires();
- }
-
- Vector tmp = new Vector();
-
- synchronized (wires) {
- for (Enumeration en = wires.elements(); en.hasMoreElements();) {
- Wire wire = (Wire) en.nextElement();
- Dictionary wireProps = wire.getProperties();
-
- if (wire.isValid() && filter.match(wireProps)) {
- tmp.addElement(wire);
- }
- }
- }
-
- if (tmp.size() == 0) {
- return null;
- }
-
- Wire[] allWires = new Wire[tmp.size()];
- tmp.copyInto(allWires);
- return allWires;
- }
-
- private Wire[] getAllWires() {
- if (wires.isEmpty()) {
- return null;
- }
-
- Vector tmp = new Vector();
-
- synchronized (wires) {
- for (Enumeration en = wires.elements(); en.hasMoreElements();) {
- Wire wire = (Wire) en.nextElement();
- if (wire.isValid()) {
- tmp.addElement(wire);
- }
- }
- }
-
- if (tmp.size() == 0) {
- return null;
- }
-
- Wire[] allWires = new Wire[tmp.size()];
- tmp.copyInto(allWires);
- return allWires;
- }
-
- private void disconnectWire(WireImpl wire) {
- if (wires == null) {
- return;
- }
- Object result = wires.remove(wire.getWirePID());// Property(WireConstants.WIREADMIN_PID));
- if (result != null) { // the wire existed
- boolean wasConnected = wire.isConnected();
- wire.stop();
- if (wasConnected) {
- notifyListeners(wire, WireAdminEvent.WIRE_DISCONNECTED, null);
- }
- notifyListeners(wire, WireAdminEvent.WIRE_DELETED, null);
- }
- }
-
- Wire[] getConnected(String key, String value) {
- if (key == null || value == null || wires.isEmpty()) {
- return null;
- }
-
- Vector connected = new Vector();
-
- synchronized (wires) {
- for (Enumeration en = wires.elements(); en.hasMoreElements();) {
- WireImpl w = (WireImpl) en.nextElement();
- if (w.isValid() && w.isConnected() && value.equals(w.getProperties().get(key))) {
- connected.addElement(w);
- }
- }
- }
-
- if (connected.isEmpty()) {
- return null;
- }
-
- Wire[] cw = new Wire[connected.size()];
- connected.copyInto(cw);
- return cw;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.cm.ManagedServiceFactory#deleted(java.lang.String)
- */
- public void deleted(String pid) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10007, pid, null, false);
- }
-
- if (wires == null) {
- return;
- }
- WireImpl wire = (WireImpl) wires.get(pid);
- disconnectWire(wire);
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10008, null, null, false);
- }
- }
-
- public String getName() {
- return "WireAdmin Configuration Factory";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.cm.ManagedServiceFactory#updated(java.lang.String,
- * java.util.Dictionary)
- */
- public void updated(String pid, Dictionary properties) throws ConfigurationException {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10009, pid, null, false);
- Activator.log.debug(Activator.PREFIX + " " + properties, null);
- }
-
- String consumerPID = (String) properties.get(WireConstants.WIREADMIN_CONSUMER_PID);
-
- if (consumerPID == null) {
- throw new ConfigurationException(WireConstants.WIREADMIN_CONSUMER_PID, "is not provided");
- }
-
- String producerPID = (String) properties.get(WireConstants.WIREADMIN_PRODUCER_PID);
-
- if (producerPID == null) {
- throw new ConfigurationException(WireConstants.WIREADMIN_PRODUCER_PID, "is not provided");
- }
-
- properties.put(WireConstants.WIREADMIN_PID, pid);
-
- if (wires == null) {
- return;
- }
-
- WireImpl wire = (WireImpl) wires.get(pid);
-
- if (wire != null) {
- if (waitForUpdate.contains(wire)) {
- // skip the first update after the wire was created
- // or after the wire properties were updated
- waitForUpdate.removeElement(wire);
- } else {
- // updating properties
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10011, wire.toString(), null, false);
- }
- wire.setProperties(properties);
- }
- } else {
- createWire(producerPID, consumerPID, properties, pid);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
- */
- public void serviceChanged(ServiceEvent event) {
- int type = event.getType();
- ServiceReference ref = event.getServiceReference();
-
- if (type == ServiceEvent.UNREGISTERING) {
- // presume that the unregistered service is a WireAdminListener
- // service
- evtDisp.removeListener(ref);
- return;
- }
-
- Object service = bc.getService(ref);
-
- if (type == ServiceEvent.REGISTERED) {
- if (service instanceof WireAdminListener) {
- evtDisp.addListener(ref, bc.getService(ref));
- }
-
- if (service instanceof Producer) {
- Wire[] wires = null;
- try {
- wires = getWires((String) ref.getProperty(Constants.SERVICE_PID), true);
- } catch (InvalidSyntaxException ise) {
- /* syntax is valid */
- }
- boolean doNotify = true;
- if (wires != null) {
- // there are wires, which may become connected
- for (int i = 0; i < wires.length; i++) {
- if (((WireImpl) wires[i]).consumerRef != null) {
- // there is wire which will become (or is) connected
- doNotify = false;
- }
- }
- }
- if (doNotify) {
- notifyConsumerProducer(new NotificationEvent((Producer) service, null, null, null));
- }
- }
-
- if (service instanceof Consumer) {
- Wire[] wires = null;
- try {
- wires = getWires((String) ref.getProperty(Constants.SERVICE_PID), false);
- } catch (InvalidSyntaxException ise) {
- /* syntax is valid */
- }
-
- boolean doNotify = true;
- if (wires != null) {
- // there are wires, which may become connected
- for (int i = 0; i < wires.length; i++) {
- if (((WireImpl) wires[i]).producerRef != null) {
- // there is wire which will become (or is) connected
- doNotify = false;
- }
- }
- }
- if (doNotify) {
- notifyConsumerProducer(new NotificationEvent(null, (Consumer) service, null, null));
- }
- }
- }
- }
-
- // Utility methods
- /**
- * Sends a <code>WireAdminEvent</code> to all services registered as
- * <code>WireAdminListener</code>
- *
- * @param type
- * is the type of the <code>WireAdminEvent</code> that must be
- * sent.
- */
- void notifyListeners(Wire src, int type, Throwable t) {
- if (regWireAdmin == null) {
- return;
- }
- evtDisp.addEvent(new WireAdminEvent(regWireAdmin.getReference(), type, src, t));
- }
-
- void notifyConsumerProducer(NotificationEvent ne) {
- evtDisp.addNotificationEvent(ne);
- }
-
- void unregister() {
-
- if (regWireAdmin != null) {
- regWireAdmin.unregister();
- regWireAdmin = null;
- }
- if (regManagedFactory != null) {
- regManagedFactory.unregister();
- regManagedFactory = null;
- }
-
- // disconnect all running wires
- synchronized (wires) {
- for (Enumeration en = wires.elements(); en.hasMoreElements();) {
- disconnectWire((WireImpl) en.nextElement());
- }
- }
-
- // stop event dispatcher
- evtDisp.terminate();
-
- cm = null;
- wires.clear();
- wires = null;
- bc = null;
- }
-
- private static boolean caseVariants(Dictionary props) {
- int k = 0;
- int size = props.size();
- String[] keys = new String[size];
-
- try {
- for (Enumeration en = props.keys(); en.hasMoreElements();) {
- keys[k] = (String) en.nextElement();
- k++;
- }
- } catch (ClassCastException cce) {
- return true;
- }
- int j;
-
- for (int i = 0; i < size; i++) {
- for (j = i + 1; j < size; j++) {
- if (keys[i].equalsIgnoreCase(keys[j])) {
- return true;
- }
- }
- }
- return false;
- }
-
- private final String getNextPID() {
- String nextPID = PID_PREFIX + counter++;
- while (wires.get(nextPID) != null) {
- nextPID = PID_PREFIX + counter++;
- }
- return nextPID;
- }
-
- boolean hasAConnectedWire(boolean isProducer, String pid) {
- String cPid;
- synchronized (wires) {
- for (Enumeration en = wires.elements(); en.hasMoreElements();) {
- WireImpl wire = (WireImpl) en.nextElement();
-
- if (wire.isValid() && wire.isConnected()) {
- cPid = (String) wire.getProperties().get(isProducer ? WireConstants.WIREADMIN_PRODUCER_PID : WireConstants.WIREADMIN_CONSUMER_PID);
- if (cPid.equals(pid)) {
- return true;
- }
- }
- }
- }
- // none of the wires in wich this service takes part
- // will become connected after it's registering
- return false;
- }
-}
diff --git a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireImpl.java b/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireImpl.java
deleted file mode 100644
index d039602f9..000000000
--- a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireImpl.java
+++ /dev/null
@@ -1,846 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2007 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.wireadmin;
-
-import java.util.*;
-import org.osgi.framework.*;
-import org.osgi.service.wireadmin.*;
-
-/**
- * @author Pavlin Dobrev
- * @version 1.0
- */
-
-class WireImpl implements Wire, ServiceListener {
-
- private BundleContext bc;
-
- /** Holds all the properties associated with this <code>Wire</code> object */
- private WireProperties properties;
-
- /** Holds a service reference to the associated <code>Producer</code> */
- ServiceReference producerRef;
-
- /** Holds a service reference to the associated <code>Consumer</code> */
- ServiceReference consumerRef;
-
- private Producer producer;
- private Consumer consumer;
-
- private Class[] flavors;
-
- /** Holds the last value passed through this <code>Wire</code>. */
- private Object lastValue;
-
- private Vector envelopes;
-
- /**
- * <code>WireAdmin</code> object whit which this <code>Wire</code> was
- * created.
- */
- private WireAdminImpl parent;
-
- private Filter filter = null;
-
- /** Holds the time of last <code>Consumer</code> update in milliseconds */
- private long lastUpdateTime = -1;
-
- /** Holds the available wire values (filter attributes) */
- private Hashtable wireValues;
-
- /* holds a list of scopes */
- private String[] scope;
-
- /** Indicates that this <code>Wire</code> object has been deleted */
- boolean isValid = true;
-
- private boolean interoperate = true;
-
- private boolean allAccepted = true;
-
- /**
- * Creates a <code>Wire</code> object, representing a connection between a
- * <code>Producer</code> and <code>Consumer</code>.
- *
- * @param bc
- * is the Wiring <code>BundleContext</code>.
- * @param parent
- * is the <code>WireAdmin</code> which is the creator of this
- * <code>Wire</code>.
- * @param wirePID
- * is a <code>String</code> holding a unique presistent
- * identifier of this <code>Wire</code>, generated by the
- * parent <code>WireAdmin</code>.
- * @param properties
- * is a collection of the initial wire properties.
- */
- WireImpl(BundleContext bc, WireAdminImpl parent, Dictionary properties) {
- this.bc = bc;
- this.parent = parent;
- this.properties = new WireProperties();
-
- for (Enumeration en = properties.keys(); en.hasMoreElements();) {
- Object key = en.nextElement();
- this.properties.put0(key, properties.get(key));
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#isValid()
- */
- public boolean isValid() {
- return isValid;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#getFlavors()
- */
- public Class[] getFlavors() {
- return isConnected() ? flavors : null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#getProperties()
- */
- public Dictionary getProperties() {
- return properties;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#getLastValue()
- */
- public synchronized Object getLastValue() {
- return lastValue;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#update(java.lang.Object)
- */
- public synchronized void update(Object value) {
- if (!isConnected() || !interoperate || !isAcceptable(value)) {
- return;
- }
-
- if (value instanceof Envelope) {
- Envelope e = (Envelope) value;
- if (!hasScope(e.getScope())) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(Activator.PREFIX + "Try to pass a value in an Envelop without permission, silent return.", null);
- }
- return;
- }
- }
-
- if (filter != null) {
-
- wireValues.put(WireConstants.WIREVALUE_CURRENT, value);
-
- // #3329
- if (lastValue != null) {
- wireValues.put(WireConstants.WIREVALUE_PREVIOUS, lastValue);
- wireValues.put(WireConstants.WIREVALUE_ELAPSED, new Long(System.currentTimeMillis() - lastUpdateTime));
- }
-
- if (Number.class.isInstance(value) && Number.class.isInstance(lastValue)) {
- double val = ((Number) value).doubleValue();
- double lastVal = ((Number) lastValue).doubleValue();
-
- wireValues.put(WireConstants.WIREVALUE_DELTA_ABSOLUTE, new Double(Math.abs(val - lastVal)));
- // #3328
- wireValues.put(WireConstants.WIREVALUE_DELTA_RELATIVE, new Double(Math.abs(1 - lastVal / val)));
- } else {
- wireValues.remove(WireConstants.WIREVALUE_DELTA_ABSOLUTE);
- wireValues.remove(WireConstants.WIREVALUE_DELTA_RELATIVE);
- }
-
- if (!filter.match(wireValues)) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10012, filter + " / " + value, null, false);
- }
- return;
- }
- }
-
- if (consumer != null) {
- try {
- consumer.updated(this, value);
- } catch (Throwable t) {
- parent.notifyListeners(this, WireAdminEvent.CONSUMER_EXCEPTION, t);
- return;
- }
- lastValue = value;
- lastUpdateTime = System.currentTimeMillis();
- parent.notifyListeners(this, WireAdminEvent.WIRE_TRACE, null);
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#poll()
- */
- public synchronized Object poll() {
- Object value = null;
- if (isConnected() && interoperate) {
- try {
- value = producer.polled(this);
- } catch (Throwable t) {
- // no exception in the Producer must prevent correct Wire
- // functioning
- parent.notifyListeners(this, WireAdminEvent.PRODUCER_EXCEPTION, t);
- return null;
- }
- parent.notifyListeners(this, WireAdminEvent.WIRE_TRACE, null);
- if (!isAcceptable(value) && (!(value instanceof Envelope[]))) {
- value = null;
- }
- }
-
- if (value != null) {
- lastValue = value;
- if (value instanceof Envelope[]) {
-
- if (allAccepted) {
- return value;
- }
- Envelope[] envs = (Envelope[]) value;
- if (scope == null) {
- return value;
- }
-
- if (envelopes == null) {
- envelopes = new Vector(envs.length);
- }
- boolean changed = false;
- for (int i = 0; i < envs.length; i++) {
- if (hasScope(envs[i].getScope())) {
- envelopes.addElement(envs[i]);
- } else {
- changed = true;
- }
- }
-
- if (changed) {
- value = new Envelope[envelopes.size()];
- envelopes.copyInto((Envelope[]) value);
- envelopes.removeAllElements();
- }
- }
- }
- return value;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#isConnected()
- */
- public boolean isConnected() {
- return isValid && (consumerRef != null) && (producerRef != null);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#getScope()
- */
- public synchronized String[] getScope() {
- return scope;
- }
-
- private void setScope() {
- if ((producerRef == null) || (consumerRef == null)) {
- return;
- }
-
- Vector prodScope = checkPermission((String[]) producerRef.getProperty(WireConstants.WIREADMIN_PRODUCER_SCOPE), WirePermission.PRODUCE, producerRef.getBundle());
-
- Vector consScope = checkPermission((String[]) consumerRef.getProperty(WireConstants.WIREADMIN_CONSUMER_SCOPE), WirePermission.CONSUME, consumerRef.getBundle());
-
- if ((prodScope == null) || (consScope == null)) {
- return;
- }
-
- if ((consScope.size() == 1) && consScope.elementAt(0).equals("*")) {
- scope = new String[prodScope.size()];
- prodScope.copyInto(scope);
- return;
- }
-
- if ((prodScope.size() != ((String[]) producerRef.getProperty(WireConstants.WIREADMIN_PRODUCER_SCOPE)).length) || (consScope.size() != ((String[]) consumerRef.getProperty(WireConstants.WIREADMIN_CONSUMER_SCOPE)).length)) {
- this.allAccepted = false;
- }
-
- Vector cloning = (Vector) prodScope.clone();
-
- for (Enumeration en = cloning.elements(); en.hasMoreElements();) {
- Object next = en.nextElement();
- if (!consScope.contains(next)) {
- prodScope.removeElement(next);
- this.allAccepted = false;
- }
- }
-
- scope = new String[prodScope.size()];
- prodScope.copyInto(scope);
- }
-
- private static Vector checkPermission(String[] scope, String action, Bundle b) {
- if (scope == null) {
- return null;
- }
-
- Vector v = new Vector();
- for (int i = 0; i < scope.length; i++) {
- WirePermission wp = new WirePermission(scope[i], action);
- if (b.hasPermission(wp)) {
- v.addElement(scope[i]);
- }
- }
- return v;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.Wire#hasScope(java.lang.String)
- */
- public boolean hasScope(String name) {
- if ((scope == null) || ((scope.length == 1) && scope[0].equals("*"))) {
- return true;
- }
-
- for (int i = 0; i < scope.length; i++) {
- if (name.equals(scope[i]) || scope[i].equals(WireConstants.WIREADMIN_SCOPE_ALL[0])) {
- return true;
- }
- }
- return false;
- }
-
- // Utility methods
- /**
- * Creates a string representation for this <code>Wire</code>
- *
- * @return a string representation of this object.
- */
- public String toString() {
- StringBuffer sb = new StringBuffer(100);
- sb.append("Wire[PID=");
- sb.append(properties.get(WireConstants.WIREADMIN_PID));
- sb.append(";prodPID=");
- sb.append(properties.get(WireConstants.WIREADMIN_PRODUCER_PID));
- sb.append(";consPID=");
- sb.append(properties.get(WireConstants.WIREADMIN_CONSUMER_PID));
- sb.append(";connected=");
- sb.append(isConnected());
- // sb.append(";valid=");
- // sb.append(isValid());
- // sb.append(";Scope={");
- // if (scope == null) {
- // sb.append("null");
- // } else {
- // for (int i = 0; i < scope.length; i++) {
- // sb.append(scope[i]);
- // if (i != scope.length - 2) {
- // sb.append(", ");
- // }
- // }
- // }
- sb.append("}]");
-
- return sb.toString();
- }
-
- /**
- * This method starts tracking of
- * <code>Producer</code> <code>Consumer</code>services associated with
- * this <code>Wire</code> object. First we check if there are already such
- * services started on the framework, after that two
- * <code>ServiceTracker</code> objects are created to handle
- * <code>Producer</code> and <code>Consumer</code> service tracking.
- */
- synchronized void start() {
- String producerPID = (String) properties.get(WireConstants.WIREADMIN_PRODUCER_PID);
- String consumerPID = (String) properties.get(WireConstants.WIREADMIN_CONSUMER_PID);
- updateListenerFilter();
- // check if there are such services already started
- ServiceReference ref = getSingleRef(Producer.class.getName(), producerPID);
-
- if (ref != null) {
- serviceRegistered(ref);
- }
-
- ref = getSingleRef(Consumer.class.getName(), consumerPID);
-
- if (ref != null) {
- serviceRegistered(ref);
- }
-
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10013, properties.get(WireConstants.WIREADMIN_PID).toString(), null, false);
- }
- }
-
- void updateListenerFilter() {
- String producerPID = escapeSpecialCharacters((String) properties.get(WireConstants.WIREADMIN_PRODUCER_PID));
- String consumerPID = escapeSpecialCharacters((String) properties.get(WireConstants.WIREADMIN_CONSUMER_PID));
-
- try {
- // Create filter for tracking services regstered as Consumer's with
- // the current
- // WIRE_CONSUMER_PID and as Producer's with current
- // WIRE_PRODUCER_PID
- // escaping *, ) and ( in the pid.
- StringBuffer sb = new StringBuffer();// "(");
- sb.append('(');
- sb.append('|');
-
- sb.append('(').append('&');
- sb.append('(').append(Constants.SERVICE_PID).append('=').append(consumerPID).append(')');
- sb.append('(').append(Constants.OBJECTCLASS).append('=').append(Consumer.class.getName()).append(')');
- sb.append(')');
-
- sb.append('(').append('&');
- sb.append('(').append(Constants.SERVICE_PID).append('=').append(producerPID).append(')');
- sb.append('(').append(Constants.OBJECTCLASS).append('=').append(Producer.class.getName()).append(')');
- sb.append(')');
-
- if (consumerRef != null) {// in case service.pid changes
- Long id = (Long) consumerRef.getProperty(Constants.SERVICE_ID);
- sb.append('(').append(Constants.SERVICE_ID).append('=').append(id).append(')');
- }
-
- if (producerRef != null) {// in case service.pid changes
- Long id = (Long) producerRef.getProperty(Constants.SERVICE_ID);
- sb.append('(').append(Constants.SERVICE_ID).append('=').append(id).append(')');
- }
-
- sb.append(')');
-
- // System.out.println("Filter is: " + sb.toString());
-
- bc.addServiceListener(this, sb.toString());
- } catch (InvalidSyntaxException ise) {
- /* Syntax is valid */
- }
-
- }
-
- private ServiceReference getSingleRef(String clazz, String pid) {
- ServiceReference[] ref = null;
-
- try {
- ref = bc.getServiceReferences(clazz, "(" + Constants.SERVICE_PID + "=" + escapeSpecialCharacters(pid) + ")");
- } catch (InvalidSyntaxException e) {
- }
-
- if (ref != null) {
- if (ref.length > 1) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(Activator.PREFIX + "Found more than one " + clazz + " services registered with the same pid: " + pid + "Wire was not created, please unregister all services which duplicate the pid.", null);
- }
-
- parent.deleteWire(this);
- } else if (ref.length == 1) {
- return ref[0];
- }
- }
- return null;
- }
-
- /**
- * Stops service tracking, removes this <code>Wire</code> from the wire
- * lists of the associated Consumer and Producer services and informs them
- * for disconnecting.
- */
- synchronized void stop() {
- if (!isValid)
- return; // already stopped
-
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10014, this.toString(), null, false);
- }
- bc.removeServiceListener(this);
- if ((producerRef != null) && (consumerRef != null)) {
- // if this wire was connected
- isValid = false;
- informServices();
- }
- isValid = false;
-
- if (producerRef != null) {
- bc.ungetService(producerRef);
- }
- if (consumerRef != null) {
- bc.ungetService(consumerRef);
- }
-
- // let gc do his work
- producerRef = null;
- consumerRef = null;
-
- producer = null;
- consumer = null;
-
- lastValue = null;
- parent = null;
- filter = null;
- wireValues = null;
- scope = null;
- bc = null;
- }
-
- /**
- * This method is invoked when the Wiring tracker detects a service
- * registration or when the Wire is created The service type is determined
- * (Producer or Consumer) and added to this <code>Wire</code>. Both
- * Consumer and Producer (if available) are informed for connecting.
- *
- * @param sRef
- * the service reference of the wire's producer or consumer
- * @param notifyService
- * specifies whether notification of the Producer/Consumer is
- * necessary if it is the only one available part.
- */
- private void serviceRegistered(ServiceReference sRef) {
- String pid = (String) sRef.getProperty(Constants.SERVICE_PID);
-
- if (pid.equals(properties.get(WireConstants.WIREADMIN_PRODUCER_PID))) {
- if (producerRef == null) {
- this.producerRef = sRef;
- this.producer = (Producer) bc.getService(producerRef);
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(Activator.PREFIX + "Wire " + properties.get(WireConstants.WIREADMIN_PID) + " detected producer " + pid, null);
- }
- } else
- return;
- } else {
- if (consumerRef == null) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(Activator.PREFIX + "Wire " + properties.get(WireConstants.WIREADMIN_PID) + " detected consumer " + pid, null);
- }
- this.consumerRef = sRef;
- this.consumer = (Consumer) bc.getService(consumerRef);
- try {
- this.flavors = (Class[]) consumerRef.getProperty(WireConstants.WIREADMIN_CONSUMER_FLAVORS);
- } catch (ClassCastException cce) {
- /* won't be initialized */
- }
- } else
- return;
- }
-
- if (isConnected()) {
- // inform the Producer/Consumer for connecting
- setScope();
- informServices();
- parent.notifyListeners(this, WireAdminEvent.WIRE_CONNECTED, null);
- checkInteroperability();
- } else if (!parent.hasAConnectedWire(pid.equals(properties.get(WireConstants.WIREADMIN_PRODUCER_PID)), pid)) {
- // this service has no connected wire objects attached to it
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10015, pid, null, false);
- }
- // if (notifyService) { // The service is notified if it is only
- // just registered
- // informServices();
- // }
- }
-
- updateListenerFilter();
- checkWireFilter();
- }
-
- private void checkWireFilter() {
- boolean performFiltering = ((producerRef != null) && producerRef.getProperty(WireConstants.WIREADMIN_PRODUCER_FILTERS) == null) && (properties.get(WireConstants.WIREADMIN_FILTER) != null);
-
- if (performFiltering) {
- if ((wireValues == null)) {
- wireValues = new Hashtable(6, 1.0f);
- }
-
- try {
- filter = bc.createFilter((String) properties.get(WireConstants.WIREADMIN_FILTER));
- } catch (InvalidSyntaxException ise) {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(Activator.PREFIX + "Filter syntax is invalid, filtering won't be made", null);
- }
- }
- } else {
- filter = null;
- }
- }
-
- private void serviceModified(ServiceReference sRef) { // fix #1073
- String pid = (String) sRef.getProperty(Constants.SERVICE_PID);
-
- if (sRef.equals(producerRef)) {
- String currentPID = (String) properties.get(WireConstants.WIREADMIN_PRODUCER_PID);
-
- if (!currentPID.equals(pid)) {
- // System.out.println("The pid of the PRODUCER is changed");
- serviceUnregistered(sRef);
- return;
- }
- }
-
- if (sRef.equals(consumerRef)) {
- String currentPID = (String) properties.get(WireConstants.WIREADMIN_CONSUMER_PID);
-
- if (!currentPID.equals(pid)) {
- serviceUnregistered(sRef);
- // System.out.println("The pid of the CONSUMER is changed");
- return;
- }
- try {
- this.flavors = (Class[]) consumerRef.getProperty(WireConstants.WIREADMIN_CONSUMER_FLAVORS);
- } catch (ClassCastException cce) {
- /* won't be initialized */
- }
- }
-
- if (producerRef == null || consumerRef == null) {
- // System.out.println("Check if PID is BACK");
- serviceRegistered(sRef);
- return;
- }
-
- if (!isConnected()) {
- return;
- }
-
- setScope();
- checkInteroperability();
- checkWireFilter();
- }
-
- private void checkInteroperability() {
- String[] p = (String[]) producerRef.getProperty(WireConstants.WIREADMIN_PRODUCER_COMPOSITE);
- String[] c = (String[]) consumerRef.getProperty(WireConstants.WIREADMIN_CONSUMER_COMPOSITE);
-
- if ((p != null) && (c != null)) {
- for (int i = 0; i < p.length; i++) {
- for (int j = 0; j < c.length; j++) {
- if (p[i].equals(c[j])) {
- // found at least one match
- interoperate = true;
- return;
- }
- }
- }
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(0, 10016, this.toString(), null, false);
- }
- interoperate = false;
- } else {
- interoperate = true;
- }
- }
-
- private void serviceUnregistered(ServiceReference sRef) {
- boolean lastStatus = isConnected();
-
- if (sRef.equals(producerRef)) {
- this.producerRef = null;
- this.producer = null;
- } else if (sRef.equals(consumerRef)) {
- this.consumerRef = null;
- this.consumer = null;
- this.flavors = null;
- } else {
- if (Activator.LOG_DEBUG) {
- Activator.log.debug(Activator.PREFIX + "Unregistering another consumer with the same pid, ignoring it ...", null);
- }
- return;
- }
-
- updateListenerFilter();
-
- if (lastStatus) {
- // last wire state was connected - now it is disconnected
- informServices();
- parent.notifyListeners(this, WireAdminEvent.WIRE_DISCONNECTED, null);
- }
- if (bc != null) {
- bc.ungetService(sRef);
- }
-
- }
-
- /**
- * This method checks if the given String contains one of the characters *, (,
- * and ) which have a special meaning for the LDAP search filters. If there
- * are such characters they are escaped with the backslash character ('\').
- */
- static String escapeSpecialCharacters(String s) {
- char[] content = s.toCharArray();
- StringBuffer result = new StringBuffer(s);
- int offset = 0;
-
- for (int i = 0; i < content.length; i++) {
- if ((content[i] == 40) || (content[i] == 41) || (content[i] == 42)) {
- result.insert(i + offset, "\\"); // fix #1078
- offset++;
- }
- }
- return result.toString();
- }
-
- /**
- * Change the properties of this wire. If the changes concern one of the
- * properties WIRE_PRODUCER_PID and WIRE_CONSUMER_PID this wire must be
- * stopped and started again to begin tracking of the new Services.
- */
- void setProperties(Dictionary newProps) {
- if (newProps != null) {
- String newConsPID = (String) newProps.get(WireConstants.WIREADMIN_CONSUMER_PID);
- String newProdPID = (String) newProps.get(WireConstants.WIREADMIN_PRODUCER_PID);
-
- String oldConsPID = (String) properties.get(WireConstants.WIREADMIN_CONSUMER_PID);
- String oldProdPID = (String) properties.get(WireConstants.WIREADMIN_PRODUCER_PID);
-
- boolean restart = false;
-
- if (newConsPID == null) {
- newProps.put(WireConstants.WIREADMIN_CONSUMER_PID, oldConsPID);
- } else if (!newConsPID.equals(oldConsPID)) {
- restart = true;
- }
-
- if (newProdPID == null) {
- newProps.put(WireConstants.WIREADMIN_PRODUCER_PID, oldProdPID);
- } else if (!newProdPID.equals(oldProdPID)) {
- restart = true;
- }
- // fix #1074
- if (newProps.get(WireConstants.WIREADMIN_PID) == null) {
- newProps.put(WireConstants.WIREADMIN_PID, properties.get(WireConstants.WIREADMIN_PID));
- }
-
- // WireProperties wprops = new WireProperties();
- properties.clear();
-
- for (Enumeration en = newProps.keys(); en.hasMoreElements();) {
- Object key = en.nextElement();
- properties.put0(key, newProps.get(key));
- }
-
- checkWireFilter();
-
- if (restart) {
- // One of the Consumer or Producer has been changed so restart
- // the wire
- stop();
- start();
- return;
- }
- }
-
- if (isConnected()) {
- informServices();
- }
-
- parent.notifyListeners(this, WireAdminEvent.WIRE_UPDATED, null);
- }
-
- private boolean isAcceptable(Object value) {
- Class[] flavors = getFlavors();
-
- if (flavors == null) {
- return true;
- }
-
- for (int i = 0; i < flavors.length; i++) {
- if (flavors[i].isInstance(value)) {
- return true;
- }
- }
- return false;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
- */
- public void serviceChanged(ServiceEvent evt) {
- if (bc == null) {
- return;
- }
- switch (evt.getType()) {
- case ServiceEvent.REGISTERED :
- // System.out.println("E V E N T : registered");
- serviceRegistered(evt.getServiceReference());
- break;
-
- case ServiceEvent.UNREGISTERING :
- // System.out.println("E V E N T : unregistering");
- serviceUnregistered(evt.getServiceReference());
- break;
-
- case ServiceEvent.MODIFIED :
- // System.out.println("E V E N T : modified");
- serviceModified(evt.getServiceReference());
- }
- }
-
- String getWirePID() {
- return (String) properties.get(WireConstants.WIREADMIN_PID);
- }
-
- /**
- * This method simply informs both Producer and Consumer with the methods
- * consumersConnected, producersConnected if a wire bacames connected and
- * the remaining service if the wire becames disconnected.
- */
- private void informServices() {
- if (producerRef != null) {
- String producerPID = (String) properties.get(WireConstants.WIREADMIN_PRODUCER_PID);
- NotificationEvent ne = new NotificationEvent(producer, null, this, parent.getConnected(WireConstants.WIREADMIN_PRODUCER_PID, producerPID));
- parent.notifyConsumerProducer(ne);
-
- // try {
- // producer.consumersConnected(parent.getConnected(WireConstants.WIREADMIN_PRODUCER_PID,
- // producerPID));
- // } catch (Exception ex) {
- // parent.notifyListeners(this, WireAdminEvent.PRODUCER_EXCEPTION ,
- // ex);
- // }
- }
-
- if (consumerRef != null) {
- String consumerPID = (String) properties.get(WireConstants.WIREADMIN_CONSUMER_PID);
- NotificationEvent ne = new NotificationEvent(null, consumer, this, parent.getConnected(WireConstants.WIREADMIN_CONSUMER_PID, consumerPID));
- parent.notifyConsumerProducer(ne);
-
- // try {
- // consumer.producersConnected(parent.getConnected(WireConstants.WIREADMIN_CONSUMER_PID,
- // consumerPID));
- // } catch (Exception ex) {
- // parent.notifyListeners(this, WireAdminEvent.CONSUMER_EXCEPTION ,
- // ex);
- // }
- }
- }
-
-}
diff --git a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireProperties.java b/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireProperties.java
deleted file mode 100644
index b5f6115bc..000000000
--- a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireProperties.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2007 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.wireadmin;
-
-import java.util.Hashtable;
-
-/**
- * @author Pavlin Dobrev
- * @version 1.0
- */
-
-class WireProperties extends Hashtable {
-
- static final long serialVersionUID = -8836718065933570367L;
-
- public synchronized Object put(Object key, Object value) {
- throw new RuntimeException("Unsupported operation");
- }
-
- public synchronized Object remove(Object key) {
- throw new RuntimeException("Unsupported operation");
- }
-
- Object put0(Object key, Object value) {
- return super.put(key, value);
- }
-
- Object remove0(Object key) {
- return super.remove(key);
- }
-}
diff --git a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireReDispatcher.java b/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireReDispatcher.java
deleted file mode 100644
index 659d3e83b..000000000
--- a/bundles/org.eclipse.equinox.wireadmin/src/org/eclipse/equinox/internal/wireadmin/WireReDispatcher.java
+++ /dev/null
@@ -1,317 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 1997-2009 by ProSyst Software GmbH
- * http://www.prosyst.com
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * ProSyst Software GmbH - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.wireadmin;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.Dictionary;
-import java.util.Hashtable;
-import org.eclipse.equinox.internal.util.ref.Log;
-import org.osgi.framework.*;
-import org.osgi.service.event.*;
-import org.osgi.service.wireadmin.*;
-import org.osgi.util.tracker.ServiceTracker;
-
-/**
- * This is an implementation of log events redispatching.
- *
- * /**
- *
- * @author Pavlin Dobrev
- * @version 1.0
- */
-public class WireReDispatcher implements WireAdminListener {
-
- static final String BUNDLE = "bundle";
- static final String BUNDLE_ID = "bundle.id";
- static final String BUNDLE_SYMBOLICNAME = "bundle.symbolicName";
- static final String EVENT = "event";
- static final String EXCEPTION = "exception";
- static final String EXCEPTION_CLASS = "exception.class";
- static final String EXCEPTION_MESSAGE = "exception.message";
- static final String SERVICE = "service";
- static final String SERVICE_ID = "service.id";
- static final String SERVICE_OBJECTCLASS = "service.objectClass";
- static final String SERVICE_PID = "service.pid";
- static final char TOPIC_SEPARATOR = '/';
- /* ///////WIRE ADMIN EVENTS////////// */
- static final String WIRE_HEADER = "org/osgi/service/wireadmin/WireAdminEvent";
- static final String WIRE_CREATED = "WIRE_CREATED";
- static final String WIRE_CONNECTED = "WIRE_CONNECTED";
- static final String WIRE_UPDATED = "WIRE_UPDATED";
- static final String WIRE_TRACE = "WIRE_TRACE";
- static final String WIRE_DISCONNECTED = "WIRE_DISCONNECTED";
- static final String WIRE_DELETED = "WIRE_DELETED";
- static final String PRODUCER_EXCEPTION = "PRODUCER_EXCEPTION";
- static final String CONSUMER_EXCEPTION = "CONSUMER_EXCEPTION";
- static final String WIRE_ENTRY = "wire.entry";
- static final String WA_WIRE = "wire";
- static final String WA_WIRE_FLAVORS = "wire.flavors";
- static final String WA_WIRE_SCOPE = "wire.scope";
- static final String WA_WIRE_CONNECTED = "wire.connected";
- static final String WA_WIRE_VALID = "wire.valid";
-
- BundleContext bc;
- ServiceRegistration waReg;
- Log log;
- ServiceTracker eventAdminTracker;
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(BundleContext bc) throws Exception {
- this.bc = bc;
- log = new Log(bc, false);
- log.setDebug(Activator.getBoolean("equinox.wireadmin.redispatcher.debug"));
- log.setPrintOnConsole(Activator.getBoolean("equinox.wireadmin.redispatcher.console"));
-
- Hashtable props = new Hashtable(3);
- props.put(WireConstants.WIREADMIN_EVENTS, new Integer(Integer.MAX_VALUE));
- waReg = bc.registerService(WireAdminListener.class.getName(), this, props);
-
- eventAdminTracker = new ServiceTracker(bc, EventAdmin.class.getName(), null);
- eventAdminTracker.open();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop() throws Exception {
- if (eventAdminTracker != null) {
- eventAdminTracker.close();
- eventAdminTracker = null;
- }
- if (waReg != null) {
- waReg.unregister();
- waReg = null;
- }
- log.close();
- this.bc = null;
- }
-
- /* ////////UTILITY METHODS//////// */
-
- /*
- * Add exception properties needed in event by EventAdmin specification.
- */
- void addExceptionProps(Hashtable props, Throwable t) {
- props.put(EXCEPTION, t);
- props.put(EXCEPTION_CLASS, t.getClass().getName());
- String message = t.getMessage();
- if (message != null) {
- props.put(EXCEPTION_MESSAGE, t.getMessage());
- }
- }
-
- /*
- * Add service properties needed in event by EventAdmin specification.
- */
- void addServiceProps(Hashtable props, ServiceReference ref) {
- props.put(SERVICE, ref);
- props.put(SERVICE_ID, ref.getProperty(Constants.SERVICE_ID));
- Object tmp = ref.getProperty(Constants.SERVICE_PID);
- if (tmp != null && tmp instanceof String) {
- props.put(SERVICE_PID, tmp);
- }
- tmp = ref.getProperty(Constants.OBJECTCLASS);
- if (tmp != null && tmp instanceof String[]) {
- props.put(SERVICE_OBJECTCLASS, tmp);
- }
- }
-
- /* ////////LISTENER METHODS//////// */
-
- /*
- * (non-Javadoc)
- *
- * @see org.osgi.service.wireadmin.WireAdminListener#wireAdminEvent(org.osgi.service.wireadmin.WireAdminEvent)
- */
- public void wireAdminEvent(WireAdminEvent event) {
- ServiceTracker st = eventAdminTracker;
- final EventAdmin eventAdmin = st == null ? null : ((EventAdmin) st.getService());
- if (eventAdmin != null) {
- ServiceReference ref = event.getServiceReference();
- if (ref == null) {
- throw new RuntimeException("Wire Admin ServiceReference is null");
- }
- String topicSuffix = null;
- switch (event.getType()) {
- case WireAdminEvent.WIRE_CREATED :
- topicSuffix = WIRE_CREATED;
- break;
- case WireAdminEvent.WIRE_CONNECTED :
- topicSuffix = WIRE_CONNECTED;
- break;
- case WireAdminEvent.WIRE_UPDATED :
- topicSuffix = WIRE_UPDATED;
- break;
- case WireAdminEvent.WIRE_TRACE :
- topicSuffix = WIRE_TRACE;
- break;
- case WireAdminEvent.WIRE_DISCONNECTED :
- topicSuffix = WIRE_DISCONNECTED;
- break;
- case WireAdminEvent.WIRE_DELETED :
- topicSuffix = WIRE_DELETED;
- break;
- case WireAdminEvent.PRODUCER_EXCEPTION :
- topicSuffix = PRODUCER_EXCEPTION;
- break;
- case WireAdminEvent.CONSUMER_EXCEPTION :
- topicSuffix = CONSUMER_EXCEPTION;
- break;
- default : /* ignore: unknown/new events */
- return;
- }
- String topic = WIRE_HEADER + TOPIC_SEPARATOR + topicSuffix;
- if (!hasServiceReferences(topic)) {
- if (Activator.LOG_DEBUG)
- log.debug(0, 10017, event.toString(), null, false);
- return; /*
- * no service references for this topic do not bother
- * EventAdmin
- */
- }
- Hashtable props = new Hashtable();
- addServiceProps(props, ref);
- Wire wire = event.getWire();
- if (wire != null) {
- props.put(WA_WIRE, wire);
- props.put(WA_WIRE_CONNECTED, new Boolean(wire.isConnected()));
- if (wire.getFlavors() != null) {
- props.put(WA_WIRE_FLAVORS, wire.getFlavors());
- }
- if (wire.getScope() != null) {
- props.put(WA_WIRE_SCOPE, wire.getScope());
- }
- props.put(WA_WIRE_VALID, new Boolean(wire.isValid()));
- }
- Throwable throwable = event.getThrowable();
- if (throwable != null) {
- addExceptionProps(props, throwable);
- }
- props.put(EVENT, event);
- final Event eaEvent = new Event(topic, (Dictionary) props);
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- eventAdmin.postEvent(eaEvent);
- return null;
- }
- });
- if (Activator.LOG_DEBUG)
- log.debug(0, 10018, event.toString(), null, false);
- }
- }
-
- /**
- * This will return true if has at least one ServiceReference which match
- * given topic.
- *
- * @param topic
- * @return
- */
- protected boolean hasServiceReferences(String topic) {
- BundleContext l_bc = bc;
- if (l_bc == null) {
- return false;
- }
- ServiceReference[] sr = null;
- try {/* get all handlers */
- sr = l_bc.getServiceReferences(EventHandler.class.getName(), null);
- } catch (InvalidSyntaxException e) {
- return false;
- }
- if (sr != null && sr.length > 0) {
- TopicPermission perm = new TopicPermission(topic, TopicPermission.SUBSCRIBE);
- for (int i = 0; i < sr.length; i++) {
- try {
- ServiceReference sRef = sr[i];
- Bundle bundle = sRef.getBundle();
- if (bundle != null && (bundle.getState() != Bundle.UNINSTALLED) && bundle.hasPermission(perm)) {
- Object reftopic = sRef.getProperty(EventConstants.EVENT_TOPIC);
- if (reftopic != null) { /*
- * otherwise means will receive
- * no events
- */
- if (reftopic instanceof String[]) { /*
- * even with one
- * element it
- * must be
- * String[]
- */
- String topics[] = (String[]) reftopic;
- for (int j = 0; j < topics.length; j++) {
- if (matchTopic(topics[j], topic)) {
- return true;
- }
- }
- }
- }
- }/* check permission */
- } catch (Throwable t) {
- log.error("Error while checking bundle permissions", t);
- }
- }/* for */
- }/* sr != null && sr.length > 0 */
- return false;
- }
-
- /**
- * Checks if a topic filter string matches the target topic string.
- *
- * @param pattern
- * A topic filter like "company/product/*"
- * @param topic
- * Target topic to be checked against like
- * "company/product/topicA"
- * @return true if topicProperty matches topic, false if otherwise.
- */
- protected static boolean matchTopic(String pattern, String topic) {
- // //two fast checks
- if (pattern.length() > topic.length())
- return false;
- if ("*".equals(pattern) || pattern.equals(topic))
- return true;
-
- // //assume pattern is not NULL ... or check!
- int index = pattern.indexOf(TOPIC_SEPARATOR);
- if (index == -1 || index == 0 || index == pattern.length() - 1) {
- // //syntax problem
- // //we have no '/' or starts with '/' or ends with '/'
- return false;
- }
-
- for (index = 0; index < pattern.length(); index++) {
- if (pattern.charAt(index) == '*') {
- // //wildcard!!!
- if (pattern.charAt(index - 1) != TOPIC_SEPARATOR)
- return false; // we have not '/' before '*'
- if (index != pattern.length() - 1)
- return false; // we have something after the '*'
- return true;
- }
- if (pattern.charAt(index) != topic.charAt(index))
- return false;
- }
-
- if (index != topic.length())
- return false;
- if (pattern.charAt(index - 1) == TOPIC_SEPARATOR)
- return false;
- return true;
- }
-
-}

Back to the top