You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by re...@apache.org on 2011/03/25 20:16:40 UTC

svn commit: r1085524 - in /incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering: RendererFactory.java utils/MediaTypeMap.java utils/RegexMap.java

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();
+	}
 }