/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.search.builder;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.enonic.cms.core.content.access.ContentAccessEntity;
import com.enonic.cms.core.content.category.CategoryAccessEntity;
import com.enonic.cms.core.content.category.CategoryEntity;
import com.enonic.cms.core.content.category.CategoryKey;
import com.enonic.cms.core.content.index.BigText;
import com.enonic.cms.core.content.index.UserDefinedField;
import com.enonic.cms.core.search.query.ContentDocument;
import com.enonic.cms.core.search.query.SimpleText;
import com.enonic.cms.core.security.group.GroupKey;
import com.enonic.cms.core.structure.menuitem.MenuItemKey;
public class ContentIndexDataFactory
extends IndexFieldNameConstants
{
private final ContentIndexDataCustomDataFactory customDataFactory = new ContentIndexDataCustomDataFactory();
private final ContentIndexDataSectionFactory sectionFactory = new ContentIndexDataSectionFactory();
private final ContentIndexDataAccessRightsFactory accessRightsFactory = new ContentIndexDataAccessRightsFactory();
public ContentIndexData create( ContentDocument content, boolean updateMetadataOnly )
{
return doCreate( content, updateMetadataOnly );
}
public ContentIndexData create( ContentDocument content )
{
return doCreate( content, false );
}
private ContentIndexData doCreate( final ContentDocument content, boolean updateMetadataOnly )
{
ContentIndexData contentIndexData = new ContentIndexData( content.getContentKey() );
addMetaData( contentIndexData, content );
addCategory( contentIndexData, content );
addContentType( contentIndexData, content );
addSections( contentIndexData, content );
addOrderedSections( contentIndexData, content );
addAccessRights( contentIndexData, content );
addCustomData( contentIndexData, content );
if ( !updateMetadataOnly )
{
try
{
addExtractedBinaryData( contentIndexData, content );
}
catch ( Exception e )
{
throw new ContentIndexDataFactoryException( "Failed to build index-data for binaries", e );
}
}
return contentIndexData;
}
private void addMetaData( ContentIndexData contentIndexData, ContentDocument content )
{
contentIndexData.addContentIndexDataElement( CONTENT_KEY_FIELDNAME, content.getContentKey().toInt() );
contentIndexData.addContentIndexDataElement( TITLE_FIELDNAME, content.getTitle() );
contentIndexData.addContentIndexDataElement( NAME_FIELDNAME, content.getName() );
contentIndexData.addContentIndexDataElement( TIMESTAMP_FIELDNAME, content.getTimestamp() );
contentIndexData.addContentIndexDataElement( PUBLISH_FROM_FIELDNAME, content.getPublishFrom() );
contentIndexData.addContentIndexDataElement( PUBLISH_TO_FIELDNAME, content.getPublishTo() );
contentIndexData.addContentIndexDataElement( TIMESTAMP_FIELDNAME, content.getTimestamp() );
contentIndexData.addContentIndexDataElement( STATUS_FIELDNAME, content.getStatus() );
contentIndexData.addContentIndexDataElement( PRIORITY_FIELDNAME, content.getPriority() );
contentIndexData.addContentIndexDataElement( LANGUAGE_FIELDNAME, content.getLanguageCode() );
contentIndexData.addContentIndexDataElement( ASSIGNMENT_DUE_DATE_FIELDNAME, content.getAssignmentDueDate() );
contentIndexData.addContentIndexDataElement( CONTENT_CREATED, content.getCreated() );
contentIndexData.addContentIndexDataElement( CONTENT_MODIFIED, content.getModified() );
addUsers( contentIndexData, content );
}
private void addUsers( ContentIndexData contentIndexData, ContentDocument content )
{
addUserValues( contentIndexData, OWNER_FIELDNAME, content. getOwnerKey(), content.getOwnerName(), content.getOwnerQualifiedName() );
addUserValues( contentIndexData, MODIFIER_FIELDNAME, content.getModifierKey(), content.getModifierName(),
content.getModifierQualifiedName() );
addUserValues( contentIndexData, ASSIGNEE_FIELDNAME, content.getAssigneeKey(), content.getAssigneeName(),
content.getAssigneeQualifiedName() );
addUserValues( contentIndexData, ASSIGNER_FIELDNAME, content.getAssignerKey(), content.getAssignerName(),
content.getAssignerQualifiedName() );
}
private void addUserValues( ContentIndexData contentIndexData, String prefix, SimpleText key, SimpleText name,
SimpleText qualifiedName )
{
if ( key == null && name == null && qualifiedName == null )
{
return;
}
contentIndexData.addContentIndexDataElement( prefix + USER_KEY_POSTFIX, key != null ? key.getText() : null );
contentIndexData.addContentIndexDataElement( prefix + USER_NAME_POSTFIX, name != null ? name.getText() : null );
contentIndexData.addContentIndexDataElement( prefix + USER_QUALIFIED_NAME_POSTFIX,
qualifiedName != null ? qualifiedName.getText() : null );
}
private void addCategory( ContentIndexData contentIndexData, ContentDocument content )
{
final CategoryKey categoryKey = content.getCategoryKey();
if ( categoryKey == null )
{
return;
}
contentIndexData.addContentIndexDataElement( CATEGORY_KEY_FIELDNAME, categoryKey.toInt() );
final SimpleText categoryName = content.getCategoryName();
if ( categoryName == null || StringUtils.isNotBlank( categoryName.getText() ) )
{
return;
}
contentIndexData.addContentIndexDataElement( CATEGORY_NAME_FIELDNAME, categoryName.getText() );
}
private void addContentType( ContentIndexData contentIndexData, ContentDocument content )
{
contentIndexData.addContentIndexDataElement( CONTENTTYPE_KEY_FIELDNAME, content.getContentTypeKey().toInt() );
contentIndexData.addContentIndexDataElement( CONTENTTYPE_NAME_FIELDNAME, content.getContentTypeName().getText() );
}
private void addSections( final ContentIndexData contentIndexData, final ContentDocument content )
{
sectionFactory.create( contentIndexData, content.getContentLocations() );
}
private void addAccessRights( final ContentIndexData contentIndexData, ContentDocument contentDocument )
{
final CategoryEntity category = contentDocument.getCategory();
final Map<GroupKey, CategoryAccessEntity> categoryAccessRights =
category == null ? Collections.<GroupKey, CategoryAccessEntity>emptyMap() : category.getAccessRights();
final Collection<ContentAccessEntity> accessRights = contentDocument.getContentAccessRights();
if ( !( accessRights.isEmpty() && categoryAccessRights.isEmpty() ) )
{
accessRightsFactory.create( contentIndexData, accessRights, categoryAccessRights );
}
}
private void addCustomData( final ContentIndexData contentIndexData, final ContentDocument contentDocument )
{
Collection<UserDefinedField> userDefinedFields = contentDocument.getUserDefinedFields();
if ( !userDefinedFields.isEmpty() )
{
customDataFactory.create( contentIndexData, userDefinedFields );
}
}
private void addExtractedBinaryData( final ContentIndexData contentIndexData, final ContentDocument content )
{
BigText binaryData = content.getBinaryExtractedText();
if ( binaryData != null && !binaryData.getText().isEmpty() )
{
contentIndexData.addBinaryData( "key", content.getContentKey().toInt() );
contentIndexData.addBinaryData( ATTACHMENT_FIELDNAME, binaryData.getText() );
}
}
private void addOrderedSections( ContentIndexData contentIndexData, ContentDocument content )
{
final Map<MenuItemKey, Integer> orderedSections = content.getOrderedSections();
for ( MenuItemKey sectionKey : orderedSections.keySet() )
{
final int position = orderedSections.get( sectionKey );
contentIndexData.addContentIndexDataElement( CONTENT_SECTION_ORDER_PREFIX + sectionKey.toString(), position );
}
}
}