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     */
019    package org.apache.wiki.url;
020    
021    import java.io.UnsupportedEncodingException;
022    import java.util.Properties;
023    
024    import javax.servlet.http.HttpServletRequest;
025    
026    import org.apache.log4j.Logger;
027    
028    import org.apache.wiki.InternalWikiException;
029    import org.apache.wiki.WikiContext;
030    import org.apache.wiki.WikiEngine;
031    import org.apache.wiki.util.TextUtil;
032    
033    
034    /**
035     *  Provides a way to do short URLs of the form /wiki/PageName.
036     *
037     *
038     *  @since 2.2
039     */
040    public class ShortURLConstructor
041        extends DefaultURLConstructor
042    {
043        private static final String DEFAULT_PREFIX = "wiki/";
044    
045        static Logger log = Logger.getLogger( ShortURLConstructor.class );
046        
047        /**
048         *  Contains the path part after the JSPWiki base URL
049         */
050        protected String m_urlPrefix = "";
051        
052        /**
053         *  This corresponds to your WikiServlet path.  By default, it is assumed to
054         *  be "wiki/", but you can set it to whatever you like - including an empty
055         *  name.
056         */
057        public static final String PROP_PREFIX = "jspwiki.shortURLConstructor.prefix";
058        
059        /** {@inheritDoc} */
060        public void initialize( WikiEngine engine, 
061                                Properties properties )
062        {
063            super.initialize( engine, properties );
064            
065            m_urlPrefix = TextUtil.getStringProperty( properties, PROP_PREFIX, null );
066            
067            if( m_urlPrefix == null )
068            {
069                m_urlPrefix = DEFAULT_PREFIX;
070            }
071    
072            log.info("Short URL prefix path="+m_urlPrefix+" (You can use "+PROP_PREFIX+" to override this)");
073        }
074    
075        /**
076         *  Constructs the actual URL based on the context.
077         */
078        private String makeURL( String context,
079                                String name,
080                                boolean absolute )
081        {
082            String viewurl = "%p"+m_urlPrefix+"%n";
083    
084            if( absolute ) 
085                viewurl = "%u"+m_urlPrefix+"%n";
086    
087            if( context.equals(WikiContext.VIEW) )
088            {
089                if( name == null ) return doReplacement("%u","",absolute);
090                return doReplacement( viewurl, name, absolute );
091            }
092            else if( context.equals(WikiContext.PREVIEW) )
093            {
094                if( name == null ) return doReplacement("%u","",absolute);
095                return doReplacement( viewurl+"?do=Preview", name, absolute);
096            }
097            else if( context.equals(WikiContext.EDIT) )
098            {
099                return doReplacement( viewurl+"?do=Edit", name, absolute );
100            }
101            else if( context.equals(WikiContext.ATTACH) )
102            {
103                return doReplacement( "%uattach/%n", name, absolute );
104            }
105            else if( context.equals(WikiContext.INFO) )
106            {
107                return doReplacement( viewurl+"?do=PageInfo", name, absolute );
108            }
109            else if( context.equals(WikiContext.DIFF) )
110            {
111                return doReplacement( viewurl+"?do=Diff", name, absolute );
112            }
113            else if( context.equals(WikiContext.NONE) )
114            {
115                return doReplacement( "%u%n", name, absolute );
116            }
117            else if( context.equals(WikiContext.UPLOAD) )
118            {
119                return doReplacement( viewurl+"?do=Upload", name, absolute ); 
120            }
121            else if( context.equals(WikiContext.COMMENT) )
122            {
123                return doReplacement( viewurl+"?do=Comment", name, absolute ); 
124            }
125            else if( context.equals(WikiContext.LOGIN) )
126            {
127                String loginUrl = absolute ? "%uLogin.jsp?redirect=%n" : "%pLogin.jsp?redirect=%n";
128                return doReplacement( loginUrl, name, absolute ); 
129            }
130            else if( context.equals(WikiContext.DELETE) )
131            {
132                return doReplacement( viewurl+"?do=Delete", name, absolute ); 
133            }
134            else if( context.equals(WikiContext.CONFLICT) )
135            {
136                return doReplacement( viewurl+"?do=PageModified", name, absolute ); 
137            }
138            else if( context.equals(WikiContext.PREFS) )
139            {
140                return doReplacement( viewurl+"?do=UserPreferences", name, absolute ); 
141            }
142            else if( context.equals(WikiContext.FIND) )
143            {
144                return doReplacement( viewurl+"?do=Search", name, absolute ); 
145            }
146            else if( context.equals(WikiContext.ERROR) )
147            {
148                return doReplacement( "%uError.jsp", name, absolute );
149            }
150            else if( context.equals(WikiContext.CREATE_GROUP) )
151            {
152                return doReplacement( viewurl+"?do=NewGroup", name, absolute );
153            }
154            else if( context.equals(WikiContext.DELETE_GROUP) )
155            {
156                return doReplacement( viewurl+"?do=DeleteGroup", name, absolute );
157            }        
158            else if( context.equals(WikiContext.EDIT_GROUP) )
159            {
160                return doReplacement( viewurl+"?do=EditGroup", name, absolute );
161            }
162            else if( context.equals(WikiContext.VIEW_GROUP) )
163            {
164                return doReplacement( viewurl+"?do=Group&group=%n", name, absolute );
165            }
166            
167            throw new InternalWikiException("Requested unsupported context "+context);
168        }
169    
170        /**
171         *  {@inheritDoc}
172         */
173        public String makeURL( String context,
174                               String name,
175                               boolean absolute,
176                               String parameters )
177        {
178            if( parameters != null && parameters.length() > 0 )
179            {            
180                if( context.equals(WikiContext.ATTACH) || context.equals(WikiContext.VIEW) )
181                {
182                    parameters = "?"+parameters;
183                }
184                else if( context.equals(WikiContext.NONE) )
185                {
186                    parameters = (name.indexOf('?') != -1 ) ? "&" : "?" + parameters;
187                }
188                else
189                {
190                    parameters = "&"+parameters;
191                }
192            }
193            else
194            {
195                parameters = "";
196            }
197            return makeURL( context, name, absolute )+parameters;
198        }
199    
200        /**
201         * {@inheritDoc}
202         */
203        public String parsePage( String context,
204                                 HttpServletRequest request,
205                                 String encoding )
206            throws UnsupportedEncodingException
207        {
208            String pagereq = request.getParameter( "page" );
209    
210            if( pagereq == null )
211            {
212                pagereq = parsePageFromURL( request, encoding );
213            }
214    
215            return pagereq;
216        }
217    
218        /**
219         *  {@inheritDoc}
220         */
221        public String getForwardPage( HttpServletRequest req )
222        {
223            String jspPage = req.getParameter( "do" );
224            if( jspPage == null ) jspPage = "Wiki";
225        
226            return jspPage+".jsp";
227        }
228    }