added synchronized

git-svn-id: https://svn.apache.org/repos/asf/incubator/felix/trunk@474087 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/upnp.sample.clock/src/main/java/org/apache/felix/upnp/sample/clock/UPnPEventNotifier.java b/upnp.sample.clock/src/main/java/org/apache/felix/upnp/sample/clock/UPnPEventNotifier.java
index b9eaeb8..38abef5 100644
--- a/upnp.sample.clock/src/main/java/org/apache/felix/upnp/sample/clock/UPnPEventNotifier.java
+++ b/upnp.sample.clock/src/main/java/org/apache/felix/upnp/sample/clock/UPnPEventNotifier.java
@@ -42,15 +42,16 @@
 */

 

 public class UPnPEventNotifier implements PropertyChangeListener,ServiceListener {

-	BundleContext context;

-	UPnPDevice device;

-	UPnPService service;

-	EventSource source;

+	private BundleContext context;

+	private UPnPDevice device;

+	private UPnPService service;

+	private EventSource source;

 	

-	Properties UPnPTargetListener;

-	String deviceId;

-	String serviceId;

-	Vector upnpListeners = new Vector();

+	private Properties UPnPTargetListener;

+	private String deviceId;

+	private String serviceId;

+	private Vector upnpListeners = new Vector();

+	final private Object LOCK = new Object();

 	

 	public UPnPEventNotifier(BundleContext context,UPnPDevice device,UPnPService service,EventSource source){

 		this.context=context;

@@ -74,32 +75,35 @@
 		UPnPTargetListener.put(UPnPService.TYPE,service.getType());

 		String ANY_UPnPEventListener = "("+Constants.OBJECTCLASS+"="+UPnPEventListener.class.getName()+")";

 		

-		ServiceReference[] listeners = null; 

-		try {

-			listeners = context.getServiceReferences(UPnPEventListener.class.getName(),null);

-			if (listeners != null){

-				for (int i = 0;i<listeners.length;i++){

-					ServiceReference sr = listeners[i];

-					Filter filter = (Filter) sr.getProperty(UPnPEventListener.UPNP_FILTER);

-					if (filter == null) upnpListeners.add(sr);

-					else {				

-						if (filter.match(UPnPTargetListener))

-							addNewListener(sr);

+		synchronized (LOCK) {

+		    try {

+		    	String filter = ANY_UPnPEventListener;

+				context.addServiceListener(this,filter);

+			} catch (Exception ex) {

+				System.out.println(ex);

+			}

+			

+			

+			ServiceReference[] listeners = null; 

+			try {

+				listeners = context.getServiceReferences(UPnPEventListener.class.getName(),null);

+				if (listeners != null){

+					for (int i = 0;i<listeners.length;i++){

+						ServiceReference sr = listeners[i];

+						Filter filter = (Filter) sr.getProperty(UPnPEventListener.UPNP_FILTER);

+						if (filter == null) upnpListeners.add(sr);

+						else {				

+							if (filter.match(UPnPTargetListener))

+								addNewListener(sr);

+						}

 					}

 				}

+			} catch (Exception ex) {

+				System.out.println(ex);

 			}

-		} catch (Exception ex) {

-			System.out.println(ex);

-		}

 		

-	    try {

-	    	//String filter = "(&" + ANY_UPnPEventListener + deviceId_Filter + ")";

-	    	String filter = ANY_UPnPEventListener;

-			context.addServiceListener(this,filter);

-		} catch (Exception ex) {

-			System.out.println(ex);

 		}

-		

+

 		if (source!=null){

 			UPnPStateVariable[] vars = service.getStateVariables();

 			if (vars != null){

@@ -116,30 +120,34 @@
 	 * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)

 	 */

 	public void propertyChange(PropertyChangeEvent evt) {

-		Iterator list = upnpListeners.iterator();

-		String property = evt.getPropertyName();

-		Object value = evt.getNewValue();

-		String valueString = value.toString();

-		final Properties events = new Properties();

-		events.put(property,valueString);

-		while (list.hasNext()){

-			final ServiceReference sr = (ServiceReference)list.next();

-			String[] props =sr.getPropertyKeys();

-			new Thread(){

-				public void run(){

-					try {

-						UPnPEventListener listener = (UPnPEventListener) context.getService(sr);

-						listener.notifyUPnPEvent(deviceId,serviceId,events);

-						context.ungetService(sr);

-					} catch (Exception ex){

-						System.out.println("Clock UPnPEventNotifier Err: " +ex);

-						System.out.println("context: " +context);

-						System.out.println("listener: " +context.getService(sr));

-						System.out.println("sr: " +sr);

-						System.out.println();

+		

+		synchronized (LOCK) {

+			

+			Iterator list = upnpListeners.iterator();

+			String property = evt.getPropertyName();

+			Object value = evt.getNewValue();

+			String valueString = value.toString();

+			final Properties events = new Properties();

+			events.put(property,valueString);

+			while (list.hasNext()){

+				final ServiceReference sr = (ServiceReference)list.next();

+				String[] props =sr.getPropertyKeys();

+				new Thread(){

+					public void run(){

+						try {

+							UPnPEventListener listener = (UPnPEventListener) context.getService(sr);

+							listener.notifyUPnPEvent(deviceId,serviceId,events);

+							context.ungetService(sr);

+						} catch (Exception ex){

+							System.out.println("Clock UPnPEventNotifier Err: " +ex);

+							System.out.println("context: " +context);

+							System.out.println("listener: " +context.getService(sr));

+							System.out.println("sr: " +sr);

+							System.out.println();

+						}

 					}

-				}

-			}.start();						

+				}.start();						

+			}

 		}

 	}

 

@@ -147,34 +155,34 @@
 	 * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)

 	 */

 	public void serviceChanged(ServiceEvent e) {

-		switch(e.getType()){

-			case ServiceEvent.REGISTERED:{

-				ServiceReference sr = e.getServiceReference();

-				Filter filter = (Filter) sr.getProperty(UPnPEventListener.UPNP_FILTER);

-				if (filter == null) addNewListener(sr);

-				else {				

-					if (filter.match(UPnPTargetListener))

-						addNewListener(sr);

-				}

-			};break;

-			

-			case ServiceEvent.MODIFIED:{				

-	               ServiceReference sr = e.getServiceReference();

-	               Filter filter = (Filter)	sr.getProperty(UPnPEventListener.UPNP_FILTER);

-	               removeListener(sr);

-	               if (filter == null)

-	                   addNewListener(sr);

-	               else {

-	                   if (filter.match(UPnPTargetListener))

-	                       addNewListener(sr);

-	               }

-			};break;

-			

-			case ServiceEvent.UNREGISTERING:{	

-				removeListener(e.getServiceReference());

-			};break;

+		ServiceReference sr = e.getServiceReference();		

+		synchronized (LOCK) {			

+			switch(e.getType()){

+				case ServiceEvent.REGISTERED:{

+					Filter filter = (Filter) sr.getProperty(UPnPEventListener.UPNP_FILTER);

+					if (filter == null) addNewListener(sr);

+					else {				

+						if (filter.match(UPnPTargetListener))

+							addNewListener(sr);

+					}

+				};break;

 				

-		}

+				case ServiceEvent.MODIFIED:{				

+		               Filter filter = (Filter)	sr.getProperty(UPnPEventListener.UPNP_FILTER);

+		               removeListener(sr);

+		               if (filter == null)

+		                   addNewListener(sr);

+		               else {

+		                   if (filter.match(UPnPTargetListener))

+		                       addNewListener(sr);

+		               }

+				};break;

+				

+				case ServiceEvent.UNREGISTERING:{	

+					removeListener(sr);

+				};break;					

+			}

+		}//end LOCK

 		

 	}