use of eu.esdihumboldt.hale.common.align.model.impl.DefaultProperty in project hale by halestudio.
the class DuplicateVisitor method visit.
@Override
protected boolean visit(PropertyEntityDefinition ped) {
if (ADE_NS.equals(ped.getDefinition().getName().getNamespaceURI())) {
for (Cell exampleCell : exampleCells.get(ped.getDefinition().getName().getLocalPart())) {
// handle each example cell
// copy cell
DefaultCell cell = new DefaultCell(exampleCell);
// reset ID
cell.setId(null);
// assign new target
ListMultimap<String, Entity> target = ArrayListMultimap.create();
target.put(cell.getTarget().keys().iterator().next(), new DefaultProperty(ped));
cell.setTarget(target);
BGISAppUtil.appendNote(cell, cellNote);
cells.add(cell);
}
return true;
}
return false;
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultProperty in project hale by halestudio.
the class CityGMLPropagateVisitor method propagateCell.
/**
* Propagate a given cell to the given target property and possible source
* types.
*
* @param exampleCell the example cell
* @param ped the target property
*/
private void propagateCell(Cell exampleCell, PropertyEntityDefinition ped) {
/*
* Find the type where the property actually is defined, as if possible
* a super type mapping should be used.
*/
TypeDefinition targetType = findTypeDefining(ped);
if (!targetType.equals(ped.getType())) {
ped = new PropertyEntityDefinition(targetType, ped.getPropertyPath(), ped.getSchemaSpace(), ped.getFilter());
}
// check if the cell was already handled for the type
if (handledTargets.get(exampleCell).contains(targetType)) {
// don't produce any duplicates
return;
}
handledTargets.put(exampleCell, targetType);
TypeEntityIndex<List<ChildContext>> index = new TypeEntityIndex<List<ChildContext>>();
Collection<TypeDefinition> sourceTypes = findSourceTypes(exampleCell, targetType, index);
if (sourceTypes != null) {
for (TypeDefinition sourceType : sourceTypes) {
// copy cell
DefaultCell cell = new DefaultCell(exampleCell);
// reset ID
cell.setId(null);
// assign new target
ListMultimap<String, Entity> target = ArrayListMultimap.create();
target.put(cell.getTarget().keys().iterator().next(), new DefaultProperty(ped));
cell.setTarget(target);
// assign new source(s)
ListMultimap<String, Entity> source = ArrayListMultimap.create();
for (Entry<String, ? extends Entity> entry : cell.getSource().entries()) {
// create new source entity
List<ChildContext> path = index.get(sourceType, entry.getValue());
if (path == null) {
throw new IllegalStateException("No replacement property path computed");
}
Property newSource = new DefaultProperty(new PropertyEntityDefinition(sourceType, path, SchemaSpaceID.SOURCE, null));
source.put(entry.getKey(), newSource);
}
cell.setSource(source);
BGISAppUtil.appendNote(cell, cellNote);
cells.add(cell);
}
}
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultProperty in project hale by halestudio.
the class AlignmentUtil method reparentCell.
/**
* Returns a cell like the given property cell with all source and target
* types matching those off the given type cell.<br>
* If the types already match they are unchanged. If the types are sub types
* of the types of the type cell they are changed. If no change is necessary
* the cell itself is returned.
*
* @param propertyCell the property cell to update
* @param typeCell the type cell with the target types
* @param strict If false and the target type cell has no sources or target,
* the property cell is updated to have the sources/target in
* their declaring type. If true, said properties are left
* unchanged. Does not matter for complete type cells, since they
* have sources and a target.
* @return the updated cell or <code>null</code> if an update isn't possible
*/
public static Cell reparentCell(Cell propertyCell, Cell typeCell, boolean strict) {
ListMultimap<String, Entity> sources = ArrayListMultimap.create();
ListMultimap<String, Entity> targets = ArrayListMultimap.create();
boolean updateNecessary = false;
// XXX are updates to the property path needed?
// Currently not, since ChildDefinitions are compared by their names
// only.
// TARGETS
Entity targetEntity = CellUtil.getFirstEntity(typeCell.getTarget());
if (targetEntity != null) {
TypeDefinition typeCellTargetType = ((Type) targetEntity).getDefinition().getDefinition();
for (Entry<String, ? extends Entity> target : propertyCell.getTarget().entries()) {
TypeDefinition propertyCellTargetType = target.getValue().getDefinition().getType();
if (propertyCellTargetType.equals(typeCellTargetType))
targets.put(target.getKey(), target.getValue());
else if (DefinitionUtil.isSuperType(typeCellTargetType, propertyCellTargetType)) {
PropertyEntityDefinition oldDef = (PropertyEntityDefinition) target.getValue().getDefinition();
targets.put(target.getKey(), new DefaultProperty(new PropertyEntityDefinition(typeCellTargetType, oldDef.getPropertyPath(), SchemaSpaceID.TARGET, null)));
updateNecessary = true;
} else {
// a cell with targets in more than one type
return null;
}
}
} else if (!strict)
updateNecessary |= reparentToDeclaring(propertyCell.getTarget(), targets);
else
targets.putAll(propertyCell.getTarget());
if (propertyCell.getSource() != null && !propertyCell.getSource().isEmpty()) {
if (typeCell.getSource() != null && !typeCell.getSource().isEmpty()) {
// collect source entity definitions
Collection<TypeEntityDefinition> typeCellSourceTypes = new ArrayList<TypeEntityDefinition>();
for (Entity entity : typeCell.getSource().values()) typeCellSourceTypes.add((TypeEntityDefinition) entity.getDefinition());
for (Entry<String, ? extends Entity> source : propertyCell.getSource().entries()) {
TypeEntityDefinition propertyCellSourceType = getTypeEntity(source.getValue().getDefinition());
if (typeCellSourceTypes.contains(propertyCellSourceType))
sources.put(source.getKey(), source.getValue());
else {
boolean matchFound = false;
// maybe the whole cell should be duplicated?
for (TypeEntityDefinition typeCellSourceType : typeCellSourceTypes) {
if (DefinitionUtil.isSuperType(typeCellSourceType.getDefinition(), propertyCellSourceType.getDefinition()) && (propertyCellSourceType.getFilter() == null || propertyCellSourceType.getFilter().equals(typeCellSourceType.getFilter()))) {
if (matchFound)
log.warn("Inherited property cell source matches multiple sources of type cell.");
matchFound = true;
PropertyEntityDefinition oldDef = (PropertyEntityDefinition) source.getValue().getDefinition();
sources.put(source.getKey(), new DefaultProperty(new PropertyEntityDefinition(typeCellSourceType.getDefinition(), oldDef.getPropertyPath(), SchemaSpaceID.SOURCE, typeCellSourceType.getFilter())));
updateNecessary = true;
// XXX break; if only one match should be added
}
}
if (!matchFound) {
// cell
return null;
}
}
}
} else if (!strict)
updateNecessary |= reparentToDeclaring(propertyCell.getSource(), sources);
else
targets.putAll(propertyCell.getTarget());
}
if (updateNecessary) {
MutableCell copy = new DefaultCell(propertyCell);
copy.setSource(sources);
copy.setTarget(targets);
propertyCell = copy;
}
return propertyCell;
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultProperty in project hale by halestudio.
the class AlignmentUtil method reparentToDeclaring.
/**
* Copies the properties from original to modified, modifying properties to
* their declaring type, if the type has no filter set.
*
* @param original the original Multimap of properties
* @param modified the target Multimap
* @return true, if a property was changed, false otherwise
*/
private static boolean reparentToDeclaring(ListMultimap<String, ? extends Entity> original, ListMultimap<String, Entity> modified) {
boolean changed = false;
for (Entry<String, ? extends Entity> oEntity : original.entries()) {
PropertyEntityDefinition property = (PropertyEntityDefinition) oEntity.getValue().getDefinition();
ChildDefinition<?> childDef = property.getPropertyPath().get(0).getChild();
if (Objects.equals(childDef.getDeclaringGroup(), childDef.getParentType()) || property.getFilter() != null)
modified.put(oEntity.getKey(), oEntity.getValue());
else if (childDef.getDeclaringGroup() instanceof TypeDefinition) {
modified.put(oEntity.getKey(), new DefaultProperty(new PropertyEntityDefinition((TypeDefinition) childDef.getDeclaringGroup(), property.getPropertyPath(), property.getSchemaSpace(), null)));
changed = true;
} else {
// declaring group of first level property no type
// definition?
// simply add it without change, shouldn't happen
modified.put(oEntity.getKey(), oEntity.getValue());
}
}
return changed;
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultProperty 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);
}
Aggregations