/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.search.builder;
import java.io.IOException;
import java.util.Collection;
import java.util.Set;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import com.google.common.collect.Sets;
import com.enonic.cms.core.content.ContentKey;
import com.enonic.cms.core.search.IndexException;
public class ContentIndexData
{
private final ContentKey key;
private final Set<ContentIndexDataElement> contentIndexDataElements = Sets.newHashSet();
private final Set<ContentIndexDataElement> binaryDataElements = Sets.newHashSet();
public String getContentDataAsJsonString()
throws Exception
{
return buildContentDataJson().string();
}
public String getBinaryDataAsJsonString()
throws Exception
{
return buildBinaryDataJson().string();
}
public XContentBuilder buildContentDataJson()
{
return buildJsonForDataElements( contentIndexDataElements );
}
public XContentBuilder buildBinaryDataJson()
{
return buildJsonForDataElements( binaryDataElements );
}
private XContentBuilder buildJsonForDataElements( Collection<ContentIndexDataElement> contentIndexDataElements )
{
try
{
final XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
for ( ContentIndexDataElement contentIndexDataElement : contentIndexDataElements )
{
final Set<ContentIndexDataFieldAndValue> contentIndexDataFieldAndValues =
ContentIndexDataFieldValueSetFactory.create( contentIndexDataElement );
for ( ContentIndexDataFieldAndValue fieldAndValue : contentIndexDataFieldAndValues )
{
builder.field( fieldAndValue.getFieldName(), fieldAndValue.getValue() );
}
}
builder.endObject();
return builder;
}
catch ( IOException e )
{
throw new IndexException( "Failed to build json: ", e );
}
}
public void addBinaryData( String dataElementName, Object value )
{
ContentIndexDataElement contentIndexDataElement = doCreateContentIndexDataElement( dataElementName, value, false );
if ( contentIndexDataElement == null )
{
return;
}
this.binaryDataElements.add( contentIndexDataElement );
}
public void addContentIndexDataElement( String dataElementName, Object value )
{
doAddContentIndexDataElement( dataElementName, value, true );
}
public void addContentIndexDataElement( String dataElementName, Object value, boolean includeOrderby )
{
doAddContentIndexDataElement( dataElementName, value, includeOrderby );
}
private void doAddContentIndexDataElement( final String dataElementName, final Object value, boolean includeOrderby )
{
ContentIndexDataElement contentIndexDataElement = doCreateContentIndexDataElement( dataElementName, value, includeOrderby );
if ( contentIndexDataElement == null )
{
return;
}
this.contentIndexDataElements.add( contentIndexDataElement );
}
private ContentIndexDataElement doCreateContentIndexDataElement( final String dataElementName, final Object value,
boolean includeOrderby )
{
if ( value == null )
{
return null;
}
ContentIndexDataElement contentIndexDataElement;
if ( value instanceof Set )
{
contentIndexDataElement = ContentIndexDataElementFactory.create( dataElementName, (Set) value, includeOrderby );
}
else
{
contentIndexDataElement = ContentIndexDataElementFactory.create( dataElementName, Sets.newHashSet( value ), includeOrderby );
}
return contentIndexDataElement;
}
public ContentIndexData( final ContentKey key )
{
this.key = key;
}
public ContentKey getKey()
{
return this.key;
}
public Set<ContentIndexDataElement> getContentIndexDataElements()
{
return contentIndexDataElements;
}
public Set<ContentIndexDataElement> getBinaryDataElements()
{
return binaryDataElements;
}
public boolean hasBinaryData()
{
return !binaryDataElements.isEmpty();
}
}