Author: reto
Date: Sun Sep 11 18:09:52 2011
New Revision: 1169491
URL: http://svn.apache.org/viewvc?rev=1169491&view=rev
Log:
CLREZZA-630: renderlets with exact matches (non-regex) cannot be shadowed by
renderlets with regex
Modified:
incubator/clerezza/trunk/parent/platform.typerendering/platform.typerendering.core/src/main/java/org/apache/clerezza/platform/typerendering/RendererFactory.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=1169491&r1=1169490&r2=1169491&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 Sep 11 18:09:52 2011
@@ -73,12 +73,14 @@ public class RendererFactory {
* A Tuple Type-Renderler Startlevel, for identity only the renderlet
is relevan
*/
private static class TypeRenderletStartLevel {
- TypeRenderlet renderlet;
- int startLevel;
+ final TypeRenderlet renderlet;
+ final int startLevel;
+ final String modePattern;
- private TypeRenderletStartLevel(TypeRenderlet renderlet, int
startLevel) {
+ private TypeRenderletStartLevel(TypeRenderlet renderlet, int
startLevel, String modePattern) {
this.startLevel = startLevel;
this.renderlet = renderlet;
+ this.modePattern = modePattern;
}
@Override
@@ -157,9 +159,18 @@ public class RendererFactory {
Iterator<TypeRenderletStartLevel> renderlets =
mediaTypeMap.getMatching(acceptableType);
if (renderlets.hasNext()) {
TypeRenderlet
bestRenderlet = null;
+ //an exact match is
preferred over regex-matches disregarding the start-level
+ boolean hasExactMatch =
false;
int highestStartLevel =
0;
while
(renderlets.hasNext()) {
TypeRenderletStartLevel typeRenderletStartLevel = renderlets.next();
+ if
(!hasExactMatch) {
+ if
((mode == null) || mode.equals(typeRenderletStartLevel.modePattern)) {
+
hasExactMatch = true;
+
highestStartLevel = typeRenderletStartLevel.startLevel;
+
bestRenderlet = typeRenderletStartLevel.renderlet;
+ }
+ }
if
(typeRenderletStartLevel.startLevel > highestStartLevel) {
highestStartLevel = typeRenderletStartLevel.startLevel;
bestRenderlet = typeRenderletStartLevel.renderlet;
@@ -199,18 +210,18 @@ public class RendererFactory {
regexMap = new
RegexMap<MediaTypeMap<TypeRenderletStartLevel>>();
typeRenderletMap.put(rdfType, regexMap);
}
- final String mode = typeRenderlet.getModePattern();
- MediaTypeMap<TypeRenderletStartLevel> mediaTypeMap =
regexMap.getFirstExactMatch(mode);
+ final String modePattern = typeRenderlet.getModePattern();
+ MediaTypeMap<TypeRenderletStartLevel> mediaTypeMap =
regexMap.getFirstExactMatch(modePattern);
if (mediaTypeMap == null) {
mediaTypeMap = new
MediaTypeMap<TypeRenderletStartLevel>();
- regexMap.addEntry(mode, mediaTypeMap);
+ regexMap.addEntry(modePattern, mediaTypeMap);
}
final MediaType mediaType = typeRenderlet.getMediaType();
- mediaTypeMap.addEntry(mediaType, new
TypeRenderletStartLevel(typeRenderlet, startLevel));
+ mediaTypeMap.addEntry(mediaType, new
TypeRenderletStartLevel(typeRenderlet, startLevel, modePattern));
}
protected void unbindTypeRenderlet(TypeRenderlet typeRenderlet) {
- TypeRenderletStartLevel typeRenderletStartLevel = new
TypeRenderletStartLevel(typeRenderlet, 0);
+ TypeRenderletStartLevel typeRenderletStartLevel = new
TypeRenderletStartLevel(typeRenderlet, 0, null);
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()) {