/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.content; import java.util.Collection; import java.util.Date; import java.util.Set; import org.jdom.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.enonic.cms.core.content.access.ContentAccessEntity; import com.enonic.cms.core.content.category.CategoryEntity; import com.enonic.cms.core.content.contenttype.ContentTypeEntity; import com.enonic.cms.core.content.contenttype.ContentTypeKey; import com.enonic.cms.core.content.index.BigText; import com.enonic.cms.core.content.index.config.IndexDefinition; import com.enonic.cms.core.content.index.config.IndexDefinitionBuilder; import com.enonic.cms.core.search.query.ContentDocument; import com.enonic.cms.core.search.query.SimpleText; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.structure.menuitem.MenuItemEntity; import com.enonic.cms.core.structure.menuitem.MenuItemKey; import com.enonic.cms.core.structure.menuitem.section.SectionContentEntity; @Component public class ContentDocumentFactory { @Autowired IndexDefinitionBuilder indexDefBuilder; @Autowired BinaryDataExtractor binaryDataExtractor; public ContentDocument createContentDocument( final ContentEntity content, final boolean updateMetadataOnly ) { ContentDocument indexedDoc = insertStandardValues( content ); insertUserDefinedIndexValues( content, indexedDoc ); insertOrderedSections( content, indexedDoc ); if ( !updateMetadataOnly ) { insertBinaryExtractedValues( content, indexedDoc ); } return indexedDoc; } private void insertBinaryExtractedValues( final ContentEntity content, final ContentDocument indexedDoc ) { final BigText bigText = binaryDataExtractor.extractBinaryData( content ); if ( bigText != null ) { indexedDoc.setBinaryExtractedText( bigText ); } } private void insertOrderedSections( ContentEntity content, ContentDocument indexedDoc ) { final Set<SectionContentEntity> sectionContents = content.getSectionContents(); for ( SectionContentEntity sectionContent : sectionContents ) { final MenuItemEntity menu = sectionContent.getMenuItem(); if ( menu.isOrderedSection() ) { final MenuItemKey sectionKey = menu.getKey(); final int orderPosition = sectionContent.getOrder(); indexedDoc.addOrderedSection( sectionKey, orderPosition ); } } } private void insertUserDefinedIndexValues( ContentEntity content, ContentDocument indexedDoc ) { Document doc = content.getMainVersion().getContentDataAsJDomDocument(); for ( IndexDefinition def : this.indexDefBuilder.buildList( content.getContentType() ) ) { for ( final String stringValue : def.evaluate( doc ) ) { indexedDoc.addUserDefinedField( def.getName(), new SimpleText( stringValue ) ); } } } private ContentDocument insertStandardValues( ContentEntity content ) { final ContentKey contentKey = content.getKey(); final ContentTypeEntity contentType = content.getContentType(); final CategoryEntity category = content.getCategory(); final ContentVersionEntity contentVersion = content.getMainVersion(); final UserEntity owner = content.getOwner(); final UserEntity modifier = contentVersion.getModifiedBy(); Date createdDate = content.getCreatedAt(); Date publishFromDate = content.getAvailableFrom(); Date publishToDate = content.getAvailableTo(); String title = contentVersion.getTitle(); ContentDocument indexedDoc = new ContentDocument( contentKey ); indexedDoc.setName(content.getName()); indexedDoc.setCategoryKey( category.getKey() ); indexedDoc.setContentTypeKey( new ContentTypeKey( contentType.getKey() ) ); indexedDoc.setContentTypeName( contentType.getName() ); if ( createdDate != null ) { indexedDoc.setCreated( createdDate ); } indexedDoc.setModifierKey( modifier.getKey().toString() ); indexedDoc.setModifierName( modifier.getName() ); indexedDoc.setModifierQualifiedName( modifier.getQualifiedName().toString() ); indexedDoc.setOwnerKey( owner.getKey().toString() ); indexedDoc.setOwnerName( owner.getName() ); indexedDoc.setOwnerQualifiedName( owner.getQualifiedName().toString() ); if ( content.getAssignee() != null ) { indexedDoc.setAssigneeKey( content.getAssignee().getKey().toString() ); indexedDoc.setAssigneeName( content.getAssignee().getName() ); indexedDoc.setAssigneeQualifiedName( content.getAssignee().getQualifiedName().toString() ); } if ( content.getAssigner() != null ) { indexedDoc.setAssignerKey( content.getAssigner().getKey().toString() ); indexedDoc.setAssignerName( content.getAssigner().getName() ); indexedDoc.setAssignerQualifiedName( content.getAssigner().getQualifiedName().toString() ); } if ( content.getAssignmentDueDate() != null ) { indexedDoc.setAssignmentDueDate( content.getAssignmentDueDate() ); } if ( publishFromDate != null ) { indexedDoc.setPublishFrom( publishFromDate ); } if ( publishToDate != null ) { indexedDoc.setPublishTo( publishToDate ); } indexedDoc.setTimestamp( content.getTimestamp() ); indexedDoc.setModified( contentVersion.getModifiedAt() ); indexedDoc.setTitle( title ); indexedDoc.setStatus( contentVersion.getStatus().getKey() ); indexedDoc.setPriority( content.getPriority() ); indexedDoc.setLanguageCode( content.getLanguage().getCode() ); ContentLocationSpecification contentLocationSpecification = new ContentLocationSpecification(); contentLocationSpecification.setIncludeInactiveLocationsInSection( true ); final ContentLocations contentLocations = content.getLocations( contentLocationSpecification ); indexedDoc.setContentLocations( contentLocations ); final Collection<ContentAccessEntity> contentAccessRights = content.getContentAccessRights(); indexedDoc.addContentAccessRights( contentAccessRights ); indexedDoc.setCategory( content.getCategory() ); return indexedDoc; } }