/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content; import java.util.HashSet; import java.util.Set; import org.jdom.Element; import com.enonic.cms.core.content.resultset.RelatedChildContent; import com.enonic.cms.core.content.resultset.RelatedContent; import com.enonic.cms.core.content.resultset.RelatedContentResultSet; import com.enonic.cms.core.content.resultset.RelatedParentContent; public class RelatedContentKeysXmlCreator { private RelatedContentResultSet relatedContents; public RelatedContentKeysXmlCreator( RelatedContentResultSet relatedContents ) { this.relatedContents = relatedContents; } public Element createForContent( final ContentVersionEntity contentVersion ) { int addCount = 0; final Element rcKeysElement = new Element( "relatedcontentkeys" ); HashSet<ContentEntity> contentAlreadyAdded = new HashSet<ContentEntity>(); for ( RelatedParentContent relatedParent : relatedContents.getRootRelatedParents( contentVersion.getContent() ) ) { Element relatedContentKeyElement = doCreateRelatedContentKeyElement( relatedParent.getContent(), "-1", contentAlreadyAdded ); if ( relatedContentKeyElement != null ) { rcKeysElement.addContent( relatedContentKeyElement ); addCount++; } } contentAlreadyAdded.clear(); for ( RelatedChildContent relatedChild : relatedContents.getRootRelatedChildren( contentVersion ) ) { Element relatedContentKeyElement = doCreateRelatedContentKeyElement( relatedChild.getContent(), "1", contentAlreadyAdded ); if ( relatedContentKeyElement != null ) { rcKeysElement.addContent( relatedContentKeyElement ); addCount++; } } rcKeysElement.setAttribute( "count", Integer.toString( addCount ) ); return rcKeysElement; } public Element createForRelatedContent( final RelatedContent relatedContent ) { int addCount = 0; final Element rcKeysEl = new Element( "relatedcontentkeys" ); if ( relatedContent instanceof RelatedParentContent ) { RelatedParentContent relatedContentAsParent = (RelatedParentContent) relatedContent; addCount += doAddRelatedContentKeys( relatedContentAsParent.getRelatedParents(), "-1", rcKeysEl ); addCount += doAddRelatedContentKeys( relatedContentAsParent.getRelatedChildren(), "1", rcKeysEl ); } else { RelatedChildContent relatedChildContent = (RelatedChildContent) relatedContent; addCount += doAddRelatedContentKeys( relatedChildContent.getRelatedChildren(), "1", rcKeysEl ); } rcKeysEl.setAttribute( "count", Integer.toString( addCount ) ); return rcKeysEl; } private int doAddRelatedContentKeys( Iterable<RelatedContent> related, String level, Element parentEl ) { int addCount = 0; HashSet<ContentEntity> contentAlreadyAdded = new HashSet<ContentEntity>(); for ( RelatedContent relatedChild : related ) { Element relatedContentKeyElement = doCreateRelatedContentKeyElement( relatedChild.getContent(), level, contentAlreadyAdded ); if ( relatedContentKeyElement != null ) { parentEl.addContent( relatedContentKeyElement ); addCount++; } } return addCount; } private Element doCreateRelatedContentKeyElement( final ContentEntity content, final String level, Set<ContentEntity> contentAlreadyAdded ) { if ( !contentAlreadyAdded.contains( content ) ) { contentAlreadyAdded.add( content ); final Element element = new Element( "relatedcontentkey" ); element.setAttribute( "key", content.getKey().toString() ); element.setAttribute( "versionkey", content.getMainVersion().getKey().toString() ); element.setAttribute( "level", level ); element.setAttribute( "contenttype", content.getContentType().getName() ); return element; } else { return null; } } }