You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/03/07 09:39:03 UTC
[10/19] WICKET-4439 Move classes around so that there are no two
packages with the same name in different modules
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractComponentMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractComponentMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractComponentMapper.java
deleted file mode 100644
index 095463b..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractComponentMapper.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * 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.mapper;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.RequestListenerInterface;
-import org.apache.wicket.request.IRequestMapper;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.Url.QueryParameter;
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.mapper.info.PageComponentInfo;
-import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.lang.WicketObjects;
-import org.apache.wicket.util.string.Strings;
-
-/**
- * Convenience class for implementing page/components related encoders.
- *
- * @author Matej Knopp
- */
-public abstract class AbstractComponentMapper extends AbstractMapper implements IRequestMapper
-{
- /**
- * Construct.
- */
- public AbstractComponentMapper()
- {
- }
-
- protected IMapperContext getContext()
- {
- return Application.get().getMapperContext();
- }
-
- /**
- * Converts the specified listener interface to String.
- *
- * @param listenerInterface
- * @return listenerInterface name as string
- */
- protected String requestListenerInterfaceToString(RequestListenerInterface listenerInterface)
- {
- Args.notNull(listenerInterface, "listenerInterface");
-
- return getContext().requestListenerInterfaceToString(listenerInterface);
- }
-
- /**
- * Creates listener interface from the specified string
- *
- * @param interfaceName
- * @return listener interface
- */
- protected RequestListenerInterface requestListenerInterfaceFromString(String interfaceName)
- {
- Args.notEmpty(interfaceName, "interfaceName");
-
- return getContext().requestListenerInterfaceFromString(interfaceName);
- }
-
- /**
- * Extracts the {@link PageComponentInfo} from the URL. The {@link PageComponentInfo} is encoded
- * as the very first query parameter and the parameter consists of name only (no value).
- *
- * @param url
- *
- * @return PageComponentInfo instance if one was encoded in URL, <code>null</code> otherwise.
- */
- protected PageComponentInfo getPageComponentInfo(final Url url)
- {
- if (url == null)
- {
- throw new IllegalStateException("Argument 'url' may not be null.");
- }
- else
- {
- for (QueryParameter queryParameter : url.getQueryParameters())
- {
- if (Strings.isEmpty(queryParameter.getValue()))
- {
- PageComponentInfo pageComponentInfo = PageComponentInfo.parse(queryParameter.getName());
- if (pageComponentInfo != null)
- {
- return pageComponentInfo;
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Encodes the {@link PageComponentInfo} instance as the first query string parameter to the
- * URL.
- *
- * @param url
- * @param info
- */
- protected void encodePageComponentInfo(Url url, PageComponentInfo info)
- {
- Args.notNull(url, "url");
-
- if (info != null)
- {
- String s = info.toString();
- if (!Strings.isEmpty(s))
- {
- QueryParameter parameter = new QueryParameter(s, "");
- url.getQueryParameters().add(parameter);
- }
- }
- }
-
- /**
- * Loads page class with given name.
- *
- * @param name
- * @return class
- */
- protected Class<? extends IRequestablePage> getPageClass(String name)
- {
- Args.notEmpty(name, "name");
-
- return WicketObjects.resolveClass(name);
- }
-
- /**
- * {@inheritDoc}
- *
- * Removes the first query parameter only if {@link PageComponentInfo#parse(String)} returns
- * non-null instance
- */
- @Override
- protected void removeMetaParameter(final Url urlCopy)
- {
- String pageComponentInfoCandidate = urlCopy.getQueryParameters().get(0).getName();
- if (PageComponentInfo.parse(pageComponentInfoCandidate) != null)
- {
- urlCopy.getQueryParameters().remove(0);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java
deleted file mode 100644
index 674bbc0..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/AbstractResourceReferenceMapper.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * 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.mapper;
-
-import java.util.Locale;
-
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.Url.QueryParameter;
-import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.string.Strings;
-
-/**
- * Base class for encoding and decoding {@link ResourceReference}s
- *
- * @author Matej Knopp
- */
-public abstract class AbstractResourceReferenceMapper extends AbstractComponentMapper
-{
-
- protected final String encodeResourceReferenceAttributes(
- ResourceReference.UrlAttributes attributes)
- {
- if (attributes == null ||
- (attributes.getLocale() == null && attributes.getStyle() == null && attributes.getVariation() == null))
- {
- return null;
- }
- else
- {
- StringBuilder res = new StringBuilder();
- if (attributes.getLocale() != null)
- {
- res.append(attributes.getLocale().toString());
- }
- boolean styleEmpty = Strings.isEmpty(attributes.getStyle());
- if (!styleEmpty)
- {
- res.append('-');
- res.append(attributes.getStyle());
- }
- if (!Strings.isEmpty(attributes.getVariation()))
- {
- if (styleEmpty)
- {
- res.append("--");
- }
- else
- {
- res.append('-');
- }
- res.append(attributes.getVariation());
- }
- return res.toString();
- }
- }
-
- private static String nonEmpty(String s)
- {
- if (Strings.isEmpty(s))
- {
- return null;
- }
- else
- {
- return s;
- }
- }
-
- protected final ResourceReference.UrlAttributes decodeResourceReferenceAttributes(
- String attributes)
- {
- Locale locale = null;
- String style = null;
- String variation = null;
-
- if (!Strings.isEmpty(attributes))
- {
- String split[] = attributes.split("-", 3);
- locale = parseLocale(split[0]);
- if (split.length == 2)
- {
- style = nonEmpty(split[1]);
- }
- else if (split.length == 3)
- {
- style = nonEmpty(split[1]);
- variation = nonEmpty(split[2]);
- }
- }
- return new ResourceReference.UrlAttributes(locale, style, variation);
- }
-
- private static Locale parseLocale(String locale)
- {
- if (Strings.isEmpty(locale))
- {
- return null;
- }
- else
- {
- String parts[] = locale.toLowerCase().split("_", 3);
- if (parts.length == 1)
- {
- return new Locale(parts[0]);
- }
- else if (parts.length == 2)
- {
- return new Locale(parts[0], parts[1]);
- }
- else if (parts.length == 3)
- {
- return new Locale(parts[0], parts[1], parts[2]);
- }
- else
- {
- return null;
- }
- }
- }
-
- protected void encodeResourceReferenceAttributes(Url url, ResourceReference reference)
- {
- String encoded = encodeResourceReferenceAttributes(reference.getUrlAttributes());
- if (!Strings.isEmpty(encoded))
- {
- url.getQueryParameters().add(new Url.QueryParameter(encoded, ""));
- }
- }
-
- protected ResourceReference.UrlAttributes getResourceReferenceAttributes(Url url)
- {
- Args.notNull(url, "url");
-
- if (url.getQueryParameters().size() > 0)
- {
- QueryParameter param = url.getQueryParameters().get(0);
- if (Strings.isEmpty(param.getValue()))
- {
- return decodeResourceReferenceAttributes(param.getName());
- }
- }
- return new ResourceReference.UrlAttributes(null, null, null);
- }
-
-
- /**
- * {@inheritDoc}
- *
- * Remove the first parameter because it brings meta information like locale
- */
- @Override
- protected void removeMetaParameter(final Url urlCopy)
- {
- urlCopy.getQueryParameters().remove(0);
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java
deleted file mode 100755
index bb4414e..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/BasicResourceReferenceMapper.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * 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.mapper;
-
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
-import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.resource.IResource;
-import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
-import org.apache.wicket.request.resource.MetaInfStaticResourceReference;
-import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
-import org.apache.wicket.request.resource.caching.ResourceUrl;
-import org.apache.wicket.util.IProvider;
-import org.apache.wicket.util.lang.WicketObjects;
-import org.apache.wicket.util.string.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Generic {@link ResourceReference} encoder that encodes and decodes non-mounted
- * {@link ResourceReference}s.
- * <p>
- * Decodes and encodes the following URLs:
- *
- * <pre>
- * /wicket/resource/org.apache.wicket.ResourceScope/name
- * /wicket/resource/org.apache.wicket.ResourceScope/name?en
- * /wicket/resource/org.apache.wicket.ResourceScope/name?-style
- * /wicket/resource/org.apache.wicket.ResourceScope/resource/name.xyz?en_EN-style
- * </pre>
- *
- * @author Matej Knopp
- * @author igor.vaynberg
- * @author Peter Ertl
- */
-class BasicResourceReferenceMapper extends AbstractResourceReferenceMapper
-{
- private static final Logger log = LoggerFactory.getLogger(BasicResourceReferenceMapper.class);
-
- private final IPageParametersEncoder pageParametersEncoder;
-
- /** resource caching strategy */
- private final IProvider<? extends IResourceCachingStrategy> cachingStrategy;
-
- /**
- * Construct.
- *
- * @param pageParametersEncoder
- * @param cachingStrategy
- */
- public BasicResourceReferenceMapper(IPageParametersEncoder pageParametersEncoder,
- IProvider<? extends IResourceCachingStrategy> cachingStrategy)
- {
- this.pageParametersEncoder = pageParametersEncoder;
- this.cachingStrategy = cachingStrategy;
- }
-
- @Override
- public IRequestHandler mapRequest(Request request)
- {
- Url url = request.getUrl();
-
- // extract the PageParameters from URL if there are any
- PageParameters pageParameters = extractPageParameters(request, url.getSegments().size(),
- pageParametersEncoder);
-
- if (url.getSegments().size() >= 4 &&
- urlStartsWith(url, getContext().getNamespace(), getContext().getResourceIdentifier()))
- {
- String className = url.getSegments().get(2);
- StringBuilder name = new StringBuilder();
- int segmentsSize = url.getSegments().size();
- for (int i = 3; i < segmentsSize; ++i)
- {
- String segment = url.getSegments().get(i);
-
- // skip possibly malicious segments
- if (segment.contains("/"))
- {
- return null;
- }
-
- // remove caching information
- if (i + 1 == segmentsSize && Strings.isEmpty(segment) == false)
- {
- // The filename + parameters eventually contain caching
- // related information which needs to be removed
- ResourceUrl resourceUrl = new ResourceUrl(segment, pageParameters);
- getCachingStrategy().undecorateUrl(resourceUrl);
- segment = resourceUrl.getFileName();
-
- if (Strings.isEmpty(segment))
- {
- throw new IllegalStateException("caching strategy returned empty name for " + resourceUrl);
- }
- }
- if (name.length() > 0)
- {
- name.append("/");
- }
- name.append(segment);
- }
-
- ResourceReference.UrlAttributes attributes = getResourceReferenceAttributes(url);
-
- Class<?> scope = resolveClass(className);
-
- if (scope != null && scope.getPackage() != null)
- {
- ResourceReference res = getContext().getResourceReferenceRegistry()
- .getResourceReference(scope, name.toString(), attributes.getLocale(),
- attributes.getStyle(), attributes.getVariation(), true, true);
-
- if (res != null)
- {
- return new ResourceReferenceRequestHandler(res, pageParameters);
- }
- }
- }
- return null;
- }
-
- private IResourceCachingStrategy getCachingStrategy()
- {
- return cachingStrategy.get();
- }
-
- protected Class<?> resolveClass(String name)
- {
- return WicketObjects.resolveClass(name);
- }
-
- protected String getClassName(Class<?> scope)
- {
- return scope.getName();
- }
-
- @Override
- public Url mapHandler(IRequestHandler requestHandler)
- {
- if (requestHandler instanceof ResourceReferenceRequestHandler)
- {
- ResourceReferenceRequestHandler referenceRequestHandler = (ResourceReferenceRequestHandler)requestHandler;
- ResourceReference reference = referenceRequestHandler.getResourceReference();
-
- Url url;
-
- if (reference instanceof MetaInfStaticResourceReference)
- {
- url = ((MetaInfStaticResourceReference)reference).mapHandler(referenceRequestHandler);
- // if running on Servlet 3.0 engine url is not null
- if (url != null)
- {
- return url;
- }
- // otherwise it has to be served by the standard wicket way
- }
-
- url = new Url();
-
- List<String> segments = url.getSegments();
- segments.add(getContext().getNamespace());
- segments.add(getContext().getResourceIdentifier());
- segments.add(getClassName(reference.getScope()));
-
- // setup resource parameters
- PageParameters parameters = referenceRequestHandler.getPageParameters();
-
- if (parameters == null)
- {
- parameters = new PageParameters();
- }
- else
- {
- parameters = new PageParameters(parameters);
-
- // need to remove indexed parameters otherwise the URL won't be able to decode
- parameters.clearIndexed();
- }
- encodeResourceReferenceAttributes(url, reference);
-
- StringTokenizer tokens = new StringTokenizer(reference.getName(), "/");
-
- while (tokens.hasMoreTokens())
- {
- String token = tokens.nextToken();
-
- // on the last component of the resource path
- if (tokens.hasMoreTokens() == false && Strings.isEmpty(token) == false)
- {
- final IResource resource = reference.getResource();
-
- // apply caching if required
- if (resource instanceof IStaticCacheableResource)
- {
- // add caching related information to filename + query parameters
- final IStaticCacheableResource cacheable = (IStaticCacheableResource)resource;
- final ResourceUrl resourceUrl = new ResourceUrl(token, parameters);
- getCachingStrategy().decorateUrl(resourceUrl, cacheable);
- token = resourceUrl.getFileName();
-
- if (Strings.isEmpty(token))
- {
- throw new IllegalStateException("caching strategy returned empty name for " + resource);
- }
- }
- }
- segments.add(token);
- }
-
- if (parameters.isEmpty() == false)
- {
- url = encodePageParameters(url, parameters, pageParametersEncoder);
- }
-
- return url;
- }
- return null;
- }
-
- @Override
- public int getCompatibilityScore(Request request)
- {
- Url url = request.getUrl();
-
- int score = -1;
- if (url.getSegments().size() >= 4 &&
- urlStartsWith(url, getContext().getNamespace(), getContext().getResourceIdentifier()))
- {
- score = 1;
- }
-
- return score;
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/BookmarkableMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/BookmarkableMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/BookmarkableMapper.java
deleted file mode 100644
index 759f389..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/BookmarkableMapper.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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.mapper;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.mapper.info.PageComponentInfo;
-import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
-import org.apache.wicket.util.lang.Args;
-
-/**
- * Decodes and encodes the following URLs:
- *
- * <pre>
- * Page Class - Render (BookmarkablePageRequestHandler)
- * /wicket/bookmarkable/org.apache.wicket.MyPage
- * (will redirect to hybrid alternative if page is not stateless)
- *
- * Page Instance - Render Hybrid (RenderPageRequestHandler for pages that were created using bookmarkable URLs)
- * /wicket/bookmarkable/org.apache.wicket.MyPage?2
- *
- * Page Instance - Bookmarkable Listener (BookmarkableListenerInterfaceRequestHandler)
- * /wicket/bookmarkable/org.apache.wicket.MyPage?2-click-foo-bar-baz
- * /wicket/bookmarkable/org.apache.wicket.MyPage?2-click.1-foo-bar-baz (1 is behavior index)
- * (these will redirect to hybrid if page is not stateless)
- * </pre>
- *
- * @author Matej Knopp
- */
-public class BookmarkableMapper extends AbstractBookmarkableMapper
-{
- private final IPageParametersEncoder pageParametersEncoder;
-
- /**
- * Construct.
- *
- * @param pageParametersEncoder
- */
- public BookmarkableMapper(IPageParametersEncoder pageParametersEncoder)
- {
- Args.notNull(pageParametersEncoder, "pageParametersEncoder");
-
- this.pageParametersEncoder = pageParametersEncoder;
- }
-
- /**
- * Construct.
- */
- public BookmarkableMapper()
- {
- this(new PageParametersEncoder());
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#buildUrl(org.apache.wicket.request.mapper.AbstractBookmarkableMapper.UrlInfo)
- */
- @Override
- protected Url buildUrl(UrlInfo info)
- {
- Url url = new Url();
- url.getSegments().add(getContext().getNamespace());
- url.getSegments().add(getContext().getBookmarkableIdentifier());
- url.getSegments().add(info.getPageClass().getName());
-
- encodePageComponentInfo(url, info.getPageComponentInfo());
-
- return encodePageParameters(url, info.getPageParameters(), pageParametersEncoder);
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request)
- */
- @Override
- protected UrlInfo parseRequest(Request request)
- {
- if (Application.exists())
- {
- if (Application.get().getSecuritySettings().getEnforceMounts())
- {
- return null;
- }
- }
-
- Url url = request.getUrl();
- if (matches(url))
- {
- // try to extract page and component information from URL
- PageComponentInfo info = getPageComponentInfo(url);
-
- // load the page class
- String className = url.getSegments().get(2);
- Class<? extends IRequestablePage> pageClass = getPageClass(className);
-
- if (pageClass != null && IRequestablePage.class.isAssignableFrom(pageClass))
- {
-
- // extract the PageParameters from URL if there are any
- PageParameters pageParameters = extractPageParameters(request, 3,
- pageParametersEncoder);
-
- return new UrlInfo(info, pageClass, pageParameters);
- }
- }
- return null;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#pageMustHaveBeenCreatedBookmarkable()
- */
- @Override
- protected boolean pageMustHaveBeenCreatedBookmarkable()
- {
- return true;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
- @Override
- public int getCompatibilityScore(Request request)
- {
- int score = 0;
- Url url = request.getUrl();
- if (matches(url))
- {
- score = Integer.MAX_VALUE;
- }
- return score;
- }
-
- private boolean matches(final Url url)
- {
- return (url.getSegments().size() >= 3 && urlStartsWith(url, getContext().getNamespace(),
- getContext().getBookmarkableIdentifier()));
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/BufferedResponseMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/BufferedResponseMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/BufferedResponseMapper.java
deleted file mode 100644
index 66bbfd7..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/BufferedResponseMapper.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * 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.mapper;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.Session;
-import org.apache.wicket.protocol.http.BufferedWebResponse;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.request.IRequestCycle;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.IRequestMapper;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.request.handler.BufferedResponseRequestHandler;
-import org.apache.wicket.session.ISessionStore;
-import org.apache.wicket.util.string.Strings;
-
-/**
- * Encoder that intercepts requests for which there is already stored buffer with rendered data.
- *
- * @author Matej Knopp
- */
-public class BufferedResponseMapper implements IRequestMapper
-{
- /**
- * Construct.
- */
- public BufferedResponseMapper()
- {
- }
-
- /**
- * @return the current session id for stateful pages and <code>null</code> for stateless pages
- * and non-http threads
- */
- protected String getSessionId()
- {
- String sessionId = null;
-
- if (Application.exists() && RequestCycle.get() != null)
- {
- ISessionStore sessionStore = Application.get().getSessionStore();
- IRequestCycle requestCycle = RequestCycle.get();
- Session session = sessionStore.lookup(requestCycle.getRequest());
- if (session != null)
- {
- sessionId = session.getId();
- }
- }
-
- return sessionId;
- }
-
- protected boolean hasBufferedResponse(Url url)
- {
- String sessionId = getSessionId();
- boolean hasResponse = false;
- if (Strings.isEmpty(sessionId) == false)
- {
- hasResponse = WebApplication.get().hasBufferedResponse(sessionId, url);
- }
- return hasResponse;
- }
-
- protected BufferedWebResponse getAndRemoveBufferedResponse(Url url)
- {
- String sessionId = getSessionId();
- BufferedWebResponse response = null;
- if (Strings.isEmpty(sessionId) == false)
- {
- response = WebApplication.get().getAndRemoveBufferedResponse(sessionId, url);
- }
- return response;
- }
-
- private Request getRequest(Request original)
- {
- // The buffers are stored under "real" URL which can be different
- // than the URL handlers get due to global URL pre/postprocessing
- // (i.e. prepending URL with language segment).
- // Because of that we need find out the real URL from request cycle
-
- if (RequestCycle.get() != null)
- {
- return RequestCycle.get().getRequest();
- }
- else
- {
- return original;
- }
- }
-
- /**
- * @see org.apache.wicket.request.IRequestMapper#mapRequest(org.apache.wicket.request.Request)
- */
- @Override
- public IRequestHandler mapRequest(Request request)
- {
- request = getRequest(request);
-
- BufferedWebResponse response = getAndRemoveBufferedResponse(request.getUrl());
- if (response != null)
- {
- return new BufferedResponseRequestHandler(response);
- }
- else
- {
- return null;
- }
- }
-
- /**
- * @see org.apache.wicket.request.IRequestMapper#mapHandler(org.apache.wicket.request.IRequestHandler)
- */
- @Override
- public Url mapHandler(IRequestHandler requestHandler)
- {
- return null;
- }
-
- /**
- * @see org.apache.wicket.request.IRequestMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
- @Override
- public int getCompatibilityScore(Request request)
- {
- request = getRequest(request);
-
- if (hasBufferedResponse(request.getUrl()))
- {
- return Integer.MAX_VALUE;
- }
- else
- {
- return 0;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
deleted file mode 100755
index f0e4c20..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/CryptoMapper.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- * 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.mapper;
-
-import java.util.List;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.IRequestMapper;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.util.IProvider;
-import org.apache.wicket.util.crypt.ICrypt;
-import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.string.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Request mapper that encrypts urls generated by another mapper. The original URL (both segments
- * and parameters) is encrypted and is represented as URL segment. To be able to handle relative
- * URLs for images in .css file the same amount of URL segments that the original URL had are
- * appended to the encrypted URL. Each segment has a precise 5 character value, calculated using a
- * checksum. This helps in calculating the relative distance from the original URL. When a URL is
- * returned by the browser, we iterate through these checksummed placeholder URL segments. If the
- * segment matches the expected checksum, then the segment it deemed to be the corresponding segment
- * in the encrypted URL. If the segment does not match the expected checksum, then the segment is
- * deemed a plain text sibling of the corresponding segment in the encrypted URL, and all subsequent
- * segments are considered plain text children of the current segment.
- *
- *
- * @author igor.vaynberg
- * @author Jesse Long
- * @author svenmeier
- */
-public class CryptoMapper implements IRequestMapper
-{
- private static final Logger log = LoggerFactory.getLogger(CryptoMapper.class);
-
- private final IRequestMapper wrappedMapper;
- private final IProvider<ICrypt> cryptProvider;
-
- /**
- * Construct.
- *
- * @param wrappedMapper
- * the non-crypted request mapper
- * @param application
- * the current application
- */
- public CryptoMapper(final IRequestMapper wrappedMapper, final Application application)
- {
- this(wrappedMapper, new ApplicationCryptProvider(application));
- }
-
- /**
- * Construct.
- *
- * @param wrappedMapper
- * the non-crypted request mapper
- * @param cryptProvider
- * the custom crypt provider
- */
- public CryptoMapper(final IRequestMapper wrappedMapper, final IProvider<ICrypt> cryptProvider)
- {
- this.wrappedMapper = Args.notNull(wrappedMapper, "wrappedMapper");
- this.cryptProvider = Args.notNull(cryptProvider, "cryptProvider");
- }
-
- @Override
- public int getCompatibilityScore(final Request request)
- {
- return 0;
- }
-
- @Override
- public Url mapHandler(final IRequestHandler requestHandler)
- {
- final Url url = wrappedMapper.mapHandler(requestHandler);
-
- if (url == null)
- {
- return null;
- }
-
- return encryptUrl(url);
- }
-
- @Override
- public IRequestHandler mapRequest(final Request request)
- {
- Url url = decryptUrl(request, request.getUrl());
-
- if (url == null)
- {
- return null;
- }
-
- return wrappedMapper.mapRequest(request.cloneWithUrl(url));
- }
-
- /**
- * @return the {@link ICrypt} implementation that may be used to encrypt/decrypt {@link Url}'s
- * segments and/or query string
- */
- protected final ICrypt getCrypt()
- {
- return cryptProvider.get();
- }
-
- /**
- * @return the wrapped root request mapper
- */
- protected final IRequestMapper getWrappedMapper()
- {
- return wrappedMapper;
- }
-
- private Url encryptUrl(final Url url)
- {
- if (url.getSegments().isEmpty() && url.getQueryParameters().isEmpty())
- {
- return url;
- }
- String encryptedUrlString = getCrypt().encryptUrlSafe(url.toString());
-
- Url encryptedUrl = new Url(url.getCharset());
- encryptedUrl.getSegments().add(encryptedUrlString);
-
- int numberOfSegments = url.getSegments().size();
- HashedSegmentGenerator generator = new HashedSegmentGenerator(encryptedUrlString);
- for (int segNo = 0; segNo < numberOfSegments; segNo++)
- {
- encryptedUrl.getSegments().add(generator.next());
- }
- return encryptedUrl;
- }
-
- private Url decryptUrl(final Request request, final Url encryptedUrl)
- {
- if (encryptedUrl.getSegments().isEmpty())
- {
- return encryptedUrl;
- }
-
- List<String> encryptedSegments = encryptedUrl.getSegments();
- if (encryptedSegments.size() < 1)
- {
- return null;
- }
-
- Url url = new Url(request.getCharset());
- try
- {
- String encryptedUrlString = encryptedSegments.get(0);
- if (Strings.isEmpty(encryptedUrlString))
- {
- return null;
- }
-
- String decryptedUrl = getCrypt().decryptUrlSafe(encryptedUrlString);
- if (decryptedUrl == null)
- {
- return null;
- }
- Url originalUrl = Url.parse(decryptedUrl, request.getCharset());
-
- int originalNumberOfSegments = originalUrl.getSegments().size();
- int encryptedNumberOfSegments = encryptedUrl.getSegments().size();
-
- HashedSegmentGenerator generator = new HashedSegmentGenerator(encryptedUrlString);
- int segNo = 1;
- for (; segNo < encryptedNumberOfSegments; segNo++)
- {
- if (segNo > originalNumberOfSegments)
- {
- break;
- }
-
- String next = generator.next();
- String encryptedSegment = encryptedSegments.get(segNo);
- if (!next.equals(encryptedSegment))
- {
- break;
- }
-
- // unmodified segment
- url.getSegments().add(originalUrl.getSegments().get(segNo - 1));
- }
- for (; segNo < encryptedNumberOfSegments; segNo++)
- {
- // modified or additional segment
- url.getSegments().add(encryptedUrl.getSegments().get(segNo));
- }
-
- url.getQueryParameters().addAll(originalUrl.getQueryParameters());
- }
- catch (Exception e)
- {
- log.error("Error decrypting URL", e);
- url = null;
- }
-
- return url;
- }
-
- private static class ApplicationCryptProvider implements IProvider<ICrypt>
- {
- private final Application application;
-
- public ApplicationCryptProvider(final Application application)
- {
- this.application = application;
- }
-
- @Override
- public ICrypt get()
- {
- return application.getSecuritySettings().getCryptFactory().newCrypt();
- }
- }
-
- /**
- * A generator of hashed segments.
- */
- private static class HashedSegmentGenerator
- {
- private char[] characters;
-
- private int hash = 0;
-
- public HashedSegmentGenerator(String string)
- {
- characters = string.toCharArray();
- }
-
- /**
- * Generate the next segment
- *
- * @return segment
- */
- public String next()
- {
- char a = characters[Math.abs(hash % characters.length)];
- hash++;
- char b = characters[Math.abs(hash % characters.length)];
- hash++;
- char c = characters[Math.abs(hash % characters.length)];
-
- String segment = "" + a + b + c;
- hash = hashString(segment);
-
- segment += String.format("%02x", Math.abs(hash % 256));
- hash = hashString(segment);
-
- return segment;
- }
-
- private int hashString(final String str)
- {
- int hash = 97;
-
- for (char c : str.toCharArray())
- {
- int i = c;
- hash = 47 * hash + i;
- }
-
- return hash;
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/HomePageMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/HomePageMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/HomePageMapper.java
deleted file mode 100644
index f5f549a..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/HomePageMapper.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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.mapper;
-
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
-import org.apache.wicket.util.ClassProvider;
-
-/**
- * A mapper that is used when a request to the home page ("/") is made
- */
-public class HomePageMapper extends MountedMapper
-{
-
- /**
- * Construct.
- *
- * @param pageClass
- * the class of the page which should handle requests to "/"
- */
- public HomePageMapper(final Class<? extends IRequestablePage> pageClass)
- {
- super("/", pageClass);
- }
-
- /**
- * Construct.
- *
- * @param pageClassProvider
- * the class of the page which should handle requests to "/"
- */
- public HomePageMapper(ClassProvider<? extends IRequestablePage> pageClassProvider)
- {
- super("/", pageClassProvider);
- }
-
- /**
- * Construct.
- *
- * @param pageClass
- * the class of the page which should handle requests to "/"
- * @param pageParametersEncoder
- * the encoder that will be used to encode/decode the page parameters
- */
- public HomePageMapper(Class<? extends IRequestablePage> pageClass,
- IPageParametersEncoder pageParametersEncoder)
- {
- super("/", pageClass, pageParametersEncoder);
- }
-
- /**
- * Construct.
- *
- * @param pageClassProvider
- * the class of the page which should handle requests to "/"
- * @param pageParametersEncoder
- * the encoder that will be used to encode/decode the page parameters
- */
- public HomePageMapper(final ClassProvider<? extends IRequestablePage> pageClassProvider,
- IPageParametersEncoder pageParametersEncoder)
- {
- super("/", pageClassProvider, pageParametersEncoder);
- }
-
- /**
- * Matches only when there are no segments/indexed parameters
- *
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request)
- */
- @Override
- protected UrlInfo parseRequest(Request request)
- {
- // get canonical url
- final Url url = request.getUrl().canonical();
-
- if (url.getSegments().size() > 0)
- {
- // home page cannot have segments/indexed parameters
- return null;
- }
-
- return super.parseRequest(request);
- }
-
- /**
- * Use this mapper as a last option. Let all other mappers to try to handle the request
- *
- * @see org.apache.wicket.request.mapper.MountedMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
- @Override
- public int getCompatibilityScore(Request request)
- {
- return Integer.MIN_VALUE + 1;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/IMapperContext.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/IMapperContext.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/IMapperContext.java
deleted file mode 100644
index 02fb065..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/IMapperContext.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.mapper;
-
-import org.apache.wicket.RequestListenerInterface;
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.resource.ResourceReferenceRegistry;
-
-/**
- * Utility interface for providing and creating new page instances.
- *
- * @author Matej Knopp
- */
-public interface IMapperContext extends IPageSource
-{
- /**
- * @return the namespace for Wicket URLs.
- */
- String getNamespace();
-
- /**
- * @return identifier for non bookmarkable URLs
- */
- String getPageIdentifier();
-
- /**
- * @return identifier for bookmarkable URLs
- */
- String getBookmarkableIdentifier();
-
- /**
- * @return identifier for resources
- */
- String getResourceIdentifier();
-
- /**
- * @return {@link ResourceReferenceRegistry}
- */
- ResourceReferenceRegistry getResourceReferenceRegistry();
-
- /**
- * Returns the listener interface name as string.
- *
- * @param listenerInterface
- * @return listener interface name as string
- */
- String requestListenerInterfaceToString(RequestListenerInterface listenerInterface);
-
- /**
- * Returns listener interface for the name
- *
- * @param interfaceName
- * @return listener interface
- */
- RequestListenerInterface requestListenerInterfaceFromString(String interfaceName);
-
- /**
- * Returns the home page class.
- *
- * @return home page class
- */
- Class<? extends IRequestablePage> getHomePageClass();
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/IPageSource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/IPageSource.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/IPageSource.java
deleted file mode 100644
index 8adf9a9..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/IPageSource.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.mapper;
-
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-
-/**
- * Interface for objects that are capable of getting and creating page instance.
- *
- * @author Matej Knopp
- */
-public interface IPageSource
-{
- /**
- * Returns existing page instance if the page exists.
- *
- * @param pageId
- * @return page instance or <code>null</code> if the page does not exist.
- */
- IRequestablePage getPageInstance(int pageId);
-
- /**
- * Creates new page instance of page with given class. The page should be marked as create
- * bookmarkable, so subsequent calls to {@link IRequestablePage#wasCreatedBookmarkable()} must
- * return <code>true</code>
- *
- * @param pageMapName
- * @param pageClass
- * @param pageParameters
- * @return new page instance
- */
- IRequestablePage newPageInstance(Class<? extends IRequestablePage> pageClass,
- PageParameters pageParameters);
-
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/MountedMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/MountedMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/MountedMapper.java
deleted file mode 100644
index 864859a..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/MountedMapper.java
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * 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.mapper;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.RequestListenerInterface;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.handler.ListenerInterfaceRequestHandler;
-import org.apache.wicket.request.mapper.info.ComponentInfo;
-import org.apache.wicket.request.mapper.info.PageComponentInfo;
-import org.apache.wicket.request.mapper.info.PageInfo;
-import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
-import org.apache.wicket.util.ClassProvider;
-import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.string.Strings;
-
-/**
- * Encoder for mounted URL. The mount path can contain parameter placeholders, i.e.
- * <code>/mount/${foo}/path</code>. In that case the appropriate segment from the URL will be
- * accessible as named parameter "foo" in the {@link PageParameters}. Similarly when the URL is
- * constructed, the second segment will contain the value of the "foo" named page parameter.
- * Optional parameters are denoted by using a # instead of $: <code>/mount/#{foo}/path/${bar}</code>
- * has an optional {@code foo} parameter, a fixed {@code /path/} part and a required {@code bar}
- * parameter. When in doubt, parameters are matched from left to right, where required parameters
- * are matched before optional parameters, and optional parameters eager (from left to right).
- * <p>
- * Decodes and encodes the following URLs:
- *
- * <pre>
- * Page Class - Render (BookmarkablePageRequestHandler for mounted pages)
- * /mount/point
- * (these will redirect to hybrid alternative if page is not stateless)
- *
- * IPage Instance - Render Hybrid (RenderPageRequestHandler for mounted pages)
- * /mount/point?2
- *
- * IPage Instance - Bookmarkable Listener (BookmarkableListenerInterfaceRequestHandler for mounted pages)
- * /mount/point?2-click-foo-bar-baz
- * /mount/point?2-5.click.1-foo-bar-baz (1 is behavior index, 5 is render count)
- * (these will redirect to hybrid if page is not stateless)
- * </pre>
- *
- * @author Matej Knopp
- */
-public class MountedMapper extends AbstractBookmarkableMapper
-{
- private final IPageParametersEncoder pageParametersEncoder;
-
- private static class MountPathSegment
- {
- private int segmentIndex;
- private String fixedPart;
- private int minParameters;
- private int optionalParameters;
-
- public MountPathSegment(int segmentIndex)
- {
- this.segmentIndex = segmentIndex;
- }
-
- public void setFixedPart(String fixedPart)
- {
- this.fixedPart = fixedPart;
- }
-
- public void addRequiredParameter()
- {
- minParameters++;
- }
-
- public void addOptionalParameter()
- {
- optionalParameters++;
- }
-
- public int getSegmentIndex()
- {
- return segmentIndex;
- }
-
- public String getFixedPart()
- {
- return fixedPart;
- }
-
- public int getMinParameters()
- {
- return minParameters;
- }
-
- public int getOptionalParameters()
- {
- return optionalParameters;
- }
-
- public int getMaxParameters()
- {
- return getOptionalParameters() + getMinParameters();
- }
-
- public int getFixedPartSize()
- {
- return getFixedPart() == null ? 0 : 1;
- }
-
- @Override
- public String toString()
- {
- return "(" + getSegmentIndex() + ") " + getMinParameters() + "-" + getMaxParameters() +
- " " + (getFixedPart() == null ? "(end)" : getFixedPart());
- }
- }
-
- private final List<MountPathSegment> pathSegments;
- private final String[] mountSegments;
-
- /** bookmarkable page class. */
- private final ClassProvider<? extends IRequestablePage> pageClassProvider;
-
- /**
- * Construct.
- *
- * @param mountPath
- * @param pageClass
- */
- public MountedMapper(String mountPath, Class<? extends IRequestablePage> pageClass)
- {
- this(mountPath, pageClass, new PageParametersEncoder());
- }
-
- /**
- * Construct.
- *
- * @param mountPath
- * @param pageClassProvider
- */
- public MountedMapper(String mountPath,
- ClassProvider<? extends IRequestablePage> pageClassProvider)
- {
- this(mountPath, pageClassProvider, new PageParametersEncoder());
- }
-
- /**
- * Construct.
- *
- * @param mountPath
- * @param pageClass
- * @param pageParametersEncoder
- */
- public MountedMapper(String mountPath, Class<? extends IRequestablePage> pageClass,
- IPageParametersEncoder pageParametersEncoder)
- {
- this(mountPath, ClassProvider.of(pageClass), pageParametersEncoder);
- }
-
- /**
- * Construct.
- *
- * @param mountPath
- * @param pageClassProvider
- * @param pageParametersEncoder
- */
- public MountedMapper(String mountPath,
- ClassProvider<? extends IRequestablePage> pageClassProvider,
- IPageParametersEncoder pageParametersEncoder)
- {
- Args.notEmpty(mountPath, "mountPath");
- Args.notNull(pageClassProvider, "pageClassProvider");
- Args.notNull(pageParametersEncoder, "pageParametersEncoder");
-
- this.pageParametersEncoder = pageParametersEncoder;
- this.pageClassProvider = pageClassProvider;
- mountSegments = getMountSegments(mountPath);
- pathSegments = getPathSegments(mountSegments);
- }
-
- private List<MountPathSegment> getPathSegments(String[] segments)
- {
- List<MountPathSegment> ret = new ArrayList<MountPathSegment>();
- int segmentIndex = 0;
- MountPathSegment curPathSegment = new MountPathSegment(segmentIndex);
- ret.add(curPathSegment);
- for (String curSegment : segments)
- {
- if (isFixedSegment(curSegment))
- {
- curPathSegment.setFixedPart(curSegment);
- curPathSegment = new MountPathSegment(segmentIndex + 1);
- ret.add(curPathSegment);
- }
- else if (getPlaceholder(curSegment) != null)
- {
- curPathSegment.addRequiredParameter();
- }
- else
- {
- curPathSegment.addOptionalParameter();
- }
- segmentIndex++;
- }
- return ret;
- }
-
- private boolean isFixedSegment(String segment)
- {
- return getOptionalPlaceholder(segment) == null && getPlaceholder(segment) == null;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request)
- */
- @Override
- protected UrlInfo parseRequest(Request request)
- {
- Url url = request.getUrl();
-
- // when redirect to buffer/render is active and redirectFromHomePage returns true
- // check mounted class against the home page class. if it matches let wicket redirect
- // to the mounted URL
- if (redirectFromHomePage() && checkHomePage(url))
- {
- return new UrlInfo(null, getContext().getHomePageClass(), newPageParameters());
- }
- // check if the URL starts with the proper segments
- else if (urlStartsWith(url, mountSegments))
- {
- // try to extract page and component information from URL
- PageComponentInfo info = getPageComponentInfo(url);
- Class<? extends IRequestablePage> pageClass = getPageClass();
- PageParameters pageParameters = extractPageParameters(request, url);
-
- return new UrlInfo(info, pageClass, pageParameters);
- }
- else
- {
- return null;
- }
- }
-
- /*
- * extract the PageParameters from URL if there are any
- */
- private PageParameters extractPageParameters(Request request, Url url)
- {
- int[] matchedParameters = getMatchedSegmentSizes(url);
- int total = 0;
- for (int curMatchSize : matchedParameters)
- total += curMatchSize;
- PageParameters pageParameters = extractPageParameters(request, total, pageParametersEncoder);
-
- int skippedParameters = 0;
- for (int pathSegmentIndex = 0; pathSegmentIndex < pathSegments.size(); pathSegmentIndex++)
- {
- MountPathSegment curPathSegment = pathSegments.get(pathSegmentIndex);
- int matchSize = matchedParameters[pathSegmentIndex] - curPathSegment.getFixedPartSize();
- int optionalParameterMatch = matchSize - curPathSegment.getMinParameters();
- for (int matchSegment = 0; matchSegment < matchSize; matchSegment++)
- {
- if (pageParameters == null)
- {
- pageParameters = new PageParameters();
- }
-
- int curSegmentIndex = matchSegment + curPathSegment.getSegmentIndex();
- String curSegment = mountSegments[curSegmentIndex];
- String placeholder = getPlaceholder(curSegment);
- String optionalPlaceholder = getOptionalPlaceholder(curSegment);
- // extract the parameter from URL
- if (placeholder != null)
- {
- pageParameters.add(placeholder,
- url.getSegments().get(curSegmentIndex - skippedParameters));
- }
- else if (optionalPlaceholder != null && optionalParameterMatch > 0)
- {
- pageParameters.add(optionalPlaceholder,
- url.getSegments().get(curSegmentIndex - skippedParameters));
- optionalParameterMatch--;
- }
- }
- skippedParameters += curPathSegment.getMaxParameters() - matchSize;
- }
- return pageParameters;
- }
-
- @Override
- protected boolean urlStartsWith(Url url, String... segments)
- {
- if (url == null)
- {
- return false;
- }
- else
- {
- return getMatchedSegmentSizes(url) != null;
- }
- }
-
- private int[] getMatchedSegmentSizes(Url url)
- {
- int[] ret = new int[pathSegments.size()];
- int segmentIndex = 0;
- int pathSegmentIndex = 0;
- for (MountPathSegment curPathSegment : pathSegments.subList(0, pathSegments.size() - 1))
- {
- boolean foundFixedPart = false;
- segmentIndex += curPathSegment.getMinParameters();
- int max = Math.min(curPathSegment.getOptionalParameters() + 1,
- url.getSegments().size() - segmentIndex);
-
- for (int count = max - 1; count >= 0; count--)
- {
- if (url.getSegments()
- .get(segmentIndex + count)
- .equals(curPathSegment.getFixedPart()))
- {
- foundFixedPart = true;
- segmentIndex += count + 1;
- ret[pathSegmentIndex] = count + curPathSegment.getMinParameters() + 1;
- break;
- }
- }
- if (!foundFixedPart)
- return null;
- pathSegmentIndex++;
- }
- MountPathSegment lastSegment = pathSegments.get(pathSegments.size() - 1);
- segmentIndex += lastSegment.getMinParameters();
- if (segmentIndex > url.getSegments().size())
- return null;
- ret[pathSegmentIndex] = Math.min(lastSegment.getMaxParameters(), url.getSegments().size() -
- segmentIndex + lastSegment.getMinParameters());
- return ret;
- }
-
- protected PageParameters newPageParameters()
- {
- return new PageParameters();
- }
-
- @Override
- public Url mapHandler(IRequestHandler requestHandler)
- {
- Url url = super.mapHandler(requestHandler);
-
- if (url == null && requestHandler instanceof ListenerInterfaceRequestHandler &&
- getRecreateMountedPagesAfterExpiry())
- {
- ListenerInterfaceRequestHandler handler = (ListenerInterfaceRequestHandler)requestHandler;
- IRequestablePage page = handler.getPage();
- if (checkPageInstance(page))
- {
- String componentPath = handler.getComponentPath();
- RequestListenerInterface listenerInterface = handler.getListenerInterface();
-
- Integer renderCount = null;
- if (listenerInterface.isIncludeRenderCount())
- {
- renderCount = page.getRenderCount();
- }
-
- PageInfo pageInfo = new PageInfo(page.getPageId());
- ComponentInfo componentInfo = new ComponentInfo(renderCount,
- requestListenerInterfaceToString(listenerInterface), componentPath,
- handler.getBehaviorIndex());
- PageComponentInfo pageComponentInfo = new PageComponentInfo(pageInfo, componentInfo);
- PageParameters parameters = new PageParameters(page.getPageParameters());
- UrlInfo urlInfo = new UrlInfo(pageComponentInfo, page.getClass(),
- parameters.mergeWith(handler.getPageParameters()));
- url = buildUrl(urlInfo);
- }
- }
-
- return url;
- }
-
- boolean getRecreateMountedPagesAfterExpiry()
- {
- return Application.get().getPageSettings().getRecreateMountedPagesAfterExpiry();
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#buildUrl(org.apache.wicket.request.mapper.AbstractBookmarkableMapper.UrlInfo)
- */
- @Override
- protected Url buildUrl(UrlInfo info)
- {
- Url url = new Url();
- for (String s : mountSegments)
- {
- url.getSegments().add(s);
- }
- encodePageComponentInfo(url, info.getPageComponentInfo());
-
- PageParameters copy = new PageParameters(info.getPageParameters());
-
- int dropped = 0;
- for (int i = 0; i < mountSegments.length; ++i)
- {
- String placeholder = getPlaceholder(mountSegments[i]);
- String optionalPlaceholder = getOptionalPlaceholder(mountSegments[i]);
- if (placeholder != null)
- {
- url.getSegments().set(i - dropped, copy.get(placeholder).toString(""));
- copy.remove(placeholder);
- }
- else if (optionalPlaceholder != null)
- {
- if (copy.getNamedKeys().contains(optionalPlaceholder))
- {
- url.getSegments().set(i - dropped, copy.get(optionalPlaceholder).toString(""));
- copy.remove(optionalPlaceholder);
- }
- else
- {
- url.getSegments().remove(i - dropped);
- dropped++;
- }
- }
- }
-
- return encodePageParameters(url, copy, pageParametersEncoder);
- }
-
- /**
- * Check if the URL is for home page and the home page class match mounted class. If so,
- * redirect to mounted URL.
- *
- * @param url
- * @return request handler or <code>null</code>
- */
- private boolean checkHomePage(Url url)
- {
- if (url.getSegments().isEmpty() && url.getQueryParameters().isEmpty())
- {
- // this is home page
- if (getPageClass().equals(getContext().getHomePageClass()) && redirectFromHomePage())
- {
- return true;
- }
- }
- return false;
- }
-
- /**
- * If this method returns <code>true</code> and application home page class is same as the class
- * mounted with this encoder, request to home page will result in a redirect to the mounted
- * path.
- *
- * @return whether this encode should respond to home page request when home page class is same
- * as mounted class.
- */
- protected boolean redirectFromHomePage()
- {
- return true;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#pageMustHaveBeenCreatedBookmarkable()
- */
- @Override
- protected boolean pageMustHaveBeenCreatedBookmarkable()
- {
- return false;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
- @Override
- public int getCompatibilityScore(Request request)
- {
- if (urlStartsWith(request.getUrl(), mountSegments))
- {
- return mountSegments.length;
- }
- else
- {
- return 0;
- }
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#checkPageClass(java.lang.Class)
- */
- @Override
- protected boolean checkPageClass(Class<? extends IRequestablePage> pageClass)
- {
- return pageClass.equals(this.getPageClass());
- }
-
- private Class<? extends IRequestablePage> getPageClass()
- {
- return pageClassProvider.get();
- }
-
- @Override
- public String toString()
- {
- return "MountedMapper [mountSegments=" + Strings.join("/", mountSegments) + "]";
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
deleted file mode 100644
index bfacbcb..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/PackageMapper.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * 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.mapper;
-
-import java.lang.reflect.Modifier;
-
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.mapper.info.PageComponentInfo;
-import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
-import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.lang.PackageName;
-
-/**
- * A request mapper that mounts all bookmarkable pages in a given package.
- * <p>
- * To mount this mapper onto a path use the {@link WebApplication#mountPackage(String, Class)}, ex:
- *
- * <pre>
- * MyApp#init() {
- *
- * super.init();
- * mountPackage("/my/path", MyPage.class);
- * }
- * </pre>
- *
- * will result in urls like {@code /my/path/MyPage}
- * </p>
- *
- * <pre>
- * Page Class - Render (BookmarkablePageRequestHandler)
- * /MyPage
- * (will redirect to hybrid alternative if page is not stateless)
- *
- * Page Instance - Render Hybrid (RenderPageRequestHandler for pages that were created using bookmarkable URLs)
- * /MyPage?2
- *
- * Page Instance - Bookmarkable Listener (BookmarkableListenerInterfaceRequestHandler)
- * /MyPage?2-click-foo-bar-baz
- * /MyPage?2-click.1-foo-bar-baz (1 is behavior index)
- * (these will redirect to hybrid if page is not stateless)
- * </pre>
- */
-public class PackageMapper extends AbstractBookmarkableMapper
-{
- /**
- * the name of the package for which all bookmarkable pages should be mounted
- */
- private final PackageName packageName;
-
- /** the encoder used to encode/decode the page parameters */
- private final IPageParametersEncoder pageParametersEncoder;
-
- /**
- * Construct.
- *
- * @param packageName
- */
- public PackageMapper(final PackageName packageName)
- {
- this(packageName, new PageParametersEncoder());
- }
-
- /**
- * Construct.
- *
- * @param packageName
- * @param pageParametersEncoder
- */
- public PackageMapper(final PackageName packageName,
- final IPageParametersEncoder pageParametersEncoder)
- {
- Args.notNull(packageName, "packageName");
- Args.notNull(pageParametersEncoder, "pageParametersEncoder");
-
- this.packageName = packageName;
- this.pageParametersEncoder = pageParametersEncoder;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#buildUrl(org.apache.wicket.request.mapper.AbstractBookmarkableMapper.UrlInfo)
- */
- @Override
- protected Url buildUrl(UrlInfo info)
- {
- Class<? extends IRequestablePage> pageClass = info.getPageClass();
- PackageName pageClassPackageName = PackageName.forClass(pageClass);
- if (pageClassPackageName.equals(packageName))
- {
- Url url = new Url();
-
- String fullyQualifiedClassName = pageClass.getName();
- String packageRelativeClassName = fullyQualifiedClassName;
- int packageNameLength = packageName.getName().length();
- if (packageNameLength > 0)
- {
- packageRelativeClassName = fullyQualifiedClassName.substring(packageNameLength + 1);
- }
- packageRelativeClassName = transformForUrl(packageRelativeClassName);
- url.getSegments().add(packageRelativeClassName);
- encodePageComponentInfo(url, info.getPageComponentInfo());
- return encodePageParameters(url, info.getPageParameters(), pageParametersEncoder);
- }
-
- return null;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#parseRequest(org.apache.wicket.request.Request)
- */
- @Override
- protected UrlInfo parseRequest(Request request)
- {
- Url url = request.getUrl();
- if (url.getSegments().size() >= 1)
- {
- // try to extract page and component information from URL
- PageComponentInfo info = getPageComponentInfo(url);
-
- // load the page class
- String className = url.getSegments().get(0);
-
- if (isValidClassName(className) == false)
- {
- return null;
- }
-
- className = transformFromUrl(className);
- String fullyQualifiedClassName = packageName.getName() + '.' + className;
- Class<? extends IRequestablePage> pageClass = getPageClass(fullyQualifiedClassName);
-
- if (pageClass != null && Modifier.isAbstract(pageClass.getModifiers()) == false &&
- IRequestablePage.class.isAssignableFrom(pageClass))
- {
- // extract the PageParameters from URL if there are any
- PageParameters pageParameters = extractPageParameters(request, 1,
- pageParametersEncoder);
-
- return new UrlInfo(info, pageClass, pageParameters);
- }
- }
- return null;
- }
-
- /**
- * filter out invalid class names for package mapper. getting trash for class names
- * can e.g. happen when the home page is in the same package that is mounted by package mapper
- * but the request was previously mapped by e.g. {@link HomePageMapper}. We then get some
- * strange url like '/example/..' and wicket tries to look up class name '..'.
- * <p/>
- * @see <a href="https://issues.apache.org/jira/browse/WICKET-4303">WICKET-4303</a>
- * <p/>
- */
- private boolean isValidClassName(String className)
- {
- // darn simple check - feel free to enhance this method to your needs
- if (className == null)
- {
- return false;
- }
- // java class names never start with '.'
- if (className.startsWith("."))
- {
- return false;
- }
- return true;
- }
-
- /**
- * Gives a chance to specializations of this mapper to transform the alias of the class name to
- * the real class name
- *
- * @param classNameAlias
- * the alias for the class name
- * @return the real class name
- */
- protected String transformFromUrl(final String classNameAlias)
- {
- return classNameAlias;
- }
-
- /**
- * Gives a chance to specializations of this mapper to transform the real class name to an alias
- * which is prettier to represent in the Url
- *
- * @param className
- * the real class name
- * @return the class name alias
- */
- protected String transformForUrl(final String className)
- {
- return className;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#pageMustHaveBeenCreatedBookmarkable()
- */
- @Override
- protected boolean pageMustHaveBeenCreatedBookmarkable()
- {
- return true;
- }
-
- /**
- * @see org.apache.wicket.request.mapper.AbstractBookmarkableMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
- @Override
- public int getCompatibilityScore(Request request)
- {
- // always return 0 here so that the mounts have higher priority
- return 0;
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java
deleted file mode 100644
index ae07088..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/PageInstanceMapper.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * 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.mapper;
-
-import org.apache.wicket.RequestListenerInterface;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.component.IRequestablePage;
-import org.apache.wicket.request.handler.ListenerInterfaceRequestHandler;
-import org.apache.wicket.request.handler.PageAndComponentProvider;
-import org.apache.wicket.request.handler.PageProvider;
-import org.apache.wicket.request.handler.RenderPageRequestHandler;
-import org.apache.wicket.request.mapper.info.ComponentInfo;
-import org.apache.wicket.request.mapper.info.PageComponentInfo;
-import org.apache.wicket.request.mapper.info.PageInfo;
-
-/**
- * Decodes and encodes the following URLs:
- *
- * <pre>
- * Page Instance - Render (RenderPageRequestHandler)
- * /wicket/page?2
- *
- *
- * Page Instance - Listener (ListenerInterfaceRequestHandler)
- * /wicket/page?2-click-foo-bar-baz
- * /wicket/page?2-click.1-foo-bar-baz (1 is behavior index)
- * </pre>
- *
- * @author Matej Knopp
- */
-public class PageInstanceMapper extends AbstractComponentMapper
-{
- /**
- * Construct.
- */
- public PageInstanceMapper()
- {
- }
-
- /**
- * @see org.apache.wicket.request.IRequestMapper#mapRequest(org.apache.wicket.request.Request)
- */
- @Override
- public IRequestHandler mapRequest(Request request)
- {
- Url url = request.getUrl();
- if (matches(url))
- {
- PageComponentInfo info = getPageComponentInfo(url);
- if (info != null && info.getPageInfo().getPageId() != null)
- {
- Integer renderCount = info.getComponentInfo() != null ? info.getComponentInfo()
- .getRenderCount() : null;
-
- if (info.getComponentInfo() == null)
- {
- PageProvider provider = new PageProvider(info.getPageInfo().getPageId(),
- renderCount);
- provider.setPageSource(getContext());
- // render page
- return new RenderPageRequestHandler(provider);
- }
- else
- {
- ComponentInfo componentInfo = info.getComponentInfo();
-
- PageAndComponentProvider provider = new PageAndComponentProvider(
- info.getPageInfo().getPageId(), renderCount,
- componentInfo.getComponentPath());
-
- provider.setPageSource(getContext());
-
- // listener interface
- RequestListenerInterface listenerInterface = requestListenerInterfaceFromString(componentInfo.getListenerInterface());
-
- return new ListenerInterfaceRequestHandler(provider, listenerInterface,
- componentInfo.getBehaviorId());
- }
- }
- }
- return null;
- }
-
- /**
- * @see org.apache.wicket.request.IRequestMapper#mapHandler(org.apache.org.apache.wicket.request.IRequestHandler)
- */
- @Override
- public Url mapHandler(IRequestHandler requestHandler)
- {
- PageComponentInfo info = null;
-
- if (requestHandler instanceof RenderPageRequestHandler)
- {
- IRequestablePage page = ((RenderPageRequestHandler)requestHandler).getPage();
-
- PageInfo i = new PageInfo(page.getPageId());
- info = new PageComponentInfo(i, null);
- }
- else if (requestHandler instanceof ListenerInterfaceRequestHandler)
- {
- ListenerInterfaceRequestHandler handler = (ListenerInterfaceRequestHandler)requestHandler;
- IRequestablePage page = handler.getPage();
- String componentPath = handler.getComponentPath();
- RequestListenerInterface listenerInterface = handler.getListenerInterface();
-
- Integer renderCount = null;
- if (listenerInterface.isIncludeRenderCount())
- {
- renderCount = page.getRenderCount();
- }
-
- PageInfo pageInfo = new PageInfo(page.getPageId());
- ComponentInfo componentInfo = new ComponentInfo(renderCount,
- requestListenerInterfaceToString(listenerInterface), componentPath,
- handler.getBehaviorIndex());
- info = new PageComponentInfo(pageInfo, componentInfo);
- }
-
- if (info != null)
- {
- Url url = new Url();
- url.getSegments().add(getContext().getNamespace());
- url.getSegments().add(getContext().getPageIdentifier());
- encodePageComponentInfo(url, info);
- return url;
- }
- else
- {
- return null;
- }
- }
-
- /**
- * @see org.apache.wicket.request.IRequestMapper#getCompatibilityScore(org.apache.wicket.request.Request)
- */
- @Override
- public int getCompatibilityScore(final Request request)
- {
- int score = 0;
- Url url = request.getUrl();
- if (matches(url))
- {
- score = Integer.MAX_VALUE;
- }
- return score;
- }
-
- private boolean matches(final Url url)
- {
- return urlStartsWith(url, getContext().getNamespace(), getContext().getPageIdentifier());
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/53f07873/wicket-core/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java b/wicket-core/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java
deleted file mode 100644
index 6aa1541..0000000
--- a/wicket-core/src/main/java/org/apache/wicket/request/mapper/ResourceMapper.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * 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.mapper;
-
-import java.util.List;
-
-import org.apache.wicket.Application;
-import org.apache.wicket.request.IRequestHandler;
-import org.apache.wicket.request.IRequestMapper;
-import org.apache.wicket.request.Request;
-import org.apache.wicket.request.Url;
-import org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
-import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
-import org.apache.wicket.request.mapper.parameter.PageParameters;
-import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
-import org.apache.wicket.request.resource.IResource;
-import org.apache.wicket.request.resource.ResourceReference;
-import org.apache.wicket.request.resource.caching.IResourceCachingStrategy;
-import org.apache.wicket.request.resource.caching.IStaticCacheableResource;
-import org.apache.wicket.request.resource.caching.ResourceUrl;
-import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.util.string.Strings;
-
-/**
- * A {@link IRequestMapper} to mount resources to a custom mount path
- * <ul>
- * <li>maps indexed parameters to path segments</li>
- * <li>maps named parameters to query string arguments or placeholder path segments</li>
- * </ul>
- *
- * <strong>sample structure of url</strong>
- *
- * <pre>
- * /myresources/${category}/images/[indexed-param-0]/[indexed-param-1]?[named-param-1=value]&[named-param-2=value2]
- * </pre>
- *
- * <h4>sample usage</h4>
- *
- * in your wicket application's init() method use a statement like this
- * <p/>
- *
- * <pre>
- * mountResource("/images", new ImagesResourceReference()));
- * </pre>
- *
- * Note: Mounted this way the resource reference has application scope, i.e. it is shared between
- * all users of the application. It is recommended to not keep any state in it.
- *
- * @see org.apache.wicket.protocol.http.WebApplication#mountResource(String,
- * org.apache.wicket.request.resource.ResourceReference)
- *
- * @author Peter Ertl
- */
-public class ResourceMapper extends AbstractMapper implements IRequestMapper
-{
- // encode page parameters into url + decode page parameters from url
- private final IPageParametersEncoder parametersEncoder;
-
- // mount path (= segments) the resource is bound to
- private final String[] mountSegments;
-
- // resource that the mapper links to
- private final ResourceReference resourceReference;
-
- /**
- * create a resource mapper for a resource
- *
- * @param path
- * mount path for the resource
- * @param resourceReference
- * resource reference that should be linked to the mount path
- *
- * @see #ResourceMapper(String, org.apache.wicket.request.resource.ResourceReference,
- * org.apache.wicket.request.mapper.parameter.IPageParametersEncoder)
- */
- public ResourceMapper(String path, ResourceReference resourceReference)
- {
- this(path, resourceReference, new PageParametersEncoder());
- }
-
- /**
- * create a resource mapper for a resource
- *
- * @param path
- * mount path for the resource
- * @param resourceReference
- * resource reference that should be linked to the mount path
- * @param encoder
- * encoder for url parameters
- */
- public ResourceMapper(String path, ResourceReference resourceReference,
- IPageParametersEncoder encoder)
- {
- Args.notEmpty(path, "path");
- Args.notNull(resourceReference, "resourceReference");
- Args.notNull(encoder, "encoder");
-
- this.resourceReference = resourceReference;
- mountSegments = getMountSegments(path);
- parametersEncoder = encoder;
- }
-
- @Override
- public IRequestHandler mapRequest(final Request request)
- {
- final Url url = new Url(request.getUrl());
-
- // now extract the page parameters from the request url
- PageParameters parameters = extractPageParameters(request, mountSegments.length,
- parametersEncoder);
-
- // remove caching information from current request
- removeCachingDecoration(url, parameters);
-
- // check if url matches mount path
- if (urlStartsWith(url, mountSegments) == false)
- {
- return null;
- }
-
- // check if there are placeholders in mount segments
- for (int index = 0; index < mountSegments.length; ++index)
- {
- String placeholder = getPlaceholder(mountSegments[index]);
-
- if (placeholder != null)
- {
- // extract the parameter from URL
- if (parameters == null)
- {
- parameters = new PageParameters();
- }
- parameters.add(placeholder, url.getSegments().get(index));
- }
- }
- return new ResourceReferenceRequestHandler(resourceReference, parameters);
- }
-
- @Override
- public int getCompatibilityScore(Request request)
- {
- return 0; // pages always have priority over resources
- }
-
- @Override
- public Url mapHandler(IRequestHandler requestHandler)
- {
- if ((requestHandler instanceof ResourceReferenceRequestHandler) == false)
- {
- return null;
- }
-
- ResourceReferenceRequestHandler handler = (ResourceReferenceRequestHandler)requestHandler;
-
- // see if request handler addresses the resource reference we serve
- if (resourceReference.equals(handler.getResourceReference()) == false)
- {
- return null;
- }
-
- Url url = new Url();
-
- // add mount path segments
- for (String segment : mountSegments)
- {
- url.getSegments().add(segment);
- }
-
- // replace placeholder parameters
- PageParameters parameters = new PageParameters(handler.getPageParameters());
-
- for (int index = 0; index < mountSegments.length; ++index)
- {
- String placeholder = getPlaceholder(mountSegments[index]);
-
- if (placeholder != null)
- {
- url.getSegments().set(index, parameters.get(placeholder).toString(""));
- parameters.remove(placeholder);
- }
- }
-
- // add caching information
- addCachingDecoration(url, parameters);
-
- // create url
- return encodePageParameters(url, parameters, parametersEncoder);
- }
-
- protected IResourceCachingStrategy getCachingStrategy()
- {
- return Application.get().getResourceSettings().getCachingStrategy();
- }
-
- protected void addCachingDecoration(Url url, PageParameters parameters)
- {
- final List<String> segments = url.getSegments();
- final int lastSegmentAt = segments.size() - 1;
- final String filename = segments.get(lastSegmentAt);
-
- if (Strings.isEmpty(filename) == false)
- {
- // TODO is calling getResource() a potential performance bottleneck?
- final IResource resource = resourceReference.getResource();
-
- if (resource instanceof IStaticCacheableResource)
- {
- final IStaticCacheableResource cacheable = (IStaticCacheableResource)resource;
- final ResourceUrl cacheUrl = new ResourceUrl(filename, parameters);
-
- getCachingStrategy().decorateUrl(cacheUrl, cacheable);
-
- if (Strings.isEmpty(cacheUrl.getFileName()))
- {
- throw new IllegalStateException("caching strategy returned empty name for " +
- resource);
- }
- segments.set(lastSegmentAt, cacheUrl.getFileName());
- }
- }
- }
-
- protected void removeCachingDecoration(Url url, PageParameters parameters)
- {
- final List<String> segments = url.getSegments();
-
- if (segments.isEmpty() == false)
- {
- // get filename (the last segment)
- final int lastSegmentAt = segments.size() - 1;
- String filename = segments.get(lastSegmentAt);
-
- // ignore requests with empty filename
- if (Strings.isEmpty(filename))
- {
- return;
- }
-
- // create resource url from filename and query parameters
- final ResourceUrl resourceUrl = new ResourceUrl(filename, parameters);
-
- // remove caching information from request
- getCachingStrategy().undecorateUrl(resourceUrl);
-
- // check for broken caching strategy (this must never happen)
- if (Strings.isEmpty(resourceUrl.getFileName()))
- {
- throw new IllegalStateException("caching strategy returned empty name for " +
- resourceUrl);
- }
-
- segments.set(lastSegmentAt, resourceUrl.getFileName());
- }
- }
-}