/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.contentdata.custom.support;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import com.enonic.cms.core.content.contentdata.ContentDataXPathCreator;
import com.enonic.cms.core.content.contentdata.custom.CustomContentData;
import com.enonic.cms.core.content.contentdata.custom.DataEntry;
import com.enonic.cms.core.content.contentdata.custom.GroupDataEntry;
import com.enonic.cms.core.content.contenttype.ContentTypeConfig;
import com.enonic.cms.core.content.contenttype.CtySet;
import com.enonic.cms.core.content.contenttype.CtySetConfig;
import com.enonic.cms.core.content.contenttype.dataentryconfig.DataEntryConfig;
public class CustomContentDataXmlCreator
{
private FileDataEntryXmlCreator fileDataEntryXmlCreator = new FileDataEntryXmlCreator();
private int binaryCount = 0;
private BinaryDataEntryXmlCreator binaryDataEntryXmlCreator =
new BinaryDataEntryXmlCreator( new BinaryDataEntryXmlCreator.BinaryDummyKeyResolver()
{
public int getNew()
{
return binaryCount++;
}
} );
public static Document createContentDataDocument( CustomContentData contentData )
{
return new Document( createContentDataElement( contentData ) );
}
public static Element createContentDataElement( CustomContentData contentData )
{
CustomContentDataXmlCreator xmlCreator = new CustomContentDataXmlCreator();
return xmlCreator.createElement( contentData );
}
public Element createElement( CustomContentData contentData )
{
Element contentdataEl = new Element( "contentdata" );
doAddToContentData( contentdataEl, contentData );
return contentdataEl;
}
private void doAddToContentData( Element el, CustomContentData contentData )
{
ContentTypeConfig contentTypeConfig = contentData.getContentTypeConfig();
List<CtySetConfig> setConfigs = contentTypeConfig.getForm().getSetConfig();
for ( CtySetConfig setConfig : setConfigs )
{
// the set/block/group has its own xpath
if ( setConfig.getGroupXPath() != null )
{
List<GroupDataEntry> groupDataSets = contentData.getGroupDataSets( setConfig.getName() );
for ( GroupDataEntry groupEntrySet : groupDataSets )
{
CtySet groupSetConfig = groupEntrySet.getConfig();
final String xpath = stripContentdata( groupSetConfig.getRelativeXPath() );
Element groupEl = ContentDataXPathCreator.createNewPath( el, xpath );
doCreateEntryElements( groupSetConfig.getInputConfigs(), groupEntrySet, groupEl );
}
}
else
{
List<DataEntryConfig> inputConfigs = setConfig.getInputConfigs();
doCreateEntryElements( inputConfigs, contentData, el );
}
}
}
private void doCreateEntryElements( List<DataEntryConfig> inputConfigs, GroupDataEntry groupEntrySet, Element groupEl )
{
DataEntryXmlCreator dataEntryXmlCreator = new DataEntryXmlCreator( fileDataEntryXmlCreator, binaryDataEntryXmlCreator, true );
for ( DataEntryConfig dataEntryConfig : inputConfigs )
{
String name = dataEntryConfig.getName();
DataEntry dataEntry = groupEntrySet.getEntry( name );
if ( dataEntry != null && dataEntry.hasValue() )
{
dataEntryXmlCreator.createEntryElement( groupEl, dataEntry );
}
else
{
final Element el = ContentDataXPathCreator.ensurePath( groupEl, dataEntryConfig.getRelativeXPath() );
el.setAttribute( "has-value", "false" );
}
}
}
private void doCreateEntryElements( List<DataEntryConfig> inputConfigs, CustomContentData contentData, Element contentdataEl )
{
DataEntryXmlCreator dataEntryXmlCreator = new DataEntryXmlCreator( fileDataEntryXmlCreator, binaryDataEntryXmlCreator, false );
for ( DataEntryConfig dataEntryConfig : inputConfigs )
{
String name = dataEntryConfig.getName();
DataEntry dataEntry = contentData.getEntry( name );
if ( dataEntry != null && dataEntry.hasValue() )
{
dataEntryXmlCreator.createEntryElement( contentdataEl, dataEntry );
}
else
{
final Element el =
ContentDataXPathCreator.ensurePath( contentdataEl, stripContentdata( dataEntryConfig.getRelativeXPath() ) );
el.setAttribute( "has-value", "false" );
}
}
}
private String stripContentdata( String xpath )
{
if ( xpath.startsWith( "contentdata/" ) )
{
return xpath.substring( "contentdata/".length() );
}
else if ( xpath.startsWith( "/contentdata/" ) )
{
return xpath.substring( "/contentdata/".length() );
}
return xpath;
}
}