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());
+ }
+
}