/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content.contentdata.custom; import java.util.ArrayList; import java.util.List; import com.enonic.cms.core.content.contentdata.ContentData; import com.enonic.cms.core.content.contentdata.InvalidContentDataException; import com.enonic.cms.core.content.contentdata.MissingRequiredContentDataException; import com.enonic.cms.core.content.contenttype.ContentTypeConfig; import com.enonic.cms.core.content.contenttype.dataentryconfig.DataEntryConfig; public class CustomContentData extends AbstractDataEntrySet implements DataEntrySet, ContentData { private String titleInputName; public CustomContentData( ContentTypeConfig config ) { super( "contentdata", null, "contentdata" ); if ( config == null ) { throw new IllegalArgumentException( "Given config cannot be null" ); } setConfig( config ); this.titleInputName = config.getForm().getTitleInputName(); } public String getTitleInputName() { return titleInputName; } public TitleDataEntry getTitleDataEntry() { if ( titleInputName == null ) { return null; } return (TitleDataEntry) entryMap.get( titleInputName ); } public List<DataEntry> getNonGroupDataEntries() { final List<DataEntry> nonGroupEntries = new ArrayList<DataEntry>(); for ( DataEntry dataEntry : getEntries() ) { if ( !( dataEntry instanceof GroupDataEntry ) ) { nonGroupEntries.add( dataEntry ); } } return nonGroupEntries; } public BlockGroupDataEntries getBlockGroupDataEntries( String blockName ) { BlockGroupDataEntries blockGroupDataEntries = new BlockGroupDataEntries( blockName ); for ( GroupDataEntry groupDataEntry : getGroupDataSets( blockName ) ) { blockGroupDataEntries.add( groupDataEntry ); } return blockGroupDataEntries; } public void validate() { // validate required data validateRequiredDataEntries(); // Validate order of entries in group-data-entries validateOrderIndexOfGroupEntries(); // Validate each data entry for ( DataEntry dataEntry : entries ) { dataEntry.validate(); } } private void validateRequiredDataEntries() { for ( DataEntryConfig dataEntryConfig : getContentTypeConfig().getForm().getInputConfigs() ) { DataEntry dataEntry = getEntry( dataEntryConfig.getName() ); if ( dataEntryConfig.isRequired() ) { validateRequiredDataEntry( dataEntryConfig, dataEntry ); } } } private void validateOrderIndexOfGroupEntries() { for ( DataEntry dataEntry : entries ) { if ( dataEntry instanceof GroupDataEntry ) { final GroupDataEntry groupDataEntry = (GroupDataEntry) dataEntry; int expectedGroupDataEntryPosition = resolveActualPositionOfGroupDataEntry( groupDataEntry ); if ( expectedGroupDataEntryPosition != groupDataEntry.getGroupIndex() ) { throw new InvalidContentDataException( "Unexpected position of group data entry for group '" + groupDataEntry.getName() + "', got position " + groupDataEntry.getGroupIndex() + ", expected position " + expectedGroupDataEntryPosition ); } } } } /** * Resolve given groupDataEntry's position among it's brothers and sisters (those with same name). */ private int resolveActualPositionOfGroupDataEntry( GroupDataEntry groupDataEntry ) { int position = 0; final List<GroupDataEntry> groupDataEntryWithSameName = getGroupDataSets( groupDataEntry.getName() ); for ( GroupDataEntry currGroupDataEntry : groupDataEntryWithSameName ) { position++; if ( currGroupDataEntry == groupDataEntry ) { return position; } } // indicates not found (should never happen with current usage of this method) return -1; } public String getTitle() { TitleDataEntry titleDataEntry = getTitleDataEntry(); if ( titleDataEntry == null ) { throw new TitleDataEntryNotFoundException( getTitleInputName() ); } if ( !titleDataEntry.hasValue() ) { throw MissingRequiredContentDataException.missingTitleDataEntryValue( getInputConfig( titleDataEntry.getName() ) ); } return titleDataEntry.getValueAsTitle(); } @Override public DataEntryConfig getInputConfig( String name ) { return config.getInputConfig( name ); } @Override public ContentTypeConfig getContentTypeConfig() { return (ContentTypeConfig) super.getContentTypeConfig(); } public List<BinaryDataEntry> getRemovedBinaryDataEntries( CustomContentData compareToThis ) { List<BinaryDataEntry> removedEntries = new ArrayList<BinaryDataEntry>(); List<BinaryDataEntry> currentList = getBinaryDataEntryList(); for ( BinaryDataEntry binaryDataEntry : currentList ) { if ( !compareToThis.hasBinaryDataEntry( binaryDataEntry ) ) { removedEntries.add( binaryDataEntry ); } } return removedEntries; } }