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
}