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 ) ? "&" : "?" + parameters;
132            } else {
133                parameters = "&"+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}