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