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;
}
}