/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.contentdata.custom;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import com.enonic.cms.core.content.contenttype.CtySetConfig;
/**
* Mar 22, 2010
*/
public class CustomContentDataModifier
{
private final CustomContentData existing;
private final Set<String> blockGroupsToPurgeByName = new HashSet<String>();
public CustomContentDataModifier( final CustomContentData existing )
{
this.existing = existing;
}
public void addBlockGroupsToPurge( final Collection<String> blockGroupNames )
{
blockGroupsToPurgeByName.addAll( blockGroupNames );
}
public void addBlockGroupToPurge( final String name )
{
CtySetConfig blockGroupConfig = existing.getContentTypeConfig().getSetConfig( name );
if ( blockGroupConfig == null )
{
throw new IllegalArgumentException( "Block group does not exist: " + name );
}
blockGroupsToPurgeByName.add( name );
}
public CustomContentData modify( final CustomContentData modifyingContentData )
{
final CustomContentData modifiedCCD = new CustomContentData( existing.getContentTypeConfig() );
// add existing ones if new one isn't found in the newContentData, otherwise use the new one.
for ( final DataEntry existingDataEntry : existing.getNonGroupDataEntries() )
{
final DataEntry dataEntryToAdd = resolveNonGroupDataEntryToUse( modifyingContentData, existingDataEntry );
if ( dataEntryToAdd != null )
{
modifiedCCD.add( dataEntryToAdd );
}
}
// add new ones, if not already added
for ( final DataEntry modifyingDataEntry : modifyingContentData.getNonGroupDataEntries() )
{
boolean notAlreadyAdded = !alreadyAdded( modifiedCCD, modifyingDataEntry );
if ( notAlreadyAdded )
{
modifiedCCD.add( modifyingDataEntry );
}
}
for ( CtySetConfig blockConfig : existing.getConfig().getSetConfig() )
{
if ( !blockConfig.hasGroupXPath() )
{
continue;
}
BlockGroupDataEntries existing = this.existing.getBlockGroupDataEntries( blockConfig.getName() );
BlockGroupDataEntries modifying = modifyingContentData.getBlockGroupDataEntries( blockConfig.getName() );
boolean purge = purgeRemainingBlockGroupDataEntries( blockConfig.getName() );
BlockGroupDataEntriesModifier modifier = new BlockGroupDataEntriesModifier( existing, purge );
BlockGroupDataEntries modified = modifier.modify( modifying );
for ( GroupDataEntry groupDataEntry : modified.getGroupDataEntries() )
{
modifiedCCD.add( groupDataEntry );
}
}
return modifiedCCD;
}
private DataEntry resolveNonGroupDataEntryToUse( final CustomContentData modifyingContentData, final DataEntry existingDataEntry )
{
final DataEntry modifyingDataEntry = modifyingContentData.getEntry( existingDataEntry.getName() );
if ( modifyingDataEntry != null )
{
return modifyingDataEntry;
}
else
{
return existingDataEntry;
}
}
private boolean purgeRemainingBlockGroupDataEntries( final String blockGroupName )
{
return blockGroupsToPurgeByName.contains( blockGroupName );
}
private boolean alreadyAdded( final CustomContentData contentData, final DataEntry dataEntry )
{
if ( dataEntry instanceof GroupDataEntry )
{
GroupDataEntry groupDataEntry = (GroupDataEntry) dataEntry;
return contentData.hasGroupDataEntry( groupDataEntry.getName(), groupDataEntry.getGroupIndex() );
}
else
{
return contentData.getEntry( dataEntry.getName() ) != null;
}
}
}