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/27 13:07:46 UTC

svn commit: r1085911 - in /incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering: RendererFactory.java RenderletManagerImpl.java

Author: reto
Date: Sun Mar 27 11:07:46 2011
New Revision: 1085911

URL: http://svn.apache.org/viewvc?rev=1085911&view=rev
Log:
CLEREZZA-460: implement unbindTypeRenderlet and toString methods

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/RenderletManagerImpl.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=1085911&r1=1085910&r2=1085911&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 Sun Mar 27 11:07:46 2011
@@ -65,8 +65,33 @@ public class RendererFactory {
 	@Reference
 	private StartLevel startLevelService;
 
-	private Map<UriRef, RegexMap<MediaTypeMap<TypeRenderlet>>> typeRenderletMap =
-			Collections.synchronizedMap(new HashMap<UriRef, RegexMap<MediaTypeMap<TypeRenderlet>>>());
+	/**
+	 * A Tuple Type-Renderler Startlevel, for identity only the renderlet is relevan
+	 */
+	private static class TypeRenderletStartLevel {
+		TypeRenderlet renderlet;
+		int startLevel;
+
+		private TypeRenderletStartLevel(TypeRenderlet renderlet, int startLevel) {
+			this.startLevel = startLevel;
+			this.renderlet = renderlet;
+		}
+
+		@Override
+		public boolean equals(Object o) {
+			if (this == o) return true;
+			TypeRenderletStartLevel that = (TypeRenderletStartLevel) o;
+			return renderlet.equals(that.renderlet);
+		}
+
+		@Override
+		public int hashCode() {
+			return renderlet.hashCode();
+		}
+	}
+
+	private Map<UriRef, RegexMap<MediaTypeMap<TypeRenderletStartLevel>>> typeRenderletMap =
+			Collections.synchronizedMap(new HashMap<UriRef, RegexMap<MediaTypeMap<TypeRenderletStartLevel>>>());
 
 	private BundleContext bundleContext;
 
@@ -119,17 +144,25 @@ public class RendererFactory {
 		Iterator<UriRef> sortedTypes = typePrioritizer.iterate(types);
 		while (sortedTypes.hasNext()) {
 			final UriRef currentType = sortedTypes.next();
-			final RegexMap<MediaTypeMap<TypeRenderlet>> regexMap = typeRenderletMap.get(currentType);
+			final RegexMap<MediaTypeMap<TypeRenderletStartLevel>> regexMap = typeRenderletMap.get(currentType);
 			if (regexMap != null) {
-				Iterator<MediaTypeMap<TypeRenderlet>> mediaTypeMapIter = regexMap.getMatching(mode);
+				Iterator<MediaTypeMap<TypeRenderletStartLevel>> mediaTypeMapIter = regexMap.getMatching(mode);
 				while (mediaTypeMapIter.hasNext()) {
-					MediaTypeMap<TypeRenderlet> mediaTypeMap = mediaTypeMapIter.next();
+					MediaTypeMap<TypeRenderletStartLevel> mediaTypeMap = mediaTypeMapIter.next();
 					for (MediaType acceptableType : acceptableMediaTypes) {
-						Iterator<TypeRenderlet> renderlets = mediaTypeMap.getMatching(acceptableType);
+						Iterator<TypeRenderletStartLevel> renderlets = mediaTypeMap.getMatching(acceptableType);
 						if (renderlets.hasNext()) {
-							TypeRenderlet typeRenderlet = renderlets.next();
+							TypeRenderlet bestRenderlet = null;
+							int highestStartLevel = 0;
+							while (renderlets.hasNext()) {
+								TypeRenderletStartLevel typeRenderletStartLevel = renderlets.next();
+								if (typeRenderletStartLevel.startLevel > highestStartLevel) {
+									highestStartLevel = typeRenderletStartLevel.startLevel;
+									bestRenderlet = typeRenderletStartLevel.renderlet;
+								}
+							}
 							return new TypeRenderletRendererImpl(
-								typeRenderlet,
+								bestRenderlet,
 								acceptableType,
 								this,
 								bundleContext);
@@ -157,27 +190,28 @@ public class RendererFactory {
 
 	private void registerRenderlet(TypeRenderlet typeRenderlet, int startLevel) {
 		final UriRef rdfType = typeRenderlet.getRdfType();
-		RegexMap<MediaTypeMap<TypeRenderlet>> regexMap = typeRenderletMap.get(rdfType);
+		RegexMap<MediaTypeMap<TypeRenderletStartLevel>> regexMap = typeRenderletMap.get(rdfType);
 		if (regexMap == null) {
-			regexMap = new RegexMap<MediaTypeMap<TypeRenderlet>>();
+			regexMap = new RegexMap<MediaTypeMap<TypeRenderletStartLevel>>();
 			typeRenderletMap.put(rdfType, regexMap);
 		}
 		final String mode = typeRenderlet.getModePattern();
-		MediaTypeMap<TypeRenderlet> mediaTypeMap = regexMap.getFirstExactMatch(mode);
+		MediaTypeMap<TypeRenderletStartLevel> mediaTypeMap = regexMap.getFirstExactMatch(mode);
 		if (mediaTypeMap == null) {
-			mediaTypeMap = new MediaTypeMap<TypeRenderlet>();
+			mediaTypeMap = new MediaTypeMap<TypeRenderletStartLevel>();
 			regexMap.addEntry(mode, mediaTypeMap);
 		}
 		final MediaType mediaType = typeRenderlet.getMediaType();
-		mediaTypeMap.addEntry(mediaType, typeRenderlet);
+		mediaTypeMap.addEntry(mediaType, new TypeRenderletStartLevel(typeRenderlet, startLevel));
 	}
 
 	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)) {
+		TypeRenderletStartLevel typeRenderletStartLevel = new TypeRenderletStartLevel(typeRenderlet, 0);
+		for (Map.Entry<UriRef, RegexMap<MediaTypeMap<TypeRenderletStartLevel>>> typeEntry: typeRenderletMap.entrySet()) {
+			final RegexMap<MediaTypeMap<TypeRenderletStartLevel>> regexMap = typeEntry.getValue();
+			for (Map.Entry<String, MediaTypeMap<TypeRenderletStartLevel>> regexEntry: regexMap.entrySet()) {
+				final MediaTypeMap<TypeRenderletStartLevel> mediaTypeMap = regexEntry.getValue();
+				if (mediaTypeMap.remove(typeRenderletStartLevel)) {
 					//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/RenderletManagerImpl.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RenderletManagerImpl.java?rev=1085911&r1=1085910&r2=1085911&view=diff
==============================================================================
--- incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RenderletManagerImpl.java (original)
+++ incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RenderletManagerImpl.java Sun Mar 27 11:07:46 2011
@@ -282,6 +282,13 @@ public class RenderletManagerImpl implem
 						typeRenderletRequestProperties.getMediaType(),
 						renderletRequestProperties, os);
 			}
+
+			@Override
+			public String toString() {
+				return "RenderletManager managed for: "+renderletServiceName+" with "+renderingSpecificationUri;
+			}
+
+
 		};
 		ServiceRegistration registration = bundleContext.registerService(TypeRenderlet.class.getName(), typeRenderlet,
 				new Hashtable());