package org.reldb.rel.v0.storage.relvars.external;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.reldb.rel.v0.generator.Generator;
import org.reldb.rel.v0.storage.relvars.external.accdb.InfoACCDB;
import org.reldb.rel.v0.storage.relvars.external.csv.InfoCSV;
import org.reldb.rel.v0.storage.relvars.external.jdbc.InfoJDBC;
import org.reldb.rel.v0.storage.relvars.external.relvar.InfoRELVAR;
import org.reldb.rel.v0.storage.relvars.external.xls.InfoXLS;
import org.reldb.rel.v0.types.Heading;
import org.reldb.rel.v0.types.TypeRelation;
import org.reldb.rel.v0.types.builtin.TypeBoolean;
import org.reldb.rel.v0.types.builtin.TypeCharacter;
import org.reldb.rel.v0.types.builtin.TypeInteger;
import org.reldb.rel.v0.values.TupleIterator;
import org.reldb.rel.v0.values.Value;
import org.reldb.rel.v0.values.ValueBoolean;
import org.reldb.rel.v0.values.ValueCharacter;
import org.reldb.rel.v0.values.ValueInteger;
import org.reldb.rel.v0.values.ValueRelationLiteral;
import org.reldb.rel.v0.values.ValueTuple;
public class Registry {
private static List<Info> registry;
static {
add(new InfoACCDB());
add(new InfoCSV());
add(new InfoJDBC());
add(new InfoXLS());
add(new InfoRELVAR());
}
private static void ensureRegistryExists() {
if (registry == null)
registry = new LinkedList<Info>();
}
private static void add(Info relvarCustomInfo) {
ensureRegistryExists();
registry.add(relvarCustomInfo);
}
/** Obtain heading for registry relvar.
*
* REL {
* Identifier CHAR,
* Description CHAR,
* Documentation CHAR,
* Components REL {
* ComponentNumber INTEGER,
* isOptional BOOLEAN,
* isAFile BOOLEAN,
* FileExtensions REL {
* Extension CHAR
* },
* Documentation CHAR,
* ComponentOptions REL {
* Documentation CHAR,
* OptionText CHAR
* },
* GuaranteedUnique BOOLEAN
* }
*/
public static Heading getHeading() {
Heading heading = new Heading();
heading.add("Identifier", TypeCharacter.getInstance());
heading.add("Description", TypeCharacter.getInstance());
heading.add("Documentation", TypeCharacter.getInstance());
Heading components = new Heading();
components.add("ComponentNumber", TypeInteger.getInstance());
components.add("isOptional", TypeBoolean.getInstance());
components.add("isAFile", TypeBoolean.getInstance());
Heading fileExtensions = new Heading();
fileExtensions.add("Extension", TypeCharacter.getInstance());
components.add("FileExtensions", new TypeRelation(fileExtensions));
components.add("Documentation", TypeCharacter.getInstance());
Heading componentOptions = new Heading();
componentOptions.add("Documentation", TypeCharacter.getInstance());
componentOptions.add("OptionText", TypeCharacter.getInstance());
components.add("ComponentOptions", new TypeRelation(componentOptions));
heading.add("Components", new TypeRelation(components));
heading.add("GuaranteedUnique", TypeBoolean.getInstance());
return heading;
}
/** Obtain registry details as a TupleIterator for the above.
*/
public static TupleIterator getRegistry(Generator generator) {
ensureRegistryExists();
return new TupleIterator() {
Iterator<Info> iterator = registry.iterator();
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public ValueTuple next() {
Value rawTuple[];
Info info = iterator.next();
ValueCharacter identifier = ValueCharacter.select(generator, info.getIdentifier());
ValueCharacter description = ValueCharacter.select(generator, info.getDescription());
ValueCharacter documentation = ValueCharacter.select(generator, info.getConnectionStringDocumentation());
ValueBoolean guaranteedUnique = ValueBoolean.select(generator, info.isGuaranteedUnique());
ValueRelationLiteral components = new ValueRelationLiteral(generator);
if (info.getConnectionStringComponents() != null)
for (InfoComponent component: info.getConnectionStringComponents()) {
ValueInteger componentNumber = ValueInteger.select(generator, component.getComponentNumber());
ValueBoolean isOptional = ValueBoolean.select(generator, component.isOptional());
ValueBoolean isAFile = ValueBoolean.select(generator, component.isAFile());
ValueRelationLiteral extensions = new ValueRelationLiteral(generator);
if (component.getAppropriateFileExtension() != null)
for (String extension: component.getAppropriateFileExtension()) {
ValueCharacter extensionChar = ValueCharacter.select(generator, extension);
extensions.insert(new ValueTuple(generator, new Value[] {extensionChar}));
}
ValueCharacter componentDocumentation = ValueCharacter.select(generator, component.getDocumentation());
ValueRelationLiteral componentOptions = new ValueRelationLiteral(generator);
if (component.getOptions() != null)
for (InfoComponentOption option: component.getOptions()) {
ValueCharacter optionDocumentation = ValueCharacter.select(generator, option.getDocumentation());
ValueCharacter optionText = ValueCharacter.select(generator, option.getOptionText());
componentOptions.insert(new ValueTuple(generator, new Value[] {optionDocumentation, optionText}));
}
components.insert(new ValueTuple(generator, new Value[] {
componentNumber,
isOptional,
isAFile,
extensions,
componentDocumentation,
componentOptions
}
));
}
rawTuple = new Value[] {
identifier,
description,
documentation,
components,
guaranteedUnique
};
return new ValueTuple(generator, rawTuple);
}
@Override
public void close() {}
};
}
public static long getCardinality() {
return registry.size();
}
}