Author: knopp
Date: Sat Jan 17 19:15:53 2009
New Revision: 735379

URL: http://svn.apache.org/viewvc?rev=735379&view=rev
Log:
basic request processing

Added:
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/PageManager.java
   (with props)
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/page-management.txt
   (with props)
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WebApplication.java
   (with props)
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WicketFilter.java
   (with props)
Modified:
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/RequestCycle.java
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerStack.java
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/Url.java
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/UrlRenderer.java
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/request/ServletWebRequest.java
    
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt
    
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlRendererTest.java
    
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlTest.java

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/RequestCycle.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/RequestCycle.java?rev=735379&r1=735378&r2=735379&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/RequestCycle.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/RequestCycle.java
 Sat Jan 17 19:15:53 2009
@@ -16,13 +16,15 @@
  */
 package org.apache._wicket;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache._wicket.request.RequestHandler;
 import org.apache._wicket.request.RequestHandlerStack;
 import org.apache._wicket.request.Url;
 import org.apache._wicket.request.UrlRenderer;
 import org.apache._wicket.request.request.Request;
 import org.apache._wicket.request.response.Response;
-import org.apache.wicket.WicketRuntimeException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -121,10 +123,6 @@
        protected RequestHandler resolveRequestHandler()
        {
                RequestHandler handler = context.decodeRequestHandler(request);
-               if (handler == null)
-               {
-                       throw new WicketRuntimeException("Could not resolve 
handler for request.");
-               }
                return handler;
        }
 
@@ -139,13 +137,21 @@
 
        /**
         * Processes the request.
+        * 
+        * @return <code>true</code> if the request resolved to a Wicket 
request, <code>false</code> otherwise. 
         */
-       public void processRequest()
+       public boolean processRequest()
        {
                try
                {
+                       set(this);
                        RequestHandler handler = resolveRequestHandler();
-                       executeRequestHandler(handler);
+                       if (handler != null)
+                       {
+                               executeRequestHandler(handler);
+                               return true;
+                       }
+                       
                }
                catch (Exception e)
                {
@@ -159,6 +165,11 @@
                                log.error("Error during request processing", e);
                        }
                }
+               finally
+               {
+                       set(null);                      
+               }
+               return false;
        }
 
        private void executeExceptionRequestHandler(RequestHandler handler, int 
retryCount)
@@ -259,8 +270,8 @@
        }
 
        /**
-        * Returns the rendered URL for the request handler or 
<code>null</code> if the handler
-        * couldn't have been rendered.
+        * Returns the rendered URL for the request handler or 
<code>null</code> if the handler couldn't
+        * have been rendered.
         * <p>
         * The resulting URL will be relative to current page.
         * 
@@ -279,4 +290,78 @@
                        return null;
                }
        }
+
+       @Override
+       public void detach()
+       {
+               set(this);
+               try
+               {
+                       super.detach();
+               }
+               finally
+               {
+                       for (DetachCallback c : detachCallbacks)
+                       {
+                               try
+                               {
+                                       c.onDetach(this);
+                               }
+                               catch (Exception e)
+                               {
+                                       log.error("Error detaching 
DetachCallback", e);
+                               }
+                               ;
+                       }
+                       ;
+                       set(null);
+               }
+       }
+
+       /**
+        * Registers a callback to be invoked on {...@link RequestCycle} 
detach. The callback will be
+        * invoked after all {...@link RequestHandler}s are detached.
+        * 
+        * @param detachCallback
+        */
+       public void registerDetachCallback(DetachCallback detachCallback)
+       {
+               detachCallbacks.add(detachCallback);
+       };
+
+       private List<DetachCallback> detachCallbacks = new 
ArrayList<DetachCallback>();
+
+       /**
+        * Custom callback invoked on request cycle detach. Detach callbacks 
are invoked after all
+        * {...@link RequestHandler}s are detached.
+        * 
+        * @author Matej Knopp
+        */
+       public interface DetachCallback
+       {
+               /**
+                * Invoked on request cycle detach.
+                * 
+                * @param requestCycle
+                */
+               public void onDetach(RequestCycle requestCycle);
+       };
+
+       /**
+        * Returns request cycle associated with current thread.
+        * 
+        * @return request cycle instance or <code>null</code> if no request 
cycle is associated with
+        *         current thread.
+        */
+       public static RequestCycle get()
+       {
+               return threadLocal.get();
+       }
+
+       private static void set(RequestCycle requestCycle)
+       {
+               threadLocal.set(requestCycle);
+       }
+
+       private static ThreadLocal<RequestCycle> threadLocal = new 
ThreadLocal<RequestCycle>();
 }

Added: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/PageManager.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/PageManager.java?rev=735379&view=auto
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/PageManager.java
 (added)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/PageManager.java
 Sat Jan 17 19:15:53 2009
@@ -0,0 +1,49 @@
+/*
+ * 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.page;
+
+import org.apache.wicket.Page;
+
+/**
+ * Session relative page manager.
+ * 
+ * @author Matej Knopp
+ */
+public interface PageManager
+{
+       /**
+        * Retrieves page instance with given id.
+        * 
+        * @param id
+        * @return page instance or <code>null</code>
+        */
+       public Page getPage(int id);
+       
+       /**
+        * Marks page as changed
+        * 
+        * @param page
+        */
+       public void touchPage(Page page);
+       
+       /**
+        * Increases the page version
+        * 
+        * @param page
+        */
+       public void bumpVersion(Page page);
+}

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

Added: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/page-management.txt
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/page-management.txt?rev=735379&view=auto
==============================================================================
    (empty)

Propchange: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/page/page-management.txt
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WebApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WebApplication.java?rev=735379&view=auto
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WebApplication.java
 (added)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WebApplication.java
 Sat Jan 17 19:15:53 2009
@@ -0,0 +1,100 @@
+/*
+ * 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.protocol.http;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache._wicket.RequestCycle;
+import org.apache._wicket.RequestCycleContext;
+import org.apache._wicket.request.RequestHandler;
+import org.apache._wicket.request.RequestHandlerEncoderRegistry;
+import org.apache._wicket.request.Url;
+import org.apache._wicket.request.request.Request;
+import org.apache._wicket.request.response.Response;
+
+public class WebApplication
+{
+       private final String name;
+
+       public WebApplication(String name)
+       {
+               this.name = name;
+               webApplications.put(name, this);
+       }
+
+       public void destroy()
+       {
+               webApplications.remove(name);
+       }
+
+       protected RequestCycleContext newRequestCycleContext()
+       {
+               RequestCycleContext context = new RequestCycleContext()
+               {
+                       public RequestHandler decodeRequestHandler(Request 
request)
+                       {
+                               return 
getRequestHandlerEncoderRegistry().decode(request);
+                       }
+
+                       public Url encodeRequestHandler(RequestHandler handler)
+                       {
+                               return 
getRequestHandlerEncoderRegistry().encode(handler);
+                       }
+
+                       public RequestHandler 
getRequestHandlerForException(Exception e)
+                       {
+                               return 
WebApplication.this.getRequestHandlerForException(e);
+                       }
+               };
+               return context;
+       };
+
+       protected RequestHandler getRequestHandlerForException(Exception e)
+       {
+               return null;
+       };
+
+       public RequestCycle newRequestCycle(Request request, Response response)
+       {
+               RequestCycleContext context = newRequestCycleContext();
+               return new RequestCycle(request, response, context);
+       };
+
+       private RequestHandlerEncoderRegistry requestHandlerEncoderRegistry;
+
+       public RequestHandlerEncoderRegistry getRequestHandlerEncoderRegistry()
+       {
+               if (requestHandlerEncoderRegistry == null)
+               {
+                       requestHandlerEncoderRegistry = 
newRequestHandlerEncoderRegistry();
+               }
+               return requestHandlerEncoderRegistry;
+       };
+
+       protected RequestHandlerEncoderRegistry 
newRequestHandlerEncoderRegistry()
+       {
+               return new RequestHandlerEncoderRegistry();
+       };
+
+       public static WebApplication get(String name)
+       {
+               return WebApplication.get(name);
+       }
+
+       private static Map<String, WebApplication> webApplications = new 
ConcurrentHashMap<String, WebApplication>();
+}

Propchange: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WebApplication.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WicketFilter.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WicketFilter.java?rev=735379&view=auto
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WicketFilter.java
 (added)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WicketFilter.java
 Sat Jan 17 19:15:53 2009
@@ -0,0 +1,303 @@
+/*
+ * 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.protocol.http;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.ParseException;
+import java.util.ArrayList;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache._wicket.RequestCycle;
+import org.apache._wicket.request.Url;
+import org.apache._wicket.request.request.ServletWebRequest;
+import org.apache._wicket.request.response.ServletWebResponse;
+import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.markup.parser.XmlPullParser;
+import org.apache.wicket.markup.parser.XmlTag;
+import org.apache.wicket.util.resource.ResourceStreamNotFoundException;
+import org.apache.wicket.util.string.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WicketFilter implements Filter
+{
+
+       public void destroy()
+       {
+               if (webApplication != null)
+               {
+                       webApplication.destroy();
+                       webApplication = null;
+               }
+       }
+
+       private boolean checkForTrailingSlash(HttpServletRequest request, 
HttpServletResponse response, String filterPath)
+       {
+               String uri = Strings.stripJSessionId(request.getRequestURI());
+               String s = request.getContextPath() + "/" + filterPath;
+               if (s.endsWith("/"))
+               {
+                       s = s.substring(0, s.length() - 1);
+               }
+               
+               if (uri.equals(s) && !uri.endsWith("/"))
+               {
+                       String redirect = uri + "/";
+                       if (!Strings.isEmpty(request.getQueryString()))
+                       {
+                               redirect += "?" + request.getQueryString();
+                       }
+                       try
+                       {
+                               
response.sendRedirect(response.encodeRedirectURL(redirect));
+                       }
+                       catch (IOException e)
+                       {
+                               throw new RuntimeException(e);
+                       }
+                       return false;
+               }
+               
+               return true;
+       }
+       
+       public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain)
+               throws IOException, ServletException
+       {
+               HttpServletRequest httpServletRequest = (HttpServletRequest) 
request;
+               HttpServletResponse httpServletResponse = (HttpServletResponse) 
response;
+               
+               String filterPath = getFilterPath(httpServletRequest);
+                       
+               if (checkForTrailingSlash(httpServletRequest, 
httpServletResponse, filterPath))
+               {               
+                       ServletWebRequest req = new 
ServletWebRequest(httpServletRequest, filterPath);
+                       ServletWebResponse resp = new 
ServletWebResponse(httpServletResponse);
+                       
+                       System.out.println(">>>" + req.getUrl() + "<<<");
+                                       
+                       RequestCycle requestCycle = 
webApplication.newRequestCycle(req, resp);
+                                       
+                       
System.out.println(requestCycle.getUrlRenderer().renderUrl(Url.parse("xxx/yyy")));
+                       
+                       if (requestCycle.processRequest())
+                       {
+                               requestCycle.detach();  
+                       }
+                       else
+                       {
+                               chain.doFilter(request, response);              
        
+                       }
+               }
+       }
+
+       private WebApplication webApplication;
+
+       public void init(FilterConfig filterConfig) throws ServletException
+       {
+               webApplication = new 
WebApplication(filterConfig.getFilterName());
+               this.filterConfig = filterConfig;
+               initFilterPath();
+       }
+
+       private void initFilterPath()
+       {
+               InputStream is = 
filterConfig.getServletContext().getResourceAsStream("/WEB-INF/web.xml");
+               if (is != null)
+               {
+                       try
+                       {
+                               filterPath = 
getFilterPath(filterConfig.getFilterName(), is);
+                       }
+                       catch (ServletException e)
+                       {
+                               log.error("Error reading servlet/filter path 
from web.xml", e);
+                       }
+                       catch (SecurityException e)
+                       {
+                               // Swallow this at INFO.
+                               log.info("Couldn't read web.xml to 
automatically pick up servlet/filter path: " +
+                                       e.getMessage());
+                       }
+                       if (filterPath == null)
+                       {
+                               log.info("Unable to parse filter mapping 
web.xml for " +
+                                       filterConfig.getFilterName() + ". " + 
"Configure with init-param " +
+                                       FILTER_MAPPING_PARAM + " if it is not 
\"/*\".");
+                       }
+               }
+       };
+
+       private FilterConfig filterConfig;
+       private String filterPath;
+
+       private boolean servletMode = false;
+
+       private String getFilterPath(String filterName, InputStream is) throws 
ServletException
+       {
+               String prefix = servletMode ? "servlet" : "filter";
+               String mapping = prefix + "-mapping";
+               String name = prefix + "-name";
+
+               // Filter mappings look like this:
+               //
+               // <filter-mapping> <filter-name>WicketFilter</filter-name>
+               // <url-pattern>/*</url-pattern> <...> <filter-mapping>
+               try
+               {
+                       ArrayList<String> urlPatterns = new ArrayList<String>();
+                       XmlPullParser parser = new XmlPullParser();
+                       parser.parse(is);
+
+                       while (true)
+                       {
+                               XmlTag elem;
+                               do
+                               {
+                                       elem = (XmlTag)parser.nextTag();
+                               }
+                               while (elem != null && 
(!(elem.getName().equals(mapping) && elem.isOpen())));
+
+                               if (elem == null)
+                               {
+                                       break;
+                               }
+
+                               String encounteredFilterName = null, urlPattern 
= null;
+
+                               do
+                               {
+                                       elem = (XmlTag)parser.nextTag();
+                                       if (elem.isOpen())
+                                       {
+                                               parser.setPositionMarker();
+                                       }
+                                       else if (elem.isClose() && 
elem.getName().equals(name))
+                                       {
+                                               encounteredFilterName = 
parser.getInputFromPositionMarker(elem.getPos())
+                                                       .toString()
+                                                       .trim();
+                                       }
+                                       else if (elem.isClose() && 
elem.getName().equals("url-pattern"))
+                                       {
+                                               urlPattern = 
parser.getInputFromPositionMarker(elem.getPos())
+                                                       .toString()
+                                                       .trim();
+                                       }
+                               }
+                               while (urlPattern == null || 
encounteredFilterName == null);
+
+                               if (filterName.equals(encounteredFilterName))
+                               {
+                                       urlPatterns.add(urlPattern);
+                               }
+                       }
+
+                       String prefixUppered = 
Character.toUpperCase(prefix.charAt(0)) + prefix.substring(1);
+
+                       // By the time we get here, we have a list of 
urlPatterns we match
+                       // this filter against.
+                       // In all likelihood, we will only have one. If we have 
none, we
+                       // have an error.
+                       // If we have more than one, we pick the first one to 
use for any
+                       // 302 redirects that require absolute URLs.
+                       if (urlPatterns.size() == 0)
+                       {
+                               throw new IllegalArgumentException("Error 
initializing Wicket" + prefixUppered +
+                                       " - you have no <" + mapping + "> 
element with a url-pattern that uses " +
+                                       prefix + ": " + filterName);
+                       }
+                       String urlPattern = urlPatterns.get(0);
+
+                       // Check for leading '/' and trailing '*'.
+                       if (!urlPattern.startsWith("/") || 
!urlPattern.endsWith("*"))
+                       {
+                               throw new IllegalArgumentException("<" + 
mapping + "> for Wicket" + prefixUppered +
+                                       " \"" + filterName + "\" must start 
with '/' and end with '*'.");
+                       }
+
+                       // Strip trailing '*' and keep leading '/'.
+                       return stripWildcard(urlPattern);
+               }
+               catch (IOException e)
+               {
+                       throw new ServletException("Error finding <" + prefix + 
"> " + filterName +
+                               " in web.xml", e);
+               }
+               catch (ParseException e)
+               {
+                       throw new ServletException("Error finding <" + prefix + 
"> " + filterName +
+                               " in web.xml", e);
+               }
+               catch (ResourceStreamNotFoundException e)
+               {
+                       throw new ServletException("Error finding <" + prefix + 
"> " + filterName +
+                               " in web.xml", e);
+               }
+       }
+
+       protected String getFilterPath(HttpServletRequest request)
+       {
+               if (filterPath != null)
+               {
+                       return filterPath;
+               }
+               if (servletMode)
+               {
+                       return filterPath = request.getServletPath();
+               }
+               String result;
+               // Legacy migration check.
+               // TODO: Remove this after 1.3 is released and everyone's 
upgraded.
+
+               result = filterConfig.getInitParameter(FILTER_MAPPING_PARAM);
+               if (result == null || result.equals("/*"))
+               {
+                       return "";
+               }
+               else if (!result.startsWith("/") || !result.endsWith("/*"))
+               {
+                       throw new WicketRuntimeException("Your " + 
FILTER_MAPPING_PARAM +
+                               " must start with \"/\" and end with \"/*\". It 
is: " + result);
+               }
+               return filterPath = stripWildcard(result);
+       }
+
+       /**
+        * Strip trailing '*' and keep leading '/'
+        * 
+        * @param result
+        * @return The stripped String
+        */
+       private String stripWildcard(String result)
+       {
+               return result.substring(1, result.length() - 1);
+       }
+       
+       private static final Logger log = 
LoggerFactory.getLogger(WicketFilter.class);
+       
+       public static final String FILTER_MAPPING_PARAM = 
"filterMappingUrlPattern";
+}

Propchange: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/protocol/http/WicketFilter.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerStack.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerStack.java?rev=735379&r1=735378&r2=735379&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerStack.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/RequestHandlerStack.java
 Sat Jan 17 19:15:53 2009
@@ -192,7 +192,7 @@
         * Detaches all {...@link RequestHandler}s.
         */
        public void detach()
-       {
+       {               
                if (!requestHandlers.isEmpty())
                {
                        // All requests handlers should be inactive at this 
point

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/Url.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/Url.java?rev=735379&r1=735378&r2=735379&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/Url.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/Url.java
 Sat Jan 17 19:15:53 2009
@@ -121,6 +121,16 @@
        }
 
        /**
+        * Returns whether the URL is absolute.
+        * 
+        * @return <code>true</code> if URL is absolute, <code>false</code> 
otherwise.
+        */
+       public boolean isAbsolute()
+       {
+               return !getSegments().isEmpty() && 
Strings.isEmpty(getSegments().get(0));
+       }
+       
+       /**
         * Convenience method that removes all query parameters with given name.
         * 
         * @param name
@@ -333,16 +343,18 @@
        public String toString()
        {
                StringBuilder result = new StringBuilder();
+               boolean first = true;
                for (String s : getSegments())
                {
-                       if (result.length() > 0)
+                       if (!first)
                        {
                                result.append('/');
                        }
+                       first = false;
                        result.append(encodeSegment(s));
                }
 
-               boolean first = true;
+               first = true;
 
                for (QueryParameter p : getQueryParameters())
                {

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/UrlRenderer.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/UrlRenderer.java?rev=735379&r1=735378&r2=735379&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/UrlRenderer.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/UrlRenderer.java
 Sat Jan 17 19:15:53 2009
@@ -76,7 +76,8 @@
        private Url baseUrl;
 
        /**
-        * Renders the Url relative to currently set Base Url. 
+        * Renders the Url relative to currently set Base Url.
+        * 
         * @param url
         * @return Url rendered as string
         */
@@ -86,26 +87,35 @@
                {
                        throw new IllegalArgumentException("Argument 'url' may 
not be null.");
                }
-               List<String> baseUrlSegments = getBaseUrl().getSegments();
-               List<String> urlSegments = new 
ArrayList<String>(url.getSegments());
-               
-               int common = 0;
-               for (String s : baseUrlSegments)
+
+               if (url.isAbsolute())
                {
-                       if (!urlSegments.isEmpty() && 
s.equals(urlSegments.get(0)))
-                       {
-                               ++common;
-                               urlSegments.remove(0);
-                       }
+                       return url.toString();
                }
-               
-               List<String> newSegments = new ArrayList<String>();
-               for (int i = common; i < baseUrlSegments.size(); ++i)
+               else
                {
-                       newSegments.add("..");
+                       List<String> baseUrlSegments = 
getBaseUrl().getSegments();
+                       List<String> urlSegments = new 
ArrayList<String>(url.getSegments());
+
+                       List<String> newSegments = new ArrayList<String>();
+                       
+                       int common = 0;
+                       for (String s : baseUrlSegments)
+                       {
+                               if (!urlSegments.isEmpty() && 
s.equals(urlSegments.get(0)))
+                               {
+                                       ++common;
+                                       urlSegments.remove(0);
+                               }
+                       }
+                       
+                       for (int i = common + 1; i < baseUrlSegments.size(); 
++i)
+                       {
+                               newSegments.add("..");
+                       }
+                       newSegments.addAll(urlSegments);
+
+                       return new Url(newSegments, 
url.getQueryParameters()).toString();
                }
-               newSegments.addAll(urlSegments);
-               
-               return new Url(newSegments, 
url.getQueryParameters()).toString();
        }
 }

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/request/ServletWebRequest.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/request/ServletWebRequest.java?rev=735379&r1=735378&r2=735379&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/request/ServletWebRequest.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/request/ServletWebRequest.java
 Sat Jan 17 19:15:53 2009
@@ -71,7 +71,8 @@
                        filterPrefix += "/";
                }
                StringBuilder url = new StringBuilder();
-               
url.append(Strings.stripJSessionId(request.getRequestURI().substring(filterPrefix.length())));
+               String uri = request.getRequestURI();
+               
url.append(Strings.stripJSessionId(request.getRequestURI().substring(request.getContextPath().length()
 + filterPrefix.length() + 1)));          
                
                String query = request.getQueryString();
                if (!Strings.isEmpty(query))

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt?rev=735379&r1=735378&r2=735379&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/main/java/org/apache/_wicket/request/url-format.txt
 Sat Jan 17 19:15:53 2009
@@ -43,8 +43,8 @@
 /mount/point?2
 
 Page Instance - Bookmarkable Listener 
(BookmarkableListenerInterfaceRequestHandler for mounted pages) 
-/mount/point?2-click-foo-bar-baz
-/mount/point?2-click.1-foo-bar-baz (1 is behavior index)
+/mount/point?2-5.click-foo-bar-baz (5 is render count)
+/mount/point?2-5.click.1-foo-bar-baz (5 is render count, 1 is behavior index)
 (these will redirect to hybrid if page is not stateless)
 
 mount path can also contain parameter placeholders

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlRendererTest.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlRendererTest.java?rev=735379&r1=735378&r2=735379&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlRendererTest.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlRendererTest.java
 Sat Jan 17 19:15:53 2009
@@ -32,9 +32,9 @@
        public void test1()
        {
                UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"));
-               assertEquals("../xyz?x=y", 
r1.renderUrl(Url.parse("foo/bar/xyz?x=y")));
-               assertEquals("../../aaa/xyz?x=y", 
r1.renderUrl(Url.parse("foo/aaa/xyz?x=y")));
-               assertEquals("../../../bbb/aaa/xyz?x=y", 
r1.renderUrl(Url.parse("bbb/aaa/xyz?x=y")));
+               assertEquals("xyz?x=y", 
r1.renderUrl(Url.parse("foo/bar/xyz?x=y")));
+               assertEquals("../aaa/xyz?x=y", 
r1.renderUrl(Url.parse("foo/aaa/xyz?x=y")));
+               assertEquals("../../bbb/aaa/xyz?x=y", 
r1.renderUrl(Url.parse("bbb/aaa/xyz?x=y")));
        }
        
        /**
@@ -43,8 +43,8 @@
        public void test2()
        {
                UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"));
-               assertEquals("../..?x=y", r1.renderUrl(Url.parse("foo?x=y")));
-               assertEquals("../../../aaa?x=y", 
r1.renderUrl(Url.parse("aaa?x=y")));
+               assertEquals("..?x=y", r1.renderUrl(Url.parse("foo?x=y")));
+               assertEquals("../../aaa?x=y", 
r1.renderUrl(Url.parse("aaa?x=y")));
        }
        
        /**

Modified: 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlTest.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlTest.java?rev=735379&r1=735378&r2=735379&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlTest.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket/src/test/java/org/apache/_wicket/request/UrlTest.java
 Sat Jan 17 19:15:53 2009
@@ -162,4 +162,70 @@
                assertEquals("foo/b=r/b&z/x%3F?a=b&x?%264=y%3Dz", 
url.toString());
        }
 
+       /**
+        * 
+        */
+       public void testRender2()
+       {
+               String s = "/absolute/url";
+               Url url = Url.parse(s);
+               assertEquals(url.toString(), s);
+       }
+       
+       /**
+        * 
+        */
+       public void testRender3()
+       {
+               String s = "//absolute/url";
+               Url url = Url.parse(s);
+               assertEquals(url.toString(), s);
+       }
+       
+       /**
+        * 
+        */
+       public void testRender4()
+       {
+               String s = "/";
+               Url url = Url.parse(s);
+               assertEquals(url.toString(), s);
+       }
+
+       /**
+        * 
+        */
+       public void testAbsolute1()
+       {
+               Url url = Url.parse("abc/efg");
+               assertFalse(url.isAbsolute());
+       }
+       
+       /**
+        * 
+        */
+       public void testAbsolute2()
+       {
+               Url url = Url.parse("");
+               assertFalse(url.isAbsolute());
+       }
+       
+       /**
+        * 
+        */
+       public void testAbsolute3()
+       {
+               Url url = Url.parse("/");
+               assertTrue(url.isAbsolute());
+       }
+       
+       /**
+        * 
+        */
+       public void testAbsolute4()
+       {
+               Url url = Url.parse("/abc/efg");
+               assertTrue(url.isAbsolute());
+       }
+
 }


Reply via email to