You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2008/11/17 03:29:20 UTC

svn commit: r718160 - in /wicket/sandbox/knopp/experimental/wicket/src: main/java/org/apache/_wicket/request/encoder/ main/java/org/apache/_wicket/request/handler/resource/ main/java/org/apache/_wicket/resource/ test/java/org/apache/_wicket/request/enc...

Author: knopp
Date: Sun Nov 16 18:29:19 2008
New Revision: 718160

URL: http://svn.apache.org/viewvc?rev=718160&view=rev
Log:
ResourceReferenceEncoder + test

Added:
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoder.java   (with props)
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoder.java   (with props)
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceReferenceRequestHandler.java   (with props)
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoderTest.java   (with props)
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoderTest.java   (with props)
Modified:
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/EncoderContext.java
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceRequestHandler.java
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReference.java
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReferenceRegistry.java
    wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java?rev=718160&r1=718159&r2=718160&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractEncoder.java Sun Nov 16 18:29:19 2008
@@ -85,9 +85,9 @@
 		else
 		{
 			return s.substring(2, s.length() - 1);
-		}		
+		}
 	}
-		
+
 	/**
 	 * Returns true if the given url starts with specified segments. Segments that contain
 	 * placelhoders are not compared.
@@ -287,7 +287,8 @@
 			--segmentsToSkip;
 		}
 
-		if (getPageComponentInfo(urlCopy) != null)
+		if (!urlCopy.getQueryParameters().isEmpty() &&
+			Strings.isEmpty(urlCopy.getQueryParameters().get(0).getValue()))
 		{
 			urlCopy.getQueryParameters().remove(0);
 		}

Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoder.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoder.java?rev=718160&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoder.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoder.java Sun Nov 16 18:29:19 2008
@@ -0,0 +1,133 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache._wicket.request.encoder;
+
+import java.util.Locale;
+
+import org.apache._wicket.request.Url;
+import org.apache._wicket.request.Url.QueryParameter;
+import org.apache._wicket.resource.ResourceReference;
+import org.apache.wicket.util.string.Strings;
+
+/**
+ * Base class for encoding and decoding {@link ResourceReference}s
+ * 
+ * @author Matej Knopp
+ */
+public abstract class AbstractResourceReferenceEncoder extends AbstractEncoder
+{
+
+	protected static class ResourceReferenceAttributes
+	{
+		protected Locale locale;
+		protected String style;
+	};
+	
+	protected static String encodeResourceReferenceAttributes(ResourceReferenceAttributes attributes)
+	{
+		if (attributes == null || (attributes.locale == null && attributes.style == null))
+		{
+			return null;
+		}
+		else
+		{
+			StringBuilder res = new StringBuilder();
+			if (attributes.locale != null)
+			{
+				res.append(attributes.locale.toString());
+			}
+			if (!Strings.isEmpty(attributes.style))
+			{
+				res.append("-");
+				res.append(attributes.style);
+			}
+			return res.toString();
+		}
+	};
+	
+	protected static ResourceReferenceAttributes decodeResourceReferenceAttributes(String attributes)
+	{
+		ResourceReferenceAttributes res = new ResourceReferenceAttributes();		
+		if (!Strings.isEmpty(attributes))
+		{
+			String split[] = attributes.split("-", 2);
+			res.locale = parseLocale(split[0]);
+			if (split.length == 2)
+			{
+				res.style = split[1];
+			}			
+		}
+		return res;
+	}
+	
+	private static Locale parseLocale(String locale)
+	{
+		if (Strings.isEmpty(locale))
+		{
+			return null;
+		}
+		else
+		{
+			String parts[] = locale.toLowerCase().split("_", 3);
+			if (parts.length == 1)
+			{
+				return new Locale(parts[0]);
+			}
+			else if (parts.length == 2)
+			{
+				return new Locale(parts[0], parts[1]);
+			}
+			else if (parts.length == 3)
+			{
+				return new Locale(parts[0], parts[1], parts[2]);	
+			}
+			else
+			{
+				return null;
+			}
+		}
+	}	
+	
+	protected void encodeResourceReferenceAttributes(Url url, ResourceReference reference)
+	{
+		ResourceReferenceAttributes attributes = new ResourceReferenceAttributes();
+		attributes.locale = reference.getLocale();
+		attributes.style = reference.getStyle();
+		String encoded = encodeResourceReferenceAttributes(attributes);
+		if (!Strings.isEmpty(encoded))
+		{
+			url.getQueryParameters().add(new Url.QueryParameter(encoded, ""));
+		}
+	}
+	
+	protected ResourceReferenceAttributes getResourceReferenceAttributes(Url url)
+	{
+		if (url == null)
+		{
+			throw new IllegalStateException("Argument 'url' may not be null.");
+		}
+		if (url.getQueryParameters().size() > 0)
+		{
+			QueryParameter param = url.getQueryParameters().get(0);
+			if (Strings.isEmpty(param.getValue()))
+			{
+				return decodeResourceReferenceAttributes(param.getName());
+			}
+		}
+		return new ResourceReferenceAttributes();
+	}
+}

Propchange: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/EncoderContext.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/EncoderContext.java?rev=718160&r1=718159&r2=718160&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/EncoderContext.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/EncoderContext.java Sun Nov 16 18:29:19 2008
@@ -18,6 +18,7 @@
 
 import org.apache._wicket.IPage;
 import org.apache._wicket.PageParameters;
+import org.apache._wicket.resource.ResourceReferenceRegistry;
 import org.apache.wicket.RequestListenerInterface;
 
 /**
@@ -66,6 +67,16 @@
 	public String getBookmarkableIdentifier();
 	
 	/**
+	 * @return identifier for resources
+	 */
+	public String getResourceIdentifier();
+	
+	/**
+	 * @return {@link ResourceReferenceRegistry}
+	 */
+	public ResourceReferenceRegistry getResourceReferenceRegistry();
+	
+	/**
 	 * Returns the listener interface name as string.
 	 * 
 	 * @param listenerInterface

Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoder.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoder.java?rev=718160&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoder.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoder.java Sun Nov 16 18:29:19 2008
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache._wicket.request.encoder;
+
+import org.apache._wicket.PageParameters;
+import org.apache._wicket.request.RequestHandler;
+import org.apache._wicket.request.Url;
+import org.apache._wicket.request.encoder.parameters.PageParametersEncoder;
+import org.apache._wicket.request.encoder.parameters.SimplePageParametersEncoder;
+import org.apache._wicket.request.handler.resource.ResourceReferenceRequestHandler;
+import org.apache._wicket.request.handler.resource.ResourceRequestHandler;
+import org.apache._wicket.request.request.Request;
+import org.apache._wicket.resource.Resource;
+import org.apache._wicket.resource.ResourceReference;
+import org.apache.wicket.util.lang.Classes;
+
+/**
+ * Generic {@link ResourceReference} encoder that encodes and decodes non-mounted
+ * {@link ResourceReference}s.
+ * 
+ * @author Matej Knopp
+ */
+public class ResourceReferenceEncoder extends AbstractResourceReferenceEncoder
+{
+	private final PageParametersEncoder pageParametersEncoder;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param pageParametersEncoder
+	 */
+	public ResourceReferenceEncoder(PageParametersEncoder pageParametersEncoder)
+	{
+		this.pageParametersEncoder = pageParametersEncoder;
+	}
+
+	/**
+	 * Construct.
+	 */
+	public ResourceReferenceEncoder()
+	{
+		this(new SimplePageParametersEncoder());
+	}
+
+	protected EncoderContext getContext()
+	{
+		return null;
+	};
+
+	public RequestHandler decode(Request request)
+	{
+		Url url = request.getUrl();
+		if (url.getSegments().size() >= 4 &&
+			urlStartsWith(url, getContext().getNamespace(), getContext().getResourceIdentifier()))
+		{
+			String className = url.getSegments().get(2);
+			StringBuilder name = new StringBuilder();
+			for (int i = 3; i < url.getSegments().size(); ++i)
+			{
+				if (name.length() > 0)
+				{
+					name.append("/");
+				}
+				name.append(url.getSegments().get(i));
+			}
+
+			ResourceReferenceAttributes attributes = getResourceReferenceAttributes(url);
+
+			// extract the PageParameters from URL if there are any
+			PageParameters pageParameters = extractPageParameters(url,
+				request.getRequestParameters(), url.getSegments().size(), pageParametersEncoder);
+
+			Class<?> scope = resolveClass(className);
+			if (scope != null)
+			{
+				ResourceReference res = getContext().getResourceReferenceRegistry()
+					.getResourceReference(scope, name.toString(), attributes.locale,
+						attributes.style, false);
+				if (res != null)
+				{
+					Resource resource = res.getResource();
+					if (resource != null)
+					{
+						ResourceRequestHandler handler = new ResourceRequestHandler(resource,
+							attributes.locale, attributes.style, pageParameters);
+						return handler;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	protected Class<?> resolveClass(String name)
+	{
+		return Classes.resolveClass(name);
+	}
+
+	protected String getClassName(Class<?> scope)
+	{
+		return scope.getName();
+	}
+
+	public Url encode(RequestHandler requestHandler)
+	{
+		if (requestHandler instanceof ResourceReferenceRequestHandler)
+		{
+			ResourceReferenceRequestHandler referenceRequestHandler = (ResourceReferenceRequestHandler)requestHandler;
+			ResourceReference reference = referenceRequestHandler.getResourceReference();
+			Url url = new Url();
+			url.getSegments().add(getContext().getNamespace());
+			url.getSegments().add(getContext().getResourceIdentifier());
+			url.getSegments().add(getClassName(reference.getScope()));
+			String nameParts[] = reference.getName().split("/");
+			for (String name : nameParts)
+			{
+				url.getSegments().add(name);
+			}
+			encodeResourceReferenceAttributes(url, reference);
+			PageParameters parameters = referenceRequestHandler.getPageParameters();
+			if (parameters != null)
+			{
+				parameters = new PageParameters(parameters);
+				// need to remove indexed parameters otherwise the URL won't be able to decode
+				parameters.clearIndexedParameters();
+				url = encodePageParameters(url, parameters, pageParametersEncoder);
+			}
+			return url;
+		}
+		return null;
+	}
+
+	public int getMachingSegmentsCount(Request request)
+	{
+		// always return 0 here so that the mounts have higher priority
+		return 0;
+	}
+
+}

Propchange: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceReferenceRequestHandler.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceReferenceRequestHandler.java?rev=718160&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceReferenceRequestHandler.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceReferenceRequestHandler.java Sun Nov 16 18:29:19 2008
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache._wicket.request.handler.resource;
+
+import org.apache._wicket.PageParameters;
+import org.apache._wicket.RequestCycle;
+import org.apache._wicket.request.RequestHandler;
+import org.apache._wicket.resource.ResourceReference;
+
+/**
+ * Request handler for {@link ResourceReference}. This handler is only used to generate URLs.
+ * 
+ * @author Matej Knopp
+ */
+public class ResourceReferenceRequestHandler implements RequestHandler
+{
+	private final ResourceReference resourceReference;
+	private final PageParameters pageParameters;
+	
+	/**
+	 * Construct.
+	 * 
+	 * @param resourceReference
+	 * @param pageParameters
+	 */
+	public ResourceReferenceRequestHandler(ResourceReference resourceReference, PageParameters pageParameters)
+	{
+		if (resourceReference == null)
+		{
+			throw new IllegalArgumentException("Argument 'resourceReference' may not be null.");
+		}		
+		this.resourceReference = resourceReference;
+		this.pageParameters = pageParameters;
+	}
+	
+	/**
+	 * @return resource reference
+	 */
+	public ResourceReference getResourceReference()
+	{
+		return resourceReference;
+	}
+	
+	/**
+	 * @return page parameters
+	 */
+	public PageParameters getPageParameters()
+	{
+		return pageParameters;
+	}
+
+	public void detach(RequestCycle requestCycle)
+	{
+	}
+
+	public void respond(RequestCycle requestCycle)
+	{
+	}
+
+}

Propchange: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceReferenceRequestHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceRequestHandler.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceRequestHandler.java?rev=718160&r1=718159&r2=718160&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceRequestHandler.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/resource/ResourceRequestHandler.java Sun Nov 16 18:29:19 2008
@@ -56,6 +56,38 @@
 		this.pageParameters = pageParameters != null ? pageParameters : new PageParameters();
 	}
 
+	/**
+	 * @return locale
+	 */
+	public Locale getLocale()
+	{
+		return locale;
+	}
+	
+	/**
+	 * @return style
+	 */
+	public String getStyle()
+	{
+		return style;
+	}
+	
+	/**
+	 * @return page parameters
+	 */
+	public PageParameters getPageParameters()
+	{
+		return pageParameters;
+	}
+	
+	/**
+	 * @return resource
+	 */
+	public Resource getResource()
+	{
+		return resource;
+	}
+
 	public void respond(RequestCycle requestCycle)
 	{
 		Resource.Attributes a = new Resource.Attributes(requestCycle.getRequest(),

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReference.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReference.java?rev=718160&r1=718159&r2=718160&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReference.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReference.java Sun Nov 16 18:29:19 2008
@@ -19,6 +19,7 @@
 import java.util.Locale;
 
 import org.apache.wicket.util.lang.Classes;
+import org.apache.wicket.util.lang.Objects;
 
 /**
  * Reference to a resource. Can be used to reference global resources.
@@ -28,7 +29,7 @@
 public abstract class ResourceReference
 {
 	private final String scope;
-	private final String path;
+	private final String name;
 	private final Locale locale;
 	private String style;
 
@@ -37,34 +38,34 @@
 	 * 
 	 * @param scope
 	 *            mandatory parameter
-	 * @param path
+	 * @param name
 	 *            mandatory parameter
 	 * @param locale
 	 * @param style
 	 */
-	public ResourceReference(Class<?> scope, String path, Locale locale, String style)
+	public ResourceReference(Class<?> scope, String name, Locale locale, String style)
 	{
 		if (scope == null)
 		{
 			throw new IllegalArgumentException("Argument 'scope' can not be null.");
 		}
 		this.scope = scope.getName();
-		
-		if (path == null)
+
+		if (name == null)
 		{
 			throw new IllegalArgumentException("Argument 'path' can not be null.");
 		}
-		this.path = path;
+		this.name = name;
 		this.locale = locale;
 		this.style = style;
 	}
 
 	/**
-	 * @return path
+	 * @return name
 	 */
-	public String getPath()
+	public String getName()
 	{
-		return path;
+		return name;
 	}
 
 	/**
@@ -91,6 +92,30 @@
 		return style;
 	}
 
+	@Override
+	public boolean equals(Object obj)
+	{
+		if (this == obj)
+		{
+			return true;
+		}
+		if (obj instanceof ResourceReference == false)
+		{
+			return false;
+		}
+		ResourceReference that = (ResourceReference)obj;
+		return Objects.equal(scope, that.scope) && //
+			Objects.equal(name, that.name) && //
+			Objects.equal(locale, that.locale) && //
+			Objects.equal(style, that.style);
+	}
+
+	@Override
+	public int hashCode()
+	{
+		return Objects.hashCode(scope, name, locale, style);
+	}
+	
 	/**
 	 * Creates new resource.
 	 * 

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReferenceRegistry.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReferenceRegistry.java?rev=718160&r1=718159&r2=718160&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReferenceRegistry.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/resource/ResourceReferenceRegistry.java Sun Nov 16 18:29:19 2008
@@ -32,23 +32,23 @@
 	private static class Key
 	{
 		private final String scope;
-		private final String path;
+		private final String name;
 		private final Locale locale;
 		private final String style;
 
-		public Key(String scope, String path, Locale locale, String style)
+		public Key(String scope, String name, Locale locale, String style)
 		{
 			if (scope == null)
 			{
 				throw new IllegalArgumentException("Argument 'scope' can not be null.");
 			}
-			this.scope = scope.toString();
+			this.scope = scope;
 
-			if (path == null)
+			if (name == null)
 			{
-				throw new IllegalArgumentException("Argument 'path' can not be null.");
+				throw new IllegalArgumentException("Argument 'name' can not be null.");
 			}
-			this.path = path;
+			this.name = name;
 			this.locale = locale;
 			this.style = style;
 		}
@@ -60,13 +60,13 @@
 			{
 				return true;
 			}
-			if (obj instanceof Key)
+			if (obj instanceof Key == false)
 			{
 				return false;
 			}
 			Key that = (Key)obj;
 			return Objects.equal(scope, that.scope) && //
-				Objects.equal(path, that.path) && //
+				Objects.equal(name, that.name) && //
 				Objects.equal(locale, that.locale) && //
 				Objects.equal(style, that.style);
 		}
@@ -74,11 +74,11 @@
 		@Override
 		public int hashCode()
 		{
-			return Objects.hashCode(scope, path, locale, style);
+			return Objects.hashCode(scope, name, locale, style);
 		}
 	};
 
-	private static Map<Key, ResourceReference> map = new ConcurrentHashMap<Key, ResourceReference>();
+	private Map<Key, ResourceReference> map = new ConcurrentHashMap<Key, ResourceReference>();
 
 	/**
 	 * Registers the given {@link ResourceReference}.
@@ -91,7 +91,7 @@
 		{
 			throw new IllegalArgumentException("Argument 'reference' may not be null.");
 		}
-		Key key = new Key(reference.getScope().getName(), reference.getPath(),
+		Key key = new Key(reference.getScope().getName(), reference.getName(),
 			reference.getLocale(), reference.getStyle());
 		map.put(key, reference);
 	}
@@ -107,7 +107,7 @@
 		{
 			throw new IllegalArgumentException("Argument 'reference' may not be null.");
 		}
-		Key key = new Key(reference.getScope().getName(), reference.getPath(),
+		Key key = new Key(reference.getScope().getName(), reference.getName(),
 			reference.getLocale(), reference.getStyle());
 		map.remove(key);
 	}

Added: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoderTest.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoderTest.java?rev=718160&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoderTest.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoderTest.java Sun Nov 16 18:29:19 2008
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache._wicket.request.encoder;
+
+import java.util.Locale;
+
+import org.apache._wicket.resource.Resource;
+import org.apache._wicket.resource.ResourceReference;
+
+/**
+ * @author Matej Knopp
+ */
+public class AbstractResourceReferenceEncoderTest extends AbstractEncoderTest
+{
+
+	/**
+	 * Construct.
+	 */
+	public AbstractResourceReferenceEncoderTest()
+	{
+	}
+
+	protected final Resource resource1 = new Resource()
+	{
+		private static final long serialVersionUID = 1L;
+
+		public void respond(Attributes attributes)
+		{
+		}
+	};
+	
+	protected final Resource resource2 = new Resource()
+	{
+		private static final long serialVersionUID = 1L;
+
+		public void respond(Attributes attributes)
+		{
+		}
+	};
+	
+	protected final Resource resource3 = new Resource()
+	{
+		private static final long serialVersionUID = 1L;
+
+		public void respond(Attributes attributes)
+		{
+		}
+	};
+	
+	protected final Resource resource4 = new Resource()
+	{
+		private static final long serialVersionUID = 1L;
+
+		public void respond(Attributes attributes)
+		{
+		}
+	};
+	
+	protected String CLASS_NAME = AbstractResourceReferenceEncoderTest.class.getName();
+
+	protected ResourceReference reference1 = new ResourceReference(
+		AbstractResourceReferenceEncoderTest.class, "reference1", null, null)
+	{
+		public Resource getResource()
+		{
+			return resource1;
+		};
+	};
+	
+	protected ResourceReference reference2 = new ResourceReference(
+		AbstractResourceReferenceEncoderTest.class, "reference2/name2", new Locale("en", "en"), null)
+	{
+		public Resource getResource()
+		{
+			return resource2;
+		};
+	};
+	
+	protected ResourceReference reference3 = new ResourceReference(
+		AbstractResourceReferenceEncoderTest.class, "reference3", null, "style")
+	{
+		public Resource getResource()
+		{
+			return resource3;
+		};
+	};
+	
+	protected ResourceReference reference4 = new ResourceReference(
+		AbstractResourceReferenceEncoderTest.class, "reference4", Locale.ENGLISH, "style")
+	{
+		public Resource getResource()
+		{
+			return resource4;
+		};
+	};
+
+	@Override
+	protected void setUp() throws Exception
+	{
+		super.setUp();
+
+		context.getResourceReferenceRegistry().registerResourceReference(reference1);
+		context.getResourceReferenceRegistry().registerResourceReference(reference2);
+		context.getResourceReferenceRegistry().registerResourceReference(reference3);
+		context.getResourceReferenceRegistry().registerResourceReference(reference4);
+	}
+}

Propchange: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/AbstractResourceReferenceEncoderTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoderTest.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoderTest.java?rev=718160&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoderTest.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoderTest.java Sun Nov 16 18:29:19 2008
@@ -0,0 +1,348 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache._wicket.request.encoder;
+
+import java.util.Locale;
+
+import org.apache._wicket.PageParameters;
+import org.apache._wicket.request.RequestHandler;
+import org.apache._wicket.request.Url;
+import org.apache._wicket.request.handler.resource.ResourceReferenceRequestHandler;
+import org.apache._wicket.request.handler.resource.ResourceRequestHandler;
+
+/**
+ * @author Matej Knopp
+ */
+public class ResourceReferenceEncoderTest extends AbstractResourceReferenceEncoderTest
+{
+	/**
+	 * Construct.
+	 */
+	public ResourceReferenceEncoderTest()
+	{
+	}
+	
+	private final ResourceReferenceEncoder encoder = new ResourceReferenceEncoder()
+	{
+		@Override
+		protected EncoderContext getContext()
+		{
+			return context;
+		}		
+	};
+
+	/**
+	 * 
+	 */
+	public void testDecode1()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference1");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource1, h.getResource());
+		assertEquals(null, h.getLocale());
+		assertEquals(null, h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals(0, h.getPageParameters().getNamedParameterKeys().size());
+	}
+	
+	/**
+	 * 
+	 */	
+	public void testDecode1A()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference1?en");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource1, h.getResource());
+		assertEquals(Locale.ENGLISH, h.getLocale());
+		assertEquals(null, h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals(0, h.getPageParameters().getNamedParameterKeys().size());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode2()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference1?p1=v1&p2=v2");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource1, h.getResource());
+		assertEquals(null, h.getLocale());
+		assertEquals(null, h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals("v1", h.getPageParameters().getNamedParameter("p1").toString());
+		assertEquals("v2", h.getPageParameters().getNamedParameter("p2").toString());
+	}	
+	
+	/**
+	 * 
+	 */
+	public void testDecode2A()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference1?-style&p1=v1&p2=v2");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource1, h.getResource());
+		assertEquals(null, h.getLocale());
+		assertEquals("style", h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals("v1", h.getPageParameters().getNamedParameter("p1").toString());
+		assertEquals("v2", h.getPageParameters().getNamedParameter("p2").toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode3()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference2/name2?en_EN");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource2, h.getResource());
+		assertEquals(new Locale("en", "en"), h.getLocale());
+		assertEquals(null, h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals(0, h.getPageParameters().getNamedParameterKeys().size());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode3A()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference2/name2?en_EN-style");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource2, h.getResource());
+		assertEquals(new Locale("en", "en"), h.getLocale());
+		assertEquals("style", h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals(0, h.getPageParameters().getNamedParameterKeys().size());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode3B()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference2/name2");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertNull(handler);
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode4()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference2/name2?en_EN&p1=v1&p2=v2");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource2, h.getResource());
+		assertEquals(new Locale("en", "en"), h.getLocale());
+		assertEquals(null, h.getStyle());
+		assertEquals("v1", h.getPageParameters().getNamedParameter("p1").toString());
+		assertEquals("v2", h.getPageParameters().getNamedParameter("p2").toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode5()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference3?-style");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource3, h.getResource());
+		assertEquals(null, h.getLocale());
+		assertEquals("style", h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals(0, h.getPageParameters().getNamedParameterKeys().size());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode6()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference3?-style&p1=v1&p2=v2");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource3, h.getResource());
+		assertEquals(null, h.getLocale());
+		assertEquals("style", h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals("v1", h.getPageParameters().getNamedParameter("p1").toString());
+		assertEquals("v2", h.getPageParameters().getNamedParameter("p2").toString());
+	}	
+	
+	
+	/**
+	 * 
+	 */
+	public void testDecode7()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference4?en-style");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource4, h.getResource());
+		assertEquals(Locale.ENGLISH, h.getLocale());
+		assertEquals("style", h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals(0, h.getPageParameters().getNamedParameterKeys().size());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode7A()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference4?sk");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertNull(handler);
+	}
+	
+	/**
+	 * 
+	 */
+	public void testDecode8()
+	{
+		Url url = Url.parse("wicket/resource/" + CLASS_NAME + "/reference4?en-style&p1=v1&p2=v2");
+		RequestHandler handler = encoder.decode(getRequest(url));
+		assertTrue(handler instanceof ResourceRequestHandler);
+		ResourceRequestHandler h = (ResourceRequestHandler) handler;
+		assertEquals(resource4, h.getResource());
+		assertEquals(Locale.ENGLISH, h.getLocale());
+		assertEquals("style", h.getStyle());
+		assertEquals(0, h.getPageParameters().getIndexedParamsCount());
+		assertEquals("v1", h.getPageParameters().getNamedParameter("p1").toString());
+		assertEquals("v2", h.getPageParameters().getNamedParameter("p2").toString());
+	}	
+	
+	/**
+	 * 
+	 */
+	public void testEncode1()
+	{
+		ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference1, null);
+		Url url = encoder.encode(handler);
+		assertEquals("wicket/resource/" + CLASS_NAME + "/reference1", url.toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testEncode2()
+	{
+		PageParameters parameters = new PageParameters();
+		parameters.setIndexedParameter(0, "X");
+		parameters.addNamedParameter("p1", "v1");
+		parameters.addNamedParameter("p2", "v2");
+		ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference1, parameters);
+		
+		Url url = encoder.encode(handler);
+		assertEquals("wicket/resource/" + CLASS_NAME + "/reference1?p1=v1&p2=v2", url.toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testEncode3()
+	{
+		ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference2, null);
+		Url url = encoder.encode(handler);
+		assertEquals("wicket/resource/" + CLASS_NAME + "/reference2/name2?en_EN", url.toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testEncode4()
+	{
+		PageParameters parameters = new PageParameters();
+		parameters.setIndexedParameter(0, "X");
+		parameters.addNamedParameter("p1", "v1");
+		parameters.addNamedParameter("p2", "v2");
+		ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference2, parameters);
+		
+		Url url = encoder.encode(handler);
+		assertEquals("wicket/resource/" + CLASS_NAME + "/reference2/name2?en_EN&p1=v1&p2=v2", url.toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testEncode5()
+	{
+		ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference3, null);
+		Url url = encoder.encode(handler);
+		assertEquals("wicket/resource/" + CLASS_NAME + "/reference3?-style", url.toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testEncode6()
+	{
+		PageParameters parameters = new PageParameters();
+		parameters.setIndexedParameter(0, "X");
+		parameters.addNamedParameter("p1", "v1");
+		parameters.addNamedParameter("p2", "v2");
+		ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference3, parameters);
+		
+		Url url = encoder.encode(handler);
+		assertEquals("wicket/resource/" + CLASS_NAME + "/reference3?-style&p1=v1&p2=v2", url.toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testEncode7()
+	{
+		ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference4, null);
+		Url url = encoder.encode(handler);
+		assertEquals("wicket/resource/" + CLASS_NAME + "/reference4?en-style", url.toString());
+	}
+	
+	/**
+	 * 
+	 */
+	public void testEncode8()
+	{
+		PageParameters parameters = new PageParameters();
+		parameters.setIndexedParameter(0, "X");
+		parameters.addNamedParameter("p1", "v1");
+		parameters.addNamedParameter("p2", "v2");
+		ResourceReferenceRequestHandler handler = new ResourceReferenceRequestHandler(reference4, parameters);
+		
+		Url url = encoder.encode(handler);
+		assertEquals("wicket/resource/" + CLASS_NAME + "/reference4?en-style&p1=v1&p2=v2", url.toString());
+	}
+}

Propchange: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/ResourceReferenceEncoderTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java?rev=718160&r1=718159&r2=718160&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/encoder/TestEncoderContext.java Sun Nov 16 18:29:19 2008
@@ -19,6 +19,7 @@
 import org.apache._wicket.IPage;
 import org.apache._wicket.MockPage;
 import org.apache._wicket.PageParameters;
+import org.apache._wicket.resource.ResourceReferenceRegistry;
 import org.apache.wicket.RequestListenerInterface;
 import org.apache.wicket.WicketRuntimeException;
 
@@ -51,7 +52,19 @@
 	{
 		return "page";
 	}
+	
+	public String getResourceIdentifier()
+	{
+		return "resource";
+	}
 
+	public ResourceReferenceRegistry getResourceReferenceRegistry()
+	{
+		return registry;
+	}
+	
+	private ResourceReferenceRegistry registry = new ResourceReferenceRegistry();
+	
 	private boolean bookmarkable = true;
 
 	/**