001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.wicket.request.target.coding;
018:
019: import org.apache.wicket.IRequestTarget;
020: import org.apache.wicket.PageParameters;
021: import org.apache.wicket.Session;
022: import org.apache.wicket.protocol.http.request.WebRequestCodingStrategy;
023: import org.apache.wicket.request.RequestParameters;
024: import org.apache.wicket.request.target.component.BookmarkableListenerInterfaceRequestTarget;
025: import org.apache.wicket.request.target.component.BookmarkablePageRequestTarget;
026: import org.apache.wicket.request.target.component.IBookmarkablePageRequestTarget;
027: import org.apache.wicket.util.lang.Classes;
028: import org.apache.wicket.util.lang.PackageName;
029: import org.apache.wicket.util.string.AppendingStringBuffer;
030: import org.slf4j.Logger;
031: import org.slf4j.LoggerFactory;
032:
033: /**
034: * Encodes and decodes mounts for a whole package.
035: *
036: * @author Eelco Hillenius
037: * @author Igor Vaynberg
038: */
039: public class PackageRequestTargetUrlCodingStrategy extends
040: AbstractRequestTargetUrlCodingStrategy {
041: private static final Logger log = LoggerFactory
042: .getLogger(PackageRequestTargetUrlCodingStrategy.class);
043:
044: /** package for this mount. */
045: private final PackageName packageName;
046:
047: /**
048: * Construct.
049: *
050: * @param path
051: * the mount path
052: * @param packageName
053: * The name of the package to mount
054: */
055: public PackageRequestTargetUrlCodingStrategy(final String path,
056: PackageName packageName) {
057: super (path);
058: this .packageName = packageName;
059: }
060:
061: /**
062: * @see org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy#decode(org.apache.wicket.request.RequestParameters)
063: */
064: public IRequestTarget decode(RequestParameters requestParameters) {
065: String remainder = requestParameters.getPath().substring(
066: getMountPath().length());
067: final String parametersFragment;
068: int ix = remainder.indexOf('/', 1);
069: if (ix == -1) {
070: ix = remainder.length();
071: parametersFragment = "";
072: } else {
073: parametersFragment = remainder.substring(ix);
074: }
075:
076: if (remainder.startsWith("/")) {
077: remainder = remainder.substring(1);
078: ix--;
079: } else {
080: // There is nothing after the mount path!
081: return null;
082: }
083:
084: final String bookmarkablePageClassName = packageName + "."
085: + remainder.substring(0, ix);
086: Class bookmarkablePageClass;
087: try {
088: bookmarkablePageClass = Session.get().getClassResolver()
089: .resolveClass(bookmarkablePageClassName);
090: } catch (Exception e) {
091: log.debug(e.getMessage());
092: return null;
093: }
094: PageParameters parameters = new PageParameters(
095: decodeParameters(parametersFragment, requestParameters
096: .getParameters()));
097:
098: String pageMapName = (String) parameters
099: .remove(WebRequestCodingStrategy.PAGEMAP);
100: pageMapName = WebRequestCodingStrategy
101: .decodePageMapName(pageMapName);
102: requestParameters.setPageMapName(pageMapName);
103:
104: // do some extra work for checking whether this is a normal request to a
105: // bookmarkable page, or a request to a stateless page (in which case a
106: // wicket:interface parameter should be available
107: final String interfaceParameter = (String) parameters
108: .remove(WebRequestCodingStrategy.INTERFACE_PARAMETER_NAME);
109:
110: if (interfaceParameter != null) {
111: WebRequestCodingStrategy.addInterfaceParameters(
112: interfaceParameter, requestParameters);
113: return new BookmarkableListenerInterfaceRequestTarget(
114: pageMapName, bookmarkablePageClass, parameters,
115: requestParameters.getComponentPath(),
116: requestParameters.getInterfaceName());
117: } else {
118: return new BookmarkablePageRequestTarget(pageMapName,
119: bookmarkablePageClass, parameters);
120: }
121: }
122:
123: /**
124: * @see org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy#encode(org.apache.wicket.IRequestTarget)
125: */
126: public final CharSequence encode(IRequestTarget requestTarget) {
127: if (!(requestTarget instanceof IBookmarkablePageRequestTarget)) {
128: throw new IllegalArgumentException(
129: "this encoder can only be used with instances of "
130: + IBookmarkablePageRequestTarget.class
131: .getName());
132: }
133: AppendingStringBuffer url = new AppendingStringBuffer(40);
134: url.append(getMountPath());
135: IBookmarkablePageRequestTarget target = (IBookmarkablePageRequestTarget) requestTarget;
136: url.append("/").append(
137: Classes.simpleName(target.getPageClass())).append("/");
138:
139: PageParameters pageParameters = target.getPageParameters();
140: if (target.getPageMapName() != null) {
141: pageParameters.put(WebRequestCodingStrategy.PAGEMAP,
142: WebRequestCodingStrategy.encodePageMapName(target
143: .getPageMapName()));
144: }
145:
146: appendParameters(url, pageParameters);
147: return url;
148: }
149:
150: /**
151: * @see org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy#matches(org.apache.wicket.IRequestTarget)
152: */
153: public boolean matches(IRequestTarget requestTarget) {
154: if (requestTarget instanceof IBookmarkablePageRequestTarget) {
155: IBookmarkablePageRequestTarget target = (IBookmarkablePageRequestTarget) requestTarget;
156: if (packageName.equals(PackageName.forClass(target
157: .getPageClass()))) {
158: return true;
159: }
160: }
161: return false;
162: }
163:
164: /**
165: * @see java.lang.Object#toString()
166: */
167: public String toString() {
168: return "PackageEncoder[package=" + packageName + "]";
169: }
170: }
|