    001/*
    002    Licensed to the Apache Software Foundation (ASF) under one
    003    or more contributor license agreements.  See the NOTICE file
    004    distributed with this work for additional information
    005    regarding copyright ownership.  The ASF licenses this file
    006    to you under the Apache License, Version 2.0 (the
    007    "License"); you may not use this file except in compliance
    008    with the License.  You may obtain a copy of the License at
    009
    010       http://www.apache.org/licenses/LICENSE-2.0
    011
    012    Unless required by applicable law or agreed to in writing,
    013    software distributed under the License is distributed on an
    014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    015    KIND, either express or implied.  See the License for the
    016    specific language governing permissions and limitations
    017    under the License.
    018 */
    019package org.apache.wiki.url;
    020
    021import org.apache.logging.log4j.LogManager;
    022import org.apache.logging.log4j.Logger;
    023import org.apache.wiki.InternalWikiException;
    024import org.apache.wiki.api.core.ContextEnum;
    025import org.apache.wiki.api.core.Engine;
    026import org.apache.wiki.util.TextUtil;
    027
    028import javax.servlet.http.HttpServletRequest;
    029import java.nio.charset.Charset;
    030import java.util.Properties;
    031
    032
    033/**
    034 *  Provides a way to do short URLs of the form /wiki/PageName.
    035 *
    036 *  @since 2.2
    037 */
    038public class ShortURLConstructor extends DefaultURLConstructor {
    039
    040    private static final String DEFAULT_PREFIX = "wiki/";
    041    private static final Logger LOG = LogManager.getLogger( ShortURLConstructor.class );
    042
    043    /** Contains the path part after the JSPWiki base URL */
    044    protected String m_urlPrefix = "";
    045
    046    /**
    047     *  This corresponds to your WikiServlet path.  By default, it is assumed to be "wiki/", but you can set it to whatever you
    048     *  like - including an empty name.
    049     */
    050    public static final String PROP_PREFIX = "jspwiki.shortURLConstructor.prefix";
    051
    052    /** {@inheritDoc} */
    053    @Override
    054    public void initialize( final Engine engine, final Properties properties ) {
    055        super.initialize( engine, properties );
    056
    057        m_urlPrefix = TextUtil.getStringProperty( properties, PROP_PREFIX, null );
    058
    059        if( m_urlPrefix == null ) {
    060            m_urlPrefix = DEFAULT_PREFIX;
    061        }
    062
    063        LOG.info("Short URL prefix path="+m_urlPrefix+" (You can use "+PROP_PREFIX+" to override this)");
    064    }
    065
    066    /**
    067     *  Constructs the actual URL based on the context.
    068     */
    069    private String makeURL( final String context, final String name ) {
    070        final String viewurl = "%p" + m_urlPrefix + "%n";
    071
    072        if( context.equals( ContextEnum.PAGE_VIEW.getRequestContext() ) ) {
    073            if( name == null ) {
    074                return doReplacement("%u","" );
    075            }
    076            return doReplacement( viewurl, name );
    077        } else if( context.equals( ContextEnum.PAGE_PREVIEW.getRequestContext() ) ) {
    078            if( name == null ) {
    079                return doReplacement("%u","" );
    080            }
    081            return doReplacement( viewurl + "?do=Preview", name );
    082        } else if( context.equals( ContextEnum.PAGE_EDIT.getRequestContext() ) ) {
    083            return doReplacement( viewurl + "?do=Edit", name );
    084        } else if( context.equals( ContextEnum.PAGE_ATTACH.getRequestContext() ) ) {
    085            return doReplacement( "%uattach/%n", name );
    086        } else if( context.equals( ContextEnum.PAGE_INFO.getRequestContext() ) ) {
    087            return doReplacement( viewurl + "?do=PageInfo", name );
    088        } else if( context.equals( ContextEnum.PAGE_DIFF.getRequestContext() ) ) {
    089            return doReplacement( viewurl + "?do=Diff", name );
    090        } else if( context.equals( ContextEnum.PAGE_NONE.getRequestContext() ) ) {
    091            return doReplacement( "%u%n", name );
    092        } else if( context.equals( ContextEnum.PAGE_UPLOAD.getRequestContext() ) ) {
    093            return doReplacement( viewurl + "?do=Upload", name );
    094        } else if( context.equals( ContextEnum.PAGE_COMMENT.getRequestContext() ) ) {
    095            return doReplacement( viewurl + "?do=Comment", name );
    096        } else if( context.equals( ContextEnum.WIKI_LOGIN.getRequestContext() ) ) {
    097            final String loginUrl = "%pLogin.jsp?redirect=%n";
    098            return doReplacement( loginUrl, name );
    099        } else if( context.equals( ContextEnum.PAGE_DELETE.getRequestContext() ) ) {
    100            return doReplacement( viewurl + "?do=Delete", name );
    101        } else if( context.equals( ContextEnum.PAGE_CONFLICT.getRequestContext() ) ) {
    102            return doReplacement( viewurl + "?do=PageModified", name );
    103        } else if( context.equals( ContextEnum.WIKI_PREFS.getRequestContext() ) ) {
    104            return doReplacement( viewurl + "?do=UserPreferences", name );
    105        } else if( context.equals( ContextEnum.WIKI_FIND.getRequestContext() ) ) {
    106            return doReplacement( viewurl + "?do=Search", name );
    107        } else if( context.equals( ContextEnum.WIKI_ERROR.getRequestContext() ) ) {
    108            return doReplacement( "%uError.jsp", name );
    109        } else if( context.equals( ContextEnum.WIKI_CREATE_GROUP.getRequestContext() ) ) {
    110            return doReplacement( viewurl + "?do=NewGroup", name );
    111        } else if( context.equals( ContextEnum.GROUP_DELETE.getRequestContext() ) ) {
    112            return doReplacement( viewurl + "?do=DeleteGroup", name );
    113        } else if( context.equals( ContextEnum.GROUP_EDIT.getRequestContext() ) ) {
    114            return doReplacement( viewurl + "?do=EditGroup", name );
    115        } else if( context.equals( ContextEnum.GROUP_VIEW.getRequestContext() ) ) {
    116            return doReplacement( viewurl + "?do=Group&group=%n", name );
    117        }
    118
    119        throw new InternalWikiException( "Requested unsupported context " + context );
    120    }
    121
    122    /**
    123     *  {@inheritDoc}
    124     */
    125    @Override
    126    public String makeURL( final String context, final String name, String parameters ) {
    127        if( parameters != null && !parameters.isEmpty() ) {
    128            if( context.equals( ContextEnum.PAGE_ATTACH.getRequestContext() ) || context.equals( ContextEnum.PAGE_VIEW.getRequestContext() ) ) {
    129                parameters = "?" + parameters;
    130            } else if( context.equals(ContextEnum.PAGE_NONE.getRequestContext()) ) {
    131                parameters = (name.indexOf('?') != -1 ) ? "&amp;" : "?" + parameters;
    132            } else {
    133                parameters = "&amp;"+parameters;
    134            }
    135        } else {
    136            parameters = "";
    137        }
    138        return makeURL( context, name )+parameters;
    139    }
    140
    141    /**
    142     * {@inheritDoc}
    143     */
    144    @Override
    145    public String parsePage( final String context, final HttpServletRequest request, final Charset encoding ) {
    146        final String pagereq = request.getParameter( "page" );
    147        if( pagereq == null ) {
    148            return URLConstructor.parsePageFromURL( request, encoding );
    149        }
    150
    151        return pagereq;
    152    }
    153
    154    /**
    155     *  {@inheritDoc}
    156     */
    157    @Override
    158    public String getForwardPage( final HttpServletRequest req ) {
    159        String jspPage = req.getParameter( "do" );
    160        if( jspPage == null ) {
    161            jspPage = "Wiki";
    162        }
    163
    164        return jspPage + ".jsp";
    165    }
    166
    167}