package com.openedit.page.manage;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.openedit.repository.ContentItem;
import org.openedit.repository.ReaderItem;
import com.openedit.OpenEditException;
import com.openedit.config.Configuration;
import com.openedit.page.Page;
import com.openedit.page.PageAction;
import com.openedit.page.PageProperty;
import com.openedit.page.PageSettings;
import com.openedit.page.Permission;
import com.openedit.page.XconfConfiguration;
import com.openedit.util.XmlUtil;
import com.openedit.util.strainer.FilterWriter;
/**
* @author cburkey
*
*/
public class PageSettingsToXconfWriter
{
private static final Log log = LogFactory.getLog(PageSettingsToXconfWriter.class);
protected FilterWriter fieldFilterWriter;
protected XmlUtil fieldXmlUtil = new XmlUtil();
/**
* @param inSetting
* @return
*/
public ContentItem createXConf(PageSettings inSetting) throws OpenEditException
{
//need to make an xconf string
XconfConfiguration config = new XconfConfiguration();
config.setName("page");
//start by reading old xconf since there could be extra info in it
if (inSetting.getXConf().exists())
{
config.populate(fieldXmlUtil.getXml(inSetting.getXConf().getInputStream(),inSetting.getPageCharacterEncoding()));
}
//now update the config
saveProperties(inSetting, config);
saveLayout(inSetting, config);
saveInnerLayout(inSetting, config);
savePermissions(inSetting, config);
savePathActions(inSetting, config);
savePageActions(inSetting, config);
saveUserDefinedData(inSetting, config);
StringWriter out = new StringWriter();
Document root = config.asXml();
fieldXmlUtil.saveXml(root, out, inSetting.getPageCharacterEncoding());
ReaderItem results = new ReaderItem(inSetting.getPath(), new StringReader(out.toString()), inSetting.getPageCharacterEncoding());
return results;
}
protected void saveUserDefinedData(PageSettings inSettings, XconfConfiguration inConfig)
{
if( inSettings.getUserDefinedData() != null)
{
for( Object o: inSettings.getUserDefinedData().getChildren())
{
inConfig.addChild((Configuration) o);
}
}
}
protected void saveProperties(PageSettings inProperties, XconfConfiguration inConfig)
{
//Updated to exsting properties
inConfig.removeAllProperties();
for (Iterator iter = inProperties.getProperties().values().iterator(); iter.hasNext();)
{
PageProperty element = (PageProperty) iter.next();
for (Iterator iterator = element.getValues().keySet().iterator(); iterator.hasNext();)
{
String lang = (String) iterator.next();
String val = (String)element.getValues().get(lang);
inConfig.saveProperty(element.getName(), val, lang);
}
}
// inConfig.removeProperty("encoding");
// if( inProperties.getFieldPageCharacterEncoding() != null)
// {
// inConfig.saveProperty("encoding",inProperties.getFieldPageCharacterEncoding(), null);
// }
}
protected void saveLayout(PageSettings inPageSetting, XconfConfiguration inConfig)
{
//Save the template
String layout = inPageSetting.getFieldLayout();
inConfig.removeConfigurations("layout");
if (layout != null)
{
if ( Page.BLANK_LAYOUT.equals( layout ) )
{
//add a blank layout
inConfig.addChild("layout");
}
else
{
inConfig.addChild("layout").setValue(layout);
}
}
}
protected void saveInnerLayout(PageSettings inPageSetting, XconfConfiguration inConfig)
{
//Save the template
String innerLayout = inPageSetting.getFieldInnerLayout();
if ( innerLayout != null && !innerLayout.equals(""))
{
inConfig.removeConfigurations("inner-layout");
inConfig.addChild("inner-layout").setValue(innerLayout);
}
}
/** Handle this one day
inConfig.removeElements("generator");
//the choices are velocity-xslt xslt velocity jsp
if ( inPageSetting.getFieldGenerator() != null)
{
inPageSetting.getFieldGenerator();
for (Iterator iter = .iterator(); iter.hasNext();)
{
Generator gen = (Generator) iter.next();
//TODO: if ( gen instanceof NestedGenerator) handle nested and mimetypes
String generator = gen.getName();
XMLConfiguration currentGen = (XMLConfiguration) inConfig.addChild("generator");
currentGen.setAttribute("name", generator);
//TODO: currentGen.setAttribute("mimetypes", generator.);
}
}
*/
// protected void saveContentFile(PageSettings inPageSetting, XconfConfiguration inConfig)
// {
// //content file
// String contentfile = (String) inPageSetting.getFieldAlternativeContentPath();
//
// inConfig.setContentFile(contentfile);
// }
protected void savePermissions(PageSettings inPageSetting, XconfConfiguration inConfig)
{
inConfig.removeConfigurations("permission");
inConfig.removeConfigurations("edit-requirements");
inConfig.removeConfigurations("view-requirements");
//the choices are velocity-xslt xslt velocity jsp
if ( inPageSetting.getFieldPermissions() != null)
{
for (Iterator iter = inPageSetting.getFieldPermissions().iterator(); iter.hasNext();)
{
Permission per = (Permission) iter.next();
getFilterWriter().writeFilterCollection(per, inConfig);
}
}
}
public FilterWriter getFilterWriter()
{
if (fieldFilterWriter == null)
{
fieldFilterWriter = new FilterWriter();
}
return fieldFilterWriter;
}
public void setFilterWriter(FilterWriter inFilterWriter)
{
fieldFilterWriter = inFilterWriter;
}
protected void savePathActions(PageSettings inPageSetting, XconfConfiguration inConfig)
{
inConfig.removeConfigurations("path-action");
if ( inPageSetting.getFieldPathActions() != null)
{
for (Iterator iter = inPageSetting.getFieldPathActions().iterator(); iter.hasNext();)
{
PageAction action = (PageAction) iter.next();
Configuration config = action.getConfig();
config.setName("path-action");
inConfig.addChild(config);
}
}
}
protected void savePageActions(PageSettings inPageSetting, XconfConfiguration inConfig)
{
inConfig.removeConfigurations("page-action");
if ( inPageSetting.getFieldPageActions() != null)
{
for (Iterator iter = inPageSetting.getFieldPageActions().iterator(); iter.hasNext();)
{
PageAction action = (PageAction) iter.next();
Configuration config = action.getConfig();
config.setName("page-action");
inConfig.addChild(config);
}
}
}
}