/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.engine.metadata.impl;
import java.util.LinkedHashSet;
import java.util.Set;
import org.hibernate.search.bridge.spi.FieldMetadataBuilder;
import org.hibernate.search.bridge.spi.FieldMetadataCreationContext;
import org.hibernate.search.bridge.spi.FieldType;
import org.hibernate.search.util.logging.impl.Log;
import org.hibernate.search.util.logging.impl.LoggerFactory;
/**
* The internal implementation of {@link FieldMetadataBuilder}.
*
* @author Gunnar Morling
*/
class FieldMetadataBuilderImpl implements FieldMetadataBuilder {
private static final Log LOG = LoggerFactory.make();
private final Set<String> sortableFieldsAbsoluteNames = new LinkedHashSet<>();
private final Set<BridgeDefinedField> bridgeDefinedFields = new LinkedHashSet<>();
private final BackReference<DocumentFieldMetadata> fieldMetadata;
public FieldMetadataBuilderImpl(BackReference<DocumentFieldMetadata> fieldMetadata) {
this.fieldMetadata = fieldMetadata;
}
@Override
public FieldMetadataCreationContext field(String name, FieldType type) {
return new FieldMetadataCreationContextImpl( name, type );
}
public Set<String> getSortableFieldsAbsoluteNames() {
return sortableFieldsAbsoluteNames;
}
public Set<BridgeDefinedField> getBridgeDefinedFields() {
return bridgeDefinedFields;
}
private class FieldMetadataCreationContextImpl implements FieldMetadataCreationContext {
private final BridgeDefinedField field;
public FieldMetadataCreationContextImpl(String name, FieldType type) {
this.field = new BridgeDefinedField( fieldMetadata, name, type );
bridgeDefinedFields.add( field );
}
@Override
public FieldMetadataCreationContext field(String name, FieldType type) {
return FieldMetadataBuilderImpl.this.field( name, type );
}
@Override
public FieldMetadataCreationContext sortable(boolean sortable) {
sortableFieldsAbsoluteNames.add( field.getAbsoluteName() );
return this;
}
public <T extends FieldMetadataCreationContext> T mappedOn(Class<T> backend) {
return create( backend );
}
private <T extends FieldMetadataCreationContext> T create(Class<T> backend) {
try {
return backend.getDeclaredConstructor( BridgeDefinedField.class, FieldMetadataCreationContext.class ).newInstance( field, this );
}
catch (Exception e) {
throw LOG.cannotCreateBridgeDefinedField( backend, e );
}
}
}
}