All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.wicket.request.mapper.PackageMapper Maven / Gradle / Ivy

Go to download

Pax Wicket Service is an OSGi extension of the Wicket framework, allowing for dynamic loading and unloading of Wicket components and pageSources.

There is a newer version: 5.0.0
Show newest version
/*
 * 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.
 * 

* To mount this mapper onto a path use the {@link WebApplication#mountPackage(String, Class)}, ex: * *

 * MyApp#init() {
 * 
 *   super.init();
 *   mountPackage("/my/path", MyPage.class);
 * }
 * 
* * will result in urls like {@code /my/path/MyPage} *

* *
 *  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)
 * 
*/ 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 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 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 '..'. *

* @see WICKET-4303 *

*/ 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; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy