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.log4j.Logger;
022import org.apache.wiki.InternalWikiException;
023import org.apache.wiki.api.core.ContextEnum;
024import org.apache.wiki.api.core.Engine;
025import org.apache.wiki.util.TextUtil;
026
027import javax.servlet.http.HttpServletRequest;
028import java.nio.charset.Charset;
029import java.util.Properties;
030
031
032/**
033 *  Provides a way to do short URLs of the form /wiki/PageName.
034 *
035 *  @since 2.2
036 */
037public class ShortURLConstructor extends DefaultURLConstructor {
038    
039    private static final String DEFAULT_PREFIX = "wiki/";
040    private static final Logger log = Logger.getLogger( ShortURLConstructor.class );
041    
042    /** Contains the path part after the JSPWiki base URL */
043    protected String m_urlPrefix = "";
044    
045    /**
046     *  This corresponds to your WikiServlet path.  By default, it is assumed to be "wiki/", but you can set it to whatever you
047     *  like - including an empty name.
048     */
049    public static final String PROP_PREFIX = "jspwiki.shortURLConstructor.prefix";
050    
051    /** {@inheritDoc} */
052    @Override
053    public void initialize( final Engine engine, final Properties properties ) {
054        super.initialize( engine, properties );
055        
056        m_urlPrefix = TextUtil.getStringProperty( properties, PROP_PREFIX, null );
057        
058        if( m_urlPrefix == null ) {
059            m_urlPrefix = DEFAULT_PREFIX;
060        }
061
062        log.info("Short URL prefix path="+m_urlPrefix+" (You can use "+PROP_PREFIX+" to override this)");
063    }
064
065    /**
066     *  Constructs the actual URL based on the context.
067     */
068    private String makeURL( final String context, final String name ) {
069        final String viewurl = "%p" + m_urlPrefix + "%n";
070
071        if( context.equals( ContextEnum.PAGE_VIEW.getRequestContext() ) ) {
072            if( name == null ) {
073                return doReplacement("%u","" );
074            }
075            return doReplacement( viewurl, name );
076        } else if( context.equals( ContextEnum.PAGE_PREVIEW.getRequestContext() ) ) {
077            if( name == null ) {
078                return doReplacement("%u","" );
079            }
080            return doReplacement( viewurl + "?do=Preview", name );
081        } else if( context.equals( ContextEnum.PAGE_EDIT.getRequestContext() ) ) {
082            return doReplacement( viewurl + "?do=Edit", name );
083        } else if( context.equals( ContextEnum.PAGE_ATTACH.getRequestContext() ) ) {
084            return doReplacement( "%uattach/%n", name );
085        } else if( context.equals( ContextEnum.PAGE_INFO.getRequestContext() ) ) {
086            return doReplacement( viewurl + "?do=PageInfo", name );
087        } else if( context.equals( ContextEnum.PAGE_DIFF.getRequestContext() ) ) {
088            return doReplacement( viewurl + "?do=Diff", name );
089        } else if( context.equals( ContextEnum.PAGE_NONE.getRequestContext() ) ) {
090            return doReplacement( "%u%n", name );
091        } else if( context.equals( ContextEnum.PAGE_UPLOAD.getRequestContext() ) ) {
092            return doReplacement( viewurl + "?do=Upload", name ); 
093        } else if( context.equals( ContextEnum.PAGE_COMMENT.getRequestContext() ) ) {
094            return doReplacement( viewurl + "?do=Comment", name ); 
095        } else if( context.equals( ContextEnum.WIKI_LOGIN.getRequestContext() ) ) {
096            final String loginUrl = "%pLogin.jsp?redirect=%n";
097            return doReplacement( loginUrl, name ); 
098        } else if( context.equals( ContextEnum.PAGE_DELETE.getRequestContext() ) ) {
099            return doReplacement( viewurl + "?do=Delete", name ); 
100        } else if( context.equals( ContextEnum.PAGE_CONFLICT.getRequestContext() ) ) {
101            return doReplacement( viewurl + "?do=PageModified", name ); 
102        } else if( context.equals( ContextEnum.WIKI_PREFS.getRequestContext() ) ) {
103            return doReplacement( viewurl + "?do=UserPreferences", name ); 
104        } else if( context.equals( ContextEnum.WIKI_FIND.getRequestContext() ) ) {
105            return doReplacement( viewurl + "?do=Search", name ); 
106        } else if( context.equals( ContextEnum.WIKI_ERROR.getRequestContext() ) ) {
107            return doReplacement( "%uError.jsp", name );
108        } else if( context.equals( ContextEnum.WIKI_CREATE_GROUP.getRequestContext() ) ) {
109            return doReplacement( viewurl + "?do=NewGroup", name );
110        } else if( context.equals( ContextEnum.GROUP_DELETE.getRequestContext() ) ) {
111            return doReplacement( viewurl + "?do=DeleteGroup", name );
112        } else if( context.equals( ContextEnum.GROUP_EDIT.getRequestContext() ) ) {
113            return doReplacement( viewurl + "?do=EditGroup", name );
114        } else if( context.equals( ContextEnum.GROUP_VIEW.getRequestContext() ) ) {
115            return doReplacement( viewurl + "?do=Group&group=%n", name );
116        }
117        
118        throw new InternalWikiException( "Requested unsupported context " + context );
119    }
120
121    /**
122     *  {@inheritDoc}
123     */
124    @Override
125    public String makeURL( final String context, final String name, String parameters ) {
126        if( parameters != null && parameters.length() > 0 ) {
127            if( context.equals( ContextEnum.PAGE_ATTACH.getRequestContext() ) || context.equals( ContextEnum.PAGE_VIEW.getRequestContext() ) ) {
128                parameters = "?" + parameters;
129            } else if( context.equals(ContextEnum.PAGE_NONE.getRequestContext()) ) {
130                parameters = (name.indexOf('?') != -1 ) ? "&" : "?" + parameters;
131            } else {
132                parameters = "&"+parameters;
133            }
134        } else {
135            parameters = "";
136        }
137        return makeURL( context, name )+parameters;
138    }
139
140    /**
141     * {@inheritDoc}
142     */
143    @Override
144    public String parsePage( final String context, final HttpServletRequest request, final Charset encoding ) {
145        final String pagereq = request.getParameter( "page" );
146        if( pagereq == null ) {
147            return URLConstructor.parsePageFromURL( request, encoding );
148        }
149
150        return pagereq;
151    }
152
153    /**
154     *  {@inheritDoc}
155     */
156    @Override
157    public String getForwardPage( final HttpServletRequest req ) {
158        String jspPage = req.getParameter( "do" );
159        if( jspPage == null ) {
160            jspPage = "Wiki";
161        }
162    
163        return jspPage + ".jsp";
164    }
165
166}