package com.mckessonaps.jspwiki.handler.newpage; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Map; import com.ecyrd.jspwiki.TranslatorReader; import com.ecyrd.jspwiki.WikiContext; import com.ecyrd.jspwiki.WikiEngine; import com.ecyrd.jspwiki.WikiException; import com.ecyrd.jspwiki.WikiPage; import com.ecyrd.jspwiki.forms.FormHandler; import com.ecyrd.jspwiki.plugin.PluginException; import com.ecyrd.jspwiki.plugin.PluginManager; import com.ecyrd.jspwiki.plugin.WikiPlugin; /** * Creates a new page using the information provided by a form. Requried * parameters are: _body and newPageName Optional parameters are: * newPageNamePrefix - if you want a prefix automatically applied; autoIncrement - * if you want suffix numbers generated to make a unique page name. * * Patched two bugs: * * - Umlate where not correctly translated * - You can use Plugins now, use ({Plugin}) in your template syntax. * * Christoph Sauer, 14-Sep-2006 * */ public class NewPageHandler implements FormHandler, WikiPlugin { private static final String PARAM_NEW_PAGE_NAME = "newPageName"; private static final String PARAM_NEW_PAGE_NAME_PREFIX = "newPageNamePrefix"; private static final String PARAM_AUTO_INCREMENT = "autoIncrement"; public String execute(WikiContext context, Map params) throws PluginException { String template = (String) params.get(PluginManager.PARAM_BODY); if (( null == template ) || ( template.trim().equals("") )) return "No template text for the new page was provided in the body of FormOutput."; //String newPageName = (String) params.get(PARAM_NEW_PAGE_NAME); String newPageName = safeParameter(params, PARAM_NEW_PAGE_NAME, context); if (( null == newPageName ) || ( newPageName.trim().equals("") )) return "Parameter 'newPageName' must be provided"; String prefix = (String) params.get(PARAM_NEW_PAGE_NAME_PREFIX); if (null != prefix) { newPageName = prefix.trim() + newPageName; } newPageName = TranslatorReader.cleanLink(newPageName); if (exists(context, newPageName)) { boolean autoIncrement = ( null != params.get(PARAM_AUTO_INCREMENT) ); if (!autoIncrement) return "" + newPageName + " already exists."; newPageName = autoIncrement(context, newPageName); } String newPageWikiText = expandTemplate(params, template, context); String message = saveNewPage(context, newPageWikiText, newPageName); return message; } private boolean exists(WikiContext context, String newPageName) { return context.getEngine().pageExists(newPageName); } private String autoIncrement(WikiContext context, String barePageName) { int suffix = 1; String pageName = barePageName + suffix; while (exists(context, pageName)) { suffix++; pageName = barePageName + suffix; } return pageName; } private String expandTemplate(Map params, String template, WikiContext context) { for (Iterator iter = params.keySet().iterator(); iter.hasNext();) { String paramName = (String) iter.next(); String paramLabel = "\\$\\(" + paramName + "\\)"; String value = safeParameter(params, paramName, context); template = template.replaceAll(paramLabel, value); template = escapePluginSyntax(template); } return template; } private String safeParameter(Map params, String paramName, WikiContext context) { WikiEngine engine = context.getEngine(); String encoding = "UTF-8"; if (engine != null) { encoding = engine.getContentEncoding(); } String value = (String) params.get(paramName); try { // see Problem Description in coment to WikiEngine.saveGetParameter() value = new String(value.getBytes("ISO-8859-1"), encoding); } catch( UnsupportedEncodingException e ) { System.out.println( "WARNING ScriptParameter: Unsupported encoding" + e ); value = (String) params.get(paramName); } return value; } private String saveNewPage(WikiContext context, String template, String newPageName) { String message; WikiPage newPage = new WikiPage(newPageName); WikiContext newContext = (WikiContext) context.clone(); newContext.setPage(newPage); try { context.getEngine().saveText(newContext, template); message = "" + newPageName + " created."; } catch (WikiException e) { message = "Failed to save page: " + newPageName; } return message; } // to enable Plugins within plugins this is quick workaround: use // ({ }) instead of [{ }] in our dynamic output. private String escapePluginSyntax(String s) { if (s == null) { return null; } s = s.replaceAll("\\(\\{", "\\[\\{"); s = s.replaceAll("\\}\\)", "\\}\\]"); return s; } }