Author: reto
Date: Fri Mar 25 19:16:40 2011
New Revision: 1085524

URL: http://svn.apache.org/viewvc?rev=1085524&view=rev
Log:
CLEREZZA-460: unregistering typerendelets when service disappears

Modified:
    
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RendererFactory.java
    
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/MediaTypeMap.java
    
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/RegexMap.java

Modified: 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RendererFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RendererFactory.java?rev=1085524&r1=1085523&r2=1085524&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RendererFactory.java
 (original)
+++ 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RendererFactory.java
 Fri Mar 25 19:16:40 2011
@@ -19,12 +19,7 @@
 package org.apache.clerezza.platform.typerendering;
 
 
-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.*;
 import javax.ws.rs.core.MediaType;
 import org.apache.clerezza.platform.typepriority.TypePrioritizer;
 import org.apache.clerezza.platform.typerendering.utils.MediaTypeMap;
@@ -41,7 +36,9 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.felix.scr.annotations.Services;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.component.ComponentContext;
+import org.osgi.service.startlevel.StartLevel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,13 +62,21 @@ public class RendererFactory {
        @Reference
        private TypePrioritizer typePrioritizer;
 
+       @Reference
+       private StartLevel startLevelService;
+
        private Map<UriRef, RegexMap<MediaTypeMap<TypeRenderlet>>> 
typeRenderletMap =
-                       new HashMap<UriRef, 
RegexMap<MediaTypeMap<TypeRenderlet>>>();
+                       Collections.synchronizedMap(new HashMap<UriRef, 
RegexMap<MediaTypeMap<TypeRenderlet>>>());
 
        private BundleContext bundleContext;
 
+       private Set<ServiceReference> pendingRenderletRegistrations = new 
HashSet<ServiceReference>();
+
        protected void activate(ComponentContext componentContext) {
                bundleContext = componentContext.getBundleContext();
+               for (ServiceReference r : pendingRenderletRegistrations) {
+                       registerTypeRenderlet(r);
+               }
        }
 
        protected void deactivate(ComponentContext componentContext) {
@@ -136,7 +141,21 @@ public class RendererFactory {
                return null;
        }
 
-       protected void bindTypeRenderlet(TypeRenderlet typeRenderlet) {
+       protected void bindTypeRenderlet(ServiceReference serviceReference) {
+               if (bundleContext == null) {
+                       pendingRenderletRegistrations.add(serviceReference);
+               } else {
+                       registerTypeRenderlet(serviceReference);
+               }
+       }
+
+       private void registerTypeRenderlet(ServiceReference serviceReference) {
+               int startLevel = 
startLevelService.getBundleStartLevel(serviceReference.getBundle());
+               TypeRenderlet renderlet = (TypeRenderlet) 
bundleContext.getService(serviceReference);
+               registerRenderlet(renderlet, startLevel);
+       }
+
+       private void registerRenderlet(TypeRenderlet typeRenderlet, int 
startLevel) {
                final UriRef rdfType = typeRenderlet.getRdfType();
                RegexMap<MediaTypeMap<TypeRenderlet>> regexMap = 
typeRenderletMap.get(rdfType);
                if (regexMap == null) {
@@ -154,8 +173,17 @@ public class RendererFactory {
        }
 
        protected void unbindTypeRenderlet(TypeRenderlet typeRenderlet) {
-
+               for (Map.Entry<UriRef, RegexMap<MediaTypeMap<TypeRenderlet>>> 
typeEntry: typeRenderletMap.entrySet()) {
+                       final RegexMap<MediaTypeMap<TypeRenderlet>> regexMap = 
typeEntry.getValue();
+                       for (Map.Entry<String, MediaTypeMap<TypeRenderlet>> 
regexEntry: regexMap.entrySet()) {
+                               final MediaTypeMap<TypeRenderlet> mediaTypeMap 
= regexEntry.getValue();
+                               if (mediaTypeMap.remove(typeRenderlet)) {
+                                       //for now we just leave the potentially 
empty mediaTypeMap there
+                                       //IMPROVEMENT remove without entries
+                                       return;
+                               }
+                       }
+               }
        }
 
-
 }

Modified: 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/MediaTypeMap.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/MediaTypeMap.java?rev=1085524&r1=1085523&r2=1085524&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/MediaTypeMap.java
 (original)
+++ 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/MediaTypeMap.java
 Fri Mar 25 19:16:40 2011
@@ -19,6 +19,8 @@
 
 package org.apache.clerezza.platform.typerendering.utils;
 
+import org.apache.clerezza.platform.typerendering.TypeRenderlet;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -26,6 +28,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import javax.print.attribute.standard.Media;
 import javax.ws.rs.core.MediaType;
 
 /**
@@ -44,6 +47,7 @@ public class MediaTypeMap<T> {
        private final Map<String, Set<T>> primaryTypeEntries = new 
HashMap<String, Set<T>>();
        private final Set<T> wildCardEntries = new HashSet<T>();
 
+
        public void addEntry(final MediaType mediaType, final T entry) {
                if (mediaType.isWildcardType()) {
                        wildCardEntries.add(entry);
@@ -108,4 +112,30 @@ public class MediaTypeMap<T> {
                resultList.addAll(wildCardEntries);
                return resultList.iterator();
        }
+
+       public boolean remove(T toBeRemoved) {
+               if (removeFromSetMap(exactTypeEntries, toBeRemoved)) {
+                       return true;
+               }
+               if (removeFromSetMap(primaryTypeEntries, toBeRemoved)) {
+                       return true;
+               }
+               return wildCardEntries.remove(toBeRemoved);
+       }
+
+       private <U> boolean removeFromSetMap(Map<U, Set<T>> map, T toBeRemoved) 
{
+               Iterator<Map.Entry<U, Set<T>>> iter = map.entrySet().iterator();
+               while (iter.hasNext()) {
+                       Map.Entry<?, Set<T>> entry = iter.next();
+                       Set<T> values = entry.getValue();
+                       if (values.remove(toBeRemoved)) {
+                               if (values.isEmpty()) {
+                                       iter.remove();
+                               }
+                               return true;
+                       }
+               }
+               return false;
+       }
+
 }

Modified: 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/RegexMap.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/RegexMap.java?rev=1085524&r1=1085523&r2=1085524&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/RegexMap.java
 (original)
+++ 
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/utils/RegexMap.java
 Fri Mar 25 19:16:40 2011
@@ -19,10 +19,7 @@
 
 package org.apache.clerezza.platform.typerendering.utils;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
+import java.util.*;
 import java.util.regex.Pattern;
 
 /**
@@ -119,7 +116,7 @@ public class RegexMap<T> {
 
        /**
         * 
-        * @param term the term that must macth against the regex of the entry
+        * @param term the term that must match against the regex of the entry
         * @return an iterator of matching entries, sorted by length of match
         */
        public Iterator<T> getMatching(String pTerm) {
@@ -161,4 +158,12 @@ public class RegexMap<T> {
                        }
                };
        }
+
+       public Set<Map.Entry<String,T>> entrySet() {
+               Map<String,T> map = new HashMap<String, T>();
+               for (Tuple tuple : tuples) {
+                       map.put(tuple.pattern.pattern(), tuple.entry);
+               }
+               return map.entrySet();
+       }
 }


Reply via email to