use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class AppSchemaMappingTest method testNestedJoinHandler.
@Test
public void testNestedJoinHandler() {
DefaultCell joinCell = buildJoinCell(null);
// create minimal alignment and pass it to JoinHandler
DefaultCell renameCell = new DefaultCell();
renameCell.setTransformationIdentifier(RenameFunction.ID);
renameCell.setSource(getUuidSourceProperty(unitDenormType));
renameCell.setTarget(getNestedUnitLocalIdTargetProperty());
DefaultAlignment alignment = new DefaultAlignment();
alignment.addCell(joinCell);
alignment.addCell(renameCell);
processJoinAlignment(alignment, null);
// logMapping(mappingWrapper.getMainMapping());
List<FeatureTypeMapping> ftMappings = mappingWrapper.getMainMapping().getTypeMappings().getFeatureTypeMapping();
assertEquals(2, ftMappings.size());
FeatureTypeMapping lcdMapping = null, lcuMapping = null;
for (FeatureTypeMapping ftMapping : ftMappings) {
if (SOURCE_DATASET.equals(ftMapping.getSourceType()) && "lcv:LandCoverDataset".equals(ftMapping.getTargetElement())) {
lcdMapping = ftMapping;
}
if (SOURCE_UNIT_DENORM.equals(ftMapping.getSourceType()) && "lcv:LandCoverUnit".equals(ftMapping.getTargetElement())) {
lcuMapping = ftMapping;
}
}
assertNotNull(lcdMapping);
assertNotNull(lcuMapping);
// check feature chaining configuration
List<AttributeMappingType> lcdAttrMappings = lcdMapping.getAttributeMappings().getAttributeMapping();
List<AttributeMappingType> lcuAttrMappings = lcuMapping.getAttributeMappings().getAttributeMapping();
assertNotNull(lcdAttrMappings);
assertNotNull(lcuAttrMappings);
assertEquals(1, lcdAttrMappings.size());
assertEquals(2, lcuAttrMappings.size());
AttributeMappingType containerMapping = lcdAttrMappings.get(0);
assertEquals("lcv:member", containerMapping.getTargetAttribute());
assertEquals("lcv:LandCoverUnit", containerMapping.getSourceExpression().getLinkElement());
assertEquals("FEATURE_LINK[1]", containerMapping.getSourceExpression().getLinkField());
assertEquals(SOURCE_DATASET_ID, containerMapping.getSourceExpression().getOCQL());
assertTrue(containerMapping.isIsMultiple());
AttributeMappingType nestedMapping = lcuAttrMappings.get(0);
assertEquals("FEATURE_LINK[1]", nestedMapping.getTargetAttribute());
assertEquals(SOURCE_DATASET_ID, nestedMapping.getSourceExpression().getOCQL());
assertNull(nestedMapping.getSourceExpression().getLinkElement());
assertNull(nestedMapping.getSourceExpression().getLinkField());
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class DefaultAlignmentIOTest method testIDSaveLoad.
/**
* Tests id generation, save and load.
*
* @throws Exception if an error occurs
*/
@Test
public void testIDSaveLoad() throws Exception {
DefaultAlignment alignment = new DefaultAlignment();
Schema schema = TestUtil.loadSchema(getClass().getResource("/testdata/simple/t1.xsd").toURI());
DefaultCell cell = new DefaultCell();
cell.setTransformationIdentifier("trans1");
ListMultimap<String, Type> source = ArrayListMultimap.create();
source.put(null, new DefaultType(new TypeEntityDefinition(schema.getMappingRelevantTypes().iterator().next(), SchemaSpaceID.SOURCE, null)));
cell.setSource(source);
ListMultimap<String, Type> target = ArrayListMultimap.create();
target.put(null, new DefaultType(new TypeEntityDefinition(schema.getMappingRelevantTypes().iterator().next(), SchemaSpaceID.TARGET, null)));
cell.setTarget(target);
// add cell and check id generation
assertNull(cell.getId());
alignment.addCell(cell);
assertNotNull(cell.getId());
assertNotNull(alignment.getCell(cell.getId()));
// save / load
File alignmentFile = tmp.newFile("alignment.xml");
System.out.println(alignmentFile.getAbsolutePath());
saveAlignment(alignment, new BufferedOutputStream(new FileOutputStream(alignmentFile)));
MutableAlignment alignment2 = loadAlignment(new FileInputStream(alignmentFile), schema, schema);
// check cell id
assertEquals(cell.getId(), alignment2.getCells().iterator().next().getId());
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class DefaultAlignmentIOTest method testBaseAlignmentSaveLoad.
/**
* Tests base alignment add, save and load.
*
* @throws Exception if an error occurs
*/
@Test
public void testBaseAlignmentSaveLoad() throws Exception {
DefaultAlignment baseAlignment = new DefaultAlignment();
MutableAlignment alignment = new DefaultAlignment();
Schema schema = TestUtil.loadSchema(getClass().getResource("/testdata/simple/t1.xsd").toURI());
Iterator<? extends TypeDefinition> iter = schema.getMappingRelevantTypes().iterator();
TypeDefinition t = iter.next();
if (!t.getName().getLocalPart().equals("T1")) {
t = iter.next();
}
DefaultCell cell1 = new DefaultCell();
cell1.setTransformationIdentifier("trans1");
ListMultimap<String, Type> source = ArrayListMultimap.create();
source.put(null, new DefaultType(new TypeEntityDefinition(t, SchemaSpaceID.SOURCE, null)));
cell1.setSource(source);
ListMultimap<String, Type> target = ArrayListMultimap.create();
target.put(null, new DefaultType(new TypeEntityDefinition(t, SchemaSpaceID.TARGET, null)));
cell1.setTarget(target);
DefaultCell cell2 = new DefaultCell();
cell2.setTransformationIdentifier("trans2");
List<ChildContext> childContext = new ArrayList<ChildContext>();
PropertyDefinition child = DefinitionUtil.getChild(t, new QName("a1")).asProperty();
childContext.add(new ChildContext(child));
ListMultimap<String, Property> source2 = ArrayListMultimap.create();
source2.put(null, new DefaultProperty(new PropertyEntityDefinition(t, childContext, SchemaSpaceID.SOURCE, null)));
cell2.setSource(source2);
ListMultimap<String, Property> target2 = ArrayListMultimap.create();
target2.put(null, new DefaultProperty(new PropertyEntityDefinition(t, childContext, SchemaSpaceID.TARGET, null)));
cell2.setTarget(target2);
// add cell1 to base alignment
baseAlignment.addCell(cell1);
// save base alignment
File baseAlignmentFile = tmp.newFile("alignment_base.xml");
System.out.println(baseAlignmentFile.getAbsolutePath());
saveAlignment(baseAlignment, new BufferedOutputStream(new FileOutputStream(baseAlignmentFile)));
// add as base alignment to extended alignment
addBaseAlignment(alignment, baseAlignmentFile.toURI(), schema, schema);
assertEquals(1, alignment.getBaseAlignments().size());
String usedPrefix = alignment.getBaseAlignments().keySet().iterator().next();
assertEquals(1, alignment.getCells().size());
assertEquals(usedPrefix + ":" + cell1.getId(), alignment.getCells().iterator().next().getId());
// add cell2 to extended alignment
alignment.addCell(cell2);
assertEquals(2, alignment.getCells().size());
assertEquals(1, alignment.getPropertyCells(cell1).size());
// save extended alignment
File alignmentFile = tmp.newFile("alignment_extended.xml");
System.out.println(alignmentFile.getAbsolutePath());
saveAlignment(alignment, new BufferedOutputStream(new FileOutputStream(alignmentFile)));
// load extended
MutableAlignment alignment2 = loadAlignment(new FileInputStream(alignmentFile), schema, schema);
assertEquals(2, alignment2.getCells().size());
assertEquals(1, alignment2.getTypeCells().size());
Cell typeCell = alignment2.getTypeCells().iterator().next();
assertTrue(typeCell instanceof BaseAlignmentCell);
assertEquals(usedPrefix + ":" + cell1.getId(), typeCell.getId());
assertEquals(1, alignment2.getPropertyCells(typeCell).size());
assertFalse(alignment2.getPropertyCells(typeCell).iterator().next() instanceof BaseAlignmentCell);
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class CityGMLPropagate method generateMapping.
private void generateMapping() {
System.out.println("Indexing example cells...");
// index all cells based on the target property name
SetMultimap<String, Cell> bgisExamples = HashMultimap.create();
SetMultimap<QName, Cell> cityGMLExamples = HashMultimap.create();
for (Cell cell : examples.getCells()) {
if (cell.getTarget().size() == 1) {
// only supports cells with one target
EntityDefinition entityDef = CellUtil.getFirstEntity(cell.getTarget()).getDefinition();
// XXX check source?!
if (entityDef.getDefinition() instanceof PropertyDefinition) {
QName name = entityDef.getDefinition().getName();
if (ADE_NS.equals(name.getNamespaceURI())) {
bgisExamples.put(name.getLocalPart(), cell);
} else if (name.getNamespaceURI().startsWith(CITYGML_NAMESPACE_CORE)) {
// XXX only support level 1 properties?
cityGMLExamples.put(name, cell);
} else
System.out.println("WARNING: ignoring cell with target property neither from CityGML nor from BGIS ADE");
} else
System.out.println("WARNING: ignoring type cell");
} else
System.out.println("WARNING: ignoring cell with multiple or no targets");
}
// collect all ADE feature types
List<TypeDefinition> featureTypes = BGISAppUtil.getADEFeatureTypes(targetSchema);
// collect ADE display names
Set<String> adeTypeNames = new HashSet<String>();
for (TypeDefinition type : featureTypes) {
adeTypeNames.add(type.getDisplayName());
}
// collect possibly relevant target CityGML feature types
for (TypeDefinition type : targetSchema.getTypes()) {
if (type.getName().getNamespaceURI().startsWith(CITYGML_NAMESPACE_CORE) && BGISAppUtil.isFeatureType(type)) {
if (!adeTypeNames.contains(type.getDisplayName())) {
/*
* But ensure to only add those that do not share the
* display name with an ADE type, as in the feature map the
* type identification is only done on based on the display
* name, and ADE types take precedent.
*/
featureTypes.add(type);
}
}
}
// visit ADE properties and create cells
System.out.println("Generating mapping from example cells for");
String cellNote = MessageFormat.format("Generated through propagation of example cells on CityGML and BGIS ADE feature types.\n" + "{0,date,medium}", new Date());
CityGMLPropagateVisitor visitor = new CityGMLPropagateVisitor(cityGMLSource, bgisExamples, cityGMLExamples, config, cellNote);
for (TypeDefinition type : featureTypes) {
System.out.println(type.getDisplayName() + "...");
visitor.accept(new TypeEntityDefinition(type, SchemaSpaceID.TARGET, null));
}
if (visitor.getCells().isEmpty()) {
System.out.println("WARNING: no cells were created");
} else {
System.out.println(visitor.getCells().size() + " cells were created.");
}
// create alignment
MutableAlignment align = new DefaultAlignment();
for (MutableCell cell : visitor.getCells()) {
align.addCell(cell);
}
this.alignment = align;
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class AbstractBaseAlignmentLoader method createAlignment.
/**
* Creates an alignment from the given alignment representation.
*
* @param start the main alignment representation
* @param sourceTypes the source types to use for resolving definition
* references
* @param targetTypes the target types to use for resolving definition
* references
* @param updater the path updater to use for base alignments
* @param reporter the I/O reporter to report any errors to, may be
* <code>null</code>
* @return the alignment for the given alignment representation
* @throws IOException if a base alignment couldn't be loaded
*/
protected final MutableAlignment createAlignment(A start, TypeIndex sourceTypes, TypeIndex targetTypes, PathUpdate updater, IOReporter reporter) throws IOException {
Map<A, Map<String, String>> prefixMapping = new HashMap<A, Map<String, String>>();
Map<A, AlignmentInfo> alignmentToInfo = new HashMap<A, AlignmentInfo>();
// fill needed maps
generatePrefixMapping(start, prefixMapping, alignmentToInfo, updater, reporter);
// create alignment
DefaultAlignment alignment = new DefaultAlignment();
// add cells of base alignments
processBaseAlignments(alignment, sourceTypes, targetTypes, prefixMapping, alignmentToInfo, reporter);
loadCustomFunctions(start, alignment, sourceTypes, targetTypes);
// collect cells for main alignment
List<MutableCell> cells = new ArrayList<>();
for (C mainCell : getCells(start)) {
MutableCell cell = createCell(mainCell, sourceTypes, targetTypes, reporter);
if (cell != null) {
cells.add(cell);
}
}
// Migrate all UnmigratedCells and add them to the alignment
List<MutableCell> migratedCells = migrateCells(cells, reporter);
migratedCells.forEach(cell -> alignment.addCell(cell));
// add modifiers of main alignment
applyModifiers(alignment, getModifiers(start), prefixMapping.get(start), null, false, reporter);
return alignment;
}
Aggregations