Author: rwesten
Date: Fri Apr 18 12:08:20 2014
New Revision: 1588453

URL: http://svn.apache.org/r1588453
Log:
STANBOL-1322: merged change to the ServiceTracker initialization to trunk

Modified:
    stanbol/trunk/enhancer/   (props changed)
    
stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeParserRegistry.java
    
stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeSerializerRegistry.java

Propchange: stanbol/trunk/enhancer/
------------------------------------------------------------------------------
  Merged /stanbol/branches/release-0.12/enhancer:r1588449

Modified: 
stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeParserRegistry.java
URL: 
http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeParserRegistry.java?rev=1588453&r1=1588452&r2=1588453&view=diff
==============================================================================
--- 
stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeParserRegistry.java
 (original)
+++ 
stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeParserRegistry.java
 Fri Apr 18 12:08:20 2014
@@ -82,18 +82,37 @@ public class ValueTypeParserRegistry {
         if(!inOsgi && valueTypeParsers == null){
             initValueTypeParser(); //running outside OSGI
         }
-        parserLock.readLock().lock();
-        try {
-            if(!inOsgi){
+        if(!inOsgi){
+            parserLock.readLock().lock();
+            try {
                 return (ValueTypeParser<T>)valueTypeParsers.get(type);
-            } else {
+            } finally {
+                parserLock.readLock().unlock();
+            }
+        } else {
+            ServiceTracker parserTracker = this.parserTracker;
+            //check if we need to lazily open the ServiceTracker
+            if(valueTypeParserRefs == null && parserTracker != null){
+                synchronized (parserTracker) {
+                    if(valueTypeParserRefs == null){ 
+                        valueTypeParserRefs = new 
HashMap<Class<?>,List<ServiceReference>>();
+                        //NOTE: do not open within activate(..) because of
+                        //  org.apache.stanbol.enhancer.nlp.json 
FrameworkEvent 
+                        //  ERROR (org.osgi.framework.ServiceException: 
+                        //  ServiceFactory.getService() resulted in a cycle.) 
+                        parserTracker.open();
+                    }
+                }
+            }
+            parserLock.readLock().lock();
+            try {
                 List<ServiceReference> refs = valueTypeParserRefs.get(type);
                 return refs == null || refs.isEmpty() ? null :
                     (ValueTypeParser<T>) parserTracker.getService(
                         refs.get(refs.size()-1));
+            } finally {
+                parserLock.readLock().unlock();
             }
-        } finally {
-            parserLock.readLock().unlock();
         }
     }
     
@@ -101,23 +120,31 @@ public class ValueTypeParserRegistry {
     protected void activate(ComponentContext ctx){
         inOsgi = true;
         final BundleContext bc = ctx.getBundleContext();
-        valueTypeParserRefs = new HashMap<Class<?>,List<ServiceReference>>();
         parserTracker = new ServiceTracker(bc, 
ValueTypeParser.class.getName(), 
             new ParserTracker(bc));
-        parserTracker.open();
+        //NOTE: do not open within activate(..) because of
+        //  org.apache.stanbol.enhancer.nlp.json FrameworkEvent 
+        //  ERROR (org.osgi.framework.ServiceException: 
+        //  ServiceFactory.getService() resulted in a cycle.) 
     }
     
     @Deactivate
     protected void deactivate(ComponentContext ctx){
         inOsgi = false;
-        parserTracker.close();
-        parserTracker = null;
+        if(parserTracker != null){
+            parserTracker.close();
+            parserTracker = null;
+        }
         parserLock.writeLock().lock();
         try {
             if(valueTypeParsers != null){
                 valueTypeParsers.clear();
                 valueTypeParsers = null;
             }
+            if(valueTypeParserRefs != null){
+                valueTypeParserRefs.clear();
+                valueTypeParserRefs = null;
+            }
         } finally {
             parserLock.writeLock().unlock();
         }

Modified: 
stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeSerializerRegistry.java
URL: 
http://svn.apache.org/viewvc/stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeSerializerRegistry.java?rev=1588453&r1=1588452&r2=1588453&view=diff
==============================================================================
--- 
stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeSerializerRegistry.java
 (original)
+++ 
stanbol/trunk/enhancer/generic/nlp-json/src/main/java/org/apache/stanbol/enhancer/nlp/json/valuetype/ValueTypeSerializerRegistry.java
 Fri Apr 18 12:08:20 2014
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -84,18 +85,37 @@ public class ValueTypeSerializerRegistry
         if(!inOsgi && valueTypeSerializers == null){
             initValueTypeSerializer(); //running outside OSGI
         }
-        serializerLock.readLock().lock();
-        try {
-            if(!inOsgi){
+        if(!inOsgi){
+            serializerLock.readLock().lock();
+            try {
                 return (ValueTypeSerializer<T>)valueTypeSerializers.get(type);
-            } else {
+            } finally {
+                serializerLock.readLock().unlock();
+            }
+        } else {
+            ServiceTracker serializerTracker = this.serializerTracker;
+            //check if we need to lazily open the ServiceTracker
+            if(valueTypeSerializerRefs == null && serializerTracker != null){
+                synchronized (serializerTracker) {
+                    if(valueTypeSerializerRefs == null){
+                        valueTypeSerializerRefs = new 
HashMap<Class<?>,List<ServiceReference>>();
+                        //NOTE: do not open within activate(..) because of
+                        //  org.apache.stanbol.enhancer.nlp.json 
FrameworkEvent 
+                        //  ERROR (org.osgi.framework.ServiceException: 
+                        //  ServiceFactory.getService() resulted in a cycle.) 
+                        serializerTracker.open();
+                    }
+                }
+            }
+            serializerLock.readLock().lock();
+            try {
                 List<ServiceReference> refs = 
valueTypeSerializerRefs.get(type);
                 return refs == null || refs.isEmpty() ? null :
                     (ValueTypeSerializer<T>) serializerTracker.getService(
                         refs.get(refs.size()-1));
+            } finally {
+                serializerLock.readLock().unlock();
             }
-        } finally {
-            serializerLock.readLock().unlock();
         }
     }
     
@@ -103,10 +123,13 @@ public class ValueTypeSerializerRegistry
     protected void activate(ComponentContext ctx){
         inOsgi = true;
         final BundleContext bc = ctx.getBundleContext();
-        valueTypeSerializerRefs = new 
HashMap<Class<?>,List<ServiceReference>>();
         serializerTracker = new ServiceTracker(bc, 
ValueTypeSerializer.class.getName(), 
             new SerializerTracker(bc));
-        serializerTracker.open();
+        //NOTE: do not open within activate(..) because of
+        //  org.apache.stanbol.enhancer.nlp.json FrameworkEvent 
+        //  ERROR (org.osgi.framework.ServiceException: 
+        //  ServiceFactory.getService() resulted in a cycle.) 
+        //serializerTracker.open();
     }
     
     @Deactivate
@@ -120,6 +143,10 @@ public class ValueTypeSerializerRegistry
                 valueTypeSerializers.clear();
                 valueTypeSerializers = null;
             }
+            if(valueTypeSerializerRefs != null){
+                valueTypeSerializerRefs.clear();
+                valueTypeSerializerRefs = null;
+            }
         } finally {
             serializerLock.writeLock().unlock();
         }


Reply via email to