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/09/15 18:49:29 UTC

svn commit: r695546 - in /wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket: ./ request/ request/encoder/ request/handler/ request/handler/impl/

Author: knopp
Date: Mon Sep 15 09:49:28 2008
New Revision: 695546

URL: http://svn.apache.org/viewvc?rev=695546&view=rev
Log:
is this going to work?

Added:
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java   (with props)
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/ComponentRequestHandler.java   (with props)
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/ListenerInterfaceRequestHandler.java   (with props)
Removed:
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/AbstractNotMountedEncoder.java
Modified:
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IComponent.java
    wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerEncoder.java
    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

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IComponent.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IComponent.java?rev=695546&r1=695545&r2=695546&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IComponent.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/IComponent.java Mon Sep 15 09:49:28 2008
@@ -62,6 +62,13 @@
 	public String getMarkupId(boolean createIfDoesNotExist);
 	
 	/**
+	 * Returns page this component belongs to.
+	 * 
+	 * @return page instance or <code>null</code>
+	 */
+	public IPage getPage();
+	
+	/**
 	 * Gets the component at the given path.
 	 * 
 	 * @param path

Modified: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerEncoder.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerEncoder.java?rev=695546&r1=695545&r2=695546&view=diff
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerEncoder.java (original)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerEncoder.java Mon Sep 15 09:49:28 2008
@@ -41,7 +41,7 @@
 	
 	/**
 	 * Returns the amount of matching segments for the request. When two {@link RequestHandlerEncoder}s 
-	 * are capable of decoding a request, the one with highest maching segments count will be used.
+	 * are capable of decoding a request, the one with highest matching segments count will be used.
 	 * <p>
 	 * For example when there are two encoders for mounted page, one mapped to <code>/foo</code> another
 	 * to <code>/foo/bar</code> and the incomming reqest URL is </code>/foo/bar/baz</code>, the encoder

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=695546&r1=695545&r2=695546&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 Mon Sep 15 09:49:28 2008
@@ -16,50 +16,106 @@
  */
 package org.apache._wicket.request.encoder;
 
-import org.apache._wicket.request.RequestHandler;
+import org.apache._wicket.IComponent;
+import org.apache._wicket.IPage;
 import org.apache._wicket.request.RequestHandlerEncoder;
 import org.apache._wicket.request.Url;
-import org.apache._wicket.request.request.Request;
+import org.apache._wicket.request.Url.QueryParameter;
 import org.apache.wicket.RequestListenerInterface;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.protocol.http.PageExpiredException;
 
+/**
+ * Convenience class for implementing encoders.
+ * 
+ * @author Matej Knopp
+ */
 public abstract class AbstractEncoder implements RequestHandlerEncoder
 {
 	protected EncoderContext getContext()
 	{
+		// TODO
 		return null;
 	};
 
 	protected String requestListenerInterfaceToString(RequestListenerInterface listenerInterface)
 	{
-		if (listenerInterface == null)
-		{
-			throw new IllegalArgumentException("Argument 'listenerInterface' may not be null.");
-		}
-		return listenerInterface.getName();
+		return getContext().requestListenerInterfaceToString(listenerInterface);
+	}
+
+	protected RequestListenerInterface requestListenerInterfaceFromString(String interfaceName)
+	{
+		return getContext().requestListenerInterfaceFromString(interfaceName);
 	}
-	
-	protected RequestListenerInterface requestListenerIntefaceFromString(String interfaceName)
+
+	protected boolean urlStartsWith(Url url, String... segments)
 	{
-		if (interfaceName == null)
+		if (url == null)
+		{
+			return false;
+		}
+		else
 		{
-			throw new IllegalArgumentException("Argument 'interfaceName' may not be null.");
+			if (url.getSegments().size() < segments.length)
+			{
+				return false;
+			}
+			else
+			{
+				for (int i = 0; i < segments.length; ++i)
+				{
+					if (segments[i].equals(url.getSegments().get(i)) == false)
+					{
+						return false;
+					}
+				}
+			}
 		}
-		return RequestListenerInterface.forName(interfaceName);
+		return true;
 	}
-	
-	public RequestHandler decode(Request request)
+
+	protected PageComponentInfo getPageComponentInfo(Url url)
 	{
+		if (url.getQueryParameters().size() > 0)
+		{
+			QueryParameter param = url.getQueryParameters().get(0);
+			if (param.getValue() == null)
+			{
+				return PageComponentInfo.parse(param.getName());
+			}
+		}
 		return null;
 	}
 
-	public Url encode(RequestHandler requestHandler)
+	protected IPage getPageInstance(PageInfo info, boolean throwExpiredExceptionIfNotFound)
 	{
-		return null;
+		IPage page = getContext().getPageInstance(info.getPageMapName(), info.getPageId(),
+			info.getVersionNumber());
+
+		if (page == null && throwExpiredExceptionIfNotFound)
+		{
+			throw new PageExpiredException("Page expired.");
+		}
+
+		return page;
 	}
 
-	public int getMachingSegmentsCount(Request request)
+	protected IPage getPageInstance(PageInfo info)
 	{
-		return 0;
+		return getPageInstance(info, true);
 	}
 
+	protected IComponent getComponent(IPage page, String componentPath)
+	{
+		IComponent component = page.get(componentPath);
+		if (component == null)
+		{
+			throw new WicketRuntimeException("Component with path " + componentPath +
+				" not found in page.");
+		}
+		else
+		{
+			return component;
+		}
+	}
 }

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=695546&r1=695545&r2=695546&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 Mon Sep 15 09:49:28 2008
@@ -18,6 +18,7 @@
 
 import org.apache._wicket.IPage;
 import org.apache._wicket.PageParameters;
+import org.apache.wicket.RequestListenerInterface;
 
 /**
  * Utility interface for providing and creating new page instances.
@@ -45,5 +46,36 @@
 	 * @return new page instance
 	 */
 	public IPage newPageInstance(String pageMapName, Class<? extends IPage> pageClass,
-		PageParameters pageParameters);	
+		PageParameters pageParameters);
+	
+	/**
+	 * @return the namespace for Wicket URLs.
+	 */
+	public String getNamespace();
+	
+	/**
+	 * @return identifier for non bookmarkable URLs
+	 */
+	public String getPageIdentifier();
+	
+	/**
+	 * @return identifier for bookmarkable URLs
+	 */
+	public String getBookmarkableIdentifier();
+	
+	/**
+	 * Returns the listener interface name as string.
+	 * 
+	 * @param listenerInterface
+	 * @return listener interface name as string
+	 */
+	public String requestListenerInterfaceToString(RequestListenerInterface listenerInterface);
+	
+	/**
+	 * Returns listener interface for the name
+	 * 
+	 * @param interfaceName
+	 * @return listener interface
+	 */
+	public RequestListenerInterface requestListenerInterfaceFromString(String interfaceName);
 }

Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java?rev=695546&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/encoder/PageInstanceEncoder.java Mon Sep 15 09:49:28 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 org.apache._wicket.IComponent;
+import org.apache._wicket.IPage;
+import org.apache._wicket.request.RequestHandler;
+import org.apache._wicket.request.Url;
+import org.apache._wicket.request.Url.QueryParameter;
+import org.apache._wicket.request.handler.impl.ListenerInterfaceRequestHandler;
+import org.apache._wicket.request.handler.impl.RenderPageRequestHandler;
+import org.apache._wicket.request.request.Request;
+import org.apache.wicket.RequestListenerInterface;
+
+/**
+ * Decodes and encodes the following URLs:
+ * 
+ * <pre>
+ *  /wicket/page?2
+ *  /wicket/page?2.4
+ *  /wicket/page?abc.2.4
+ * 
+ *  /wicket/page?2:click:foo:bar:baz
+ *  /wicket/page?2.4:click:foo:bar:baz
+ *  /wicket/page?pageMap.2.4:click:foo:bar:baz
+ * </pre>
+ * 
+ * @author Matej Knopp
+ */
+public class PageInstanceEncoder extends AbstractEncoder
+{
+
+	/**
+	 * Construct.
+	 */
+	public PageInstanceEncoder()
+	{
+	}
+
+
+	public RequestHandler decode(Request request)
+	{
+		Url url = request.getUrl();
+		if (urlStartsWith(url, getContext().getNamespace(), getContext().getPageIdentifier()))
+		{
+			PageComponentInfo info = getPageComponentInfo(url);
+			if (info != null)
+			{
+				IPage page = getPageInstance(info.getPageInfo());
+				if (info.getComponentInfo() == null)
+				{
+					// render page
+					return new RenderPageRequestHandler(page);
+				}
+				else
+				{
+					ComponentInfo componentInfo = info.getComponentInfo();
+					// listener interface
+					IComponent component = getComponent(page, componentInfo.getComponentPath());
+					RequestListenerInterface listenerInterface = requestListenerInterfaceFromString(componentInfo.getListenerInterface());
+
+					return new ListenerInterfaceRequestHandler(component, page, listenerInterface);
+				}
+			}
+		}
+		return null;
+	}
+
+	public Url encode(RequestHandler requestHandler)
+	{
+		PageComponentInfo info = null;
+
+		if (requestHandler instanceof RenderPageRequestHandler)
+		{
+			IPage page = ((RenderPageRequestHandler)requestHandler).getPage();
+			if (page.isBookmarkable() && page.wasCreatedBookmarkable())
+			{
+				// this page will be handled by bookmarkable or mounted encoder
+				return null;
+			}
+
+			PageInfo i = new PageInfo(page.getNumericId(), page.getCurrentVersionNumber(),
+				page.getPageMapName());
+			info = new PageComponentInfo(i, null);
+		}
+		else if (requestHandler instanceof ListenerInterfaceRequestHandler)
+		{
+			ListenerInterfaceRequestHandler handler = (ListenerInterfaceRequestHandler)requestHandler;
+			IPage page = handler.getPage();
+			String componentPath = handler.getComponent().getPath();
+			RequestListenerInterface listenerInterface = handler.getListenerInterface();
+
+			PageInfo pageInfo = new PageInfo(page.getNumericId(), page.getCurrentVersionNumber(),
+				page.getPageMapName());
+			ComponentInfo componentInfo = new ComponentInfo(
+				requestListenerInterfaceToString(listenerInterface), componentPath);
+			info = new PageComponentInfo(pageInfo, componentInfo);
+		}
+		
+		if (info != null)
+		{
+			Url url = new Url();
+			url.getSegments().add(getContext().getNamespace());
+			url.getSegments().add(getContext().getPageIdentifier());
+			QueryParameter parameter = new QueryParameter(info.toString(), "");
+			url.getQueryParameters().add(parameter);
+			return url;
+		}
+		else
+		{
+			return null;
+		}
+	}
+
+	public int getMachingSegmentsCount(Request request)
+	{
+		return 2;
+	}
+}

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

Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/ComponentRequestHandler.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/ComponentRequestHandler.java?rev=695546&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/ComponentRequestHandler.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/ComponentRequestHandler.java Mon Sep 15 09:49:28 2008
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+import org.apache._wicket.IComponent;
+import org.apache._wicket.request.RequestHandler;
+
+/**
+ * Request handler that works with a component.
+ * 
+ * @author Matje Knopp
+ */
+public interface ComponentRequestHandler extends RequestHandler
+{
+	/**
+	 * Returns the component instance.
+	 * 
+	 * @return component instance
+	 */
+	public IComponent getComponent();
+}

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

Added: wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
URL: http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/ListenerInterfaceRequestHandler.java?rev=695546&view=auto
==============================================================================
--- wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/ListenerInterfaceRequestHandler.java (added)
+++ wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/handler/impl/ListenerInterfaceRequestHandler.java Mon Sep 15 09:49:28 2008
@@ -0,0 +1,93 @@
+/*
+ * 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.impl;
+
+import org.apache._wicket.IComponent;
+import org.apache._wicket.IPage;
+import org.apache._wicket.PageParameters;
+import org.apache._wicket.RequestCycle;
+import org.apache._wicket.request.handler.ComponentRequestHandler;
+import org.apache._wicket.request.handler.PageRequestHandler;
+import org.apache.wicket.Component;
+import org.apache.wicket.Page;
+import org.apache.wicket.RequestListenerInterface;
+import org.apache.wicket.WicketRuntimeException;
+
+public class ListenerInterfaceRequestHandler implements PageRequestHandler, ComponentRequestHandler
+{
+	private final IComponent component;
+	private final IPage page;
+	private final RequestListenerInterface listenerInterface;
+
+	public ListenerInterfaceRequestHandler(IComponent component, IPage page,
+		RequestListenerInterface listenerInterface)
+	{
+		this.component = component;
+		this.page = page;
+		this.listenerInterface = listenerInterface;
+	}
+
+	public IComponent getComponent()
+	{
+		return component;
+	}
+
+	public IPage getPage()
+	{
+		return page;
+	}
+
+	public Class<? extends IPage> getPageClass()
+	{
+		return page.getClass();
+	}
+
+	public String getPageMapName()
+	{
+		return page.getPageMapName();
+	}
+
+	public PageParameters getPageParameters()
+	{
+		return page.getPageParameters();
+	}
+
+	public void detach(RequestCycle requestCycle)
+	{
+		page.detach();
+	}
+	
+	public RequestListenerInterface getListenerInterface()
+	{
+		return listenerInterface;
+	}
+
+	public void respond(RequestCycle requestCycle)
+	{
+		if (component.getPage() == page)
+		{
+			listenerInterface.invoke((Page)page, (Component)component);
+			requestCycle.replaceCurrentRequestHandler(new RenderPageRequestHandler(page));
+		}
+		else
+		{
+			throw new WicketRuntimeException("Component " + component +
+				" has been removed from page.");
+		}
+	}
+
+}

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