/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.content.imports;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.enonic.cms.core.content.ContentEntity;
import com.enonic.cms.core.content.ContentVersionEntity;
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.DataEntryType;
import com.enonic.cms.core.content.contentdata.custom.GroupDataEntry;
import com.enonic.cms.core.content.contentdata.custom.stringbased.TextDataEntry;
public class BlockIndexResolver
{
final private ContentEntity existingContent;
final private Map<String, Integer> newGroupIndexCountMap = new HashMap<String, Integer>();
public BlockIndexResolver( final ContentEntity existingContent )
{
this.existingContent = existingContent;
}
public int resolve( final String blockName, final String syncInputName, final String syncValue )
{
if ( existingContent == null || syncInputName == null )
{
return resolveNextBlockIndex( blockName, 0 );
}
return resolveFromExistingContent( blockName, syncInputName, syncValue );
}
private int resolveFromExistingContent( final String blockName, final String syncInputName, final String syncValue )
{
final ContentVersionEntity existingMainVersion = existingContent.getMainVersion();
final CustomContentData existingContentData = (CustomContentData) existingMainVersion.getContentData();
final List<GroupDataEntry> existingGroupDataEntries = existingContentData.getGroupDataSets( blockName );
for ( final GroupDataEntry groupDataEntry : existingGroupDataEntries )
{
final DataEntry dataEntryForSync = groupDataEntry.getEntry( syncInputName );
if ( dataEntryForSync.getType() == DataEntryType.TEXT )
{
final TextDataEntry textDataEntry = (TextDataEntry) dataEntryForSync;
if ( textDataEntry.getValue().equals( syncValue ) )
{
return groupDataEntry.getGroupIndex();
}
}
}
return resolveNextBlockIndex( blockName, existingGroupDataEntries.size() );
}
private int resolveNextBlockIndex( final String groupName, final int existingGroupDataEntryCount )
{
int index = existingGroupDataEntryCount;
if ( newGroupIndexCountMap.containsKey( groupName ) )
{
index = newGroupIndexCountMap.get( groupName );
}
index++;
newGroupIndexCountMap.put( groupName, index );
return index;
}
}