package com.bigdata.rdf.internal;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import com.bigdata.rdf.internal.impl.extensions.DateTimeExtension;
import com.bigdata.rdf.internal.impl.extensions.DerivedNumericsExtension;
import com.bigdata.rdf.internal.impl.extensions.GeoSpatialLiteralExtension;
import com.bigdata.rdf.internal.impl.extensions.XSDStringExtension;
import com.bigdata.rdf.model.BigdataLiteral;
import com.bigdata.rdf.model.BigdataValue;
import com.bigdata.service.geospatial.GeoSpatialDatatypeConfiguration;
/**
* Default {@link IExtensionFactory}. The following extensions are supported:
* <dl>
* <dt>{@link DateTimeExtension}</dt>
* <dd>Inlining literals which represent <code>xsd:dateTime</code> values into
* the statement indices.</dd>
* <dt>{@link XSDStringExtension}</dt>
* <dd>Inlining <code>xsd:string</code> literals into the statement indices.</dd>
* <dt>{@link DerivedNumericsExtension}</dt>
* <dd>Inlining literals which represent derived numeric values into
* the statement indices.</dd>
* </dl>
*/
public class DefaultExtensionFactory implements IExtensionFactory {
private final List<IExtension<? extends BigdataValue>> extensions;
public DefaultExtensionFactory() {
extensions = new LinkedList<IExtension<? extends BigdataValue>>();
}
@Override
public void init(final IDatatypeURIResolver resolver,
final ILexiconConfiguration<BigdataValue> config) {
/*
* Always going to inline the derived numeric types.
*/
extensions.add(new DerivedNumericsExtension<BigdataLiteral>(resolver));
/*
* Set up the configuration of the geospatial module
*/
if (config.isGeoSpatial()) {
// register the extensions, adding one extension per datatype config
final List<GeoSpatialDatatypeConfiguration> datatypeConfigs =
config.getGeoSpatialConfig().getDatatypeConfigs();
for (int i=0; i<datatypeConfigs.size(); i++) {
extensions.add(
new GeoSpatialLiteralExtension<BigdataLiteral>(
resolver, datatypeConfigs.get(i)));
}
}
if (config.isInlineDateTimes()) {
extensions.add(new DateTimeExtension<BigdataLiteral>(
resolver, config.getInlineDateTimesTimeZone()));
}
if (config.getMaxInlineStringLength() > 0) {
/*
* Note: This extension is used for both literals and URIs. It MUST
* be enabled when MAX_INLINE_TEXT_LENGTH is GT ZERO (0). Otherwise
* we will not be able to inline either the local names or the full
* text of URIs.
*/
extensions.add(new XSDStringExtension<BigdataLiteral>(resolver, config
.getMaxInlineStringLength()));
}
_init(resolver, config, extensions);
}
/**
* Give subclasses a chance to add extensions.
*
* @param resolver
* {@link IDatatypeURIResolver} from
* {@link #init(IDatatypeURIResolver, ILexiconConfiguration)}.
* @param config
* The {@link ILexiconConfiguration} from
* {@link #init(IDatatypeURIResolver, ILexiconConfiguration)}.
*
* @param extensions
* The extensions that have already been registered.
*
* @see #init(IDatatypeURIResolver, ILexiconConfiguration)
*/
protected void _init(final IDatatypeURIResolver resolver,
final ILexiconConfiguration<BigdataValue> config,
final Collection<IExtension<? extends BigdataValue>> extensions) {
// noop
}
@Override
public Iterator<IExtension<? extends BigdataValue>> getExtensions() {
return Collections.unmodifiableList(extensions).iterator();
}
}