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}