use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class EffectiveMapping method expand.
/**
* Convert an alignment into an expanded version where all effective
* mappings are defined explicitly, i.e. mappings effective due to
* inheritance are converted to use the respective sub-types. Also, base
* alignment cells are converted into normal cells.
*
* @param alignment the alignment to convert
* @return the expanded copy of the alignment
*/
public static MutableAlignment expand(Alignment alignment) {
MutableAlignment result = new DefaultAlignment(alignment);
// remove base alignment cells keeping custom functions
MigrationUtil.removeBaseCells(result);
// remove other cells
result.clearCells();
// transfer cells based on effective mapping
// set of all cells used as they are in the resulting alignment
Set<Cell> usedAsIs = new HashSet<>();
for (Cell typeCell : alignment.getTypeCells()) {
// transfer type cell unchanged
MutableCell typeCellNew = new DefaultCell(typeCell);
MigrationUtil.removeIdPrefix(typeCellNew, true, true);
result.addCell(typeCellNew);
usedAsIs.add(typeCell);
Collection<? extends Cell> propertyCells = alignment.getPropertyCells(typeCell, true, false);
for (Cell propertyCell : propertyCells) {
// FIXME what does this do in case of a join where there are
// potentially multiple cells to be handled?
Cell reparented = AlignmentUtil.reparentCell(propertyCell, typeCell, true);
if (reparented == propertyCell) {
// use as is
if (!usedAsIs.contains(propertyCell)) {
// only add if not done yet
// transfer unchanged
MutableCell newCell = new DefaultCell(propertyCell);
MigrationUtil.removeIdPrefix(newCell, true, true);
result.addCell(newCell);
usedAsIs.add(propertyCell);
}
} else {
// inherited cell
// add the reparented cell
// TODO check if similar cell has been added already?
MutableCell rCell = (MutableCell) reparented;
MigrationUtil.removeIdPrefix(rCell, true, true);
// avoid ID collision
// no updates needed in other places because it's a property
// cell
rCell.setId(rCell.getId() + '_' + typeCellNew.getId());
result.addCell(rCell);
}
}
}
return result;
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class DefaultAlignmentIOTest method testSaveLoad.
/**
* Test saving and loading an example alignment
*
* @throws Exception if an error occurs
*/
@Test
public void testSaveLoad() throws Exception {
// populate alignment
MutableAlignment align = new DefaultAlignment();
DefaultSchema source = new DefaultSchema("", null);
DefaultSchema target = new DefaultSchema("", null);
// cell 1
MutableCell cell1 = new DefaultCell();
String id1;
cell1.setTransformationIdentifier(id1 = "trans1");
ListMultimap<String, ParameterValue> parameters1 = LinkedListMultimap.create();
parameters1.put("test", new ParameterValue("1"));
parameters1.put("test", new ParameterValue("2"));
parameters1.put("t", new ParameterValue("3"));
cell1.setTransformationParameters(parameters1);
if (supportsTransformationModes()) {
cell1.setTransformationMode(TransformationMode.passive);
}
ListMultimap<String, Type> source1 = ArrayListMultimap.create();
QName source1TypeName;
String source1EntityName;
TypeDefinition sourceType1 = new DefaultTypeDefinition(source1TypeName = new QName("source1Type"));
String filterText = "someproperty > 12";
Filter filter = new FilterGeoCqlImpl(filterText);
source1.put(source1EntityName = null, new DefaultType(new TypeEntityDefinition(sourceType1, SchemaSpaceID.SOURCE, filter)));
cell1.setSource(source1);
source.addType(sourceType1);
ListMultimap<String, Type> target1 = ArrayListMultimap.create();
QName target1TypeName;
String target1EntityName;
TypeDefinition targetType1 = new DefaultTypeDefinition(target1TypeName = new QName("http://some.name.space/t1", "target1Type"));
target1.put(target1EntityName = "Some name", new DefaultType(new TypeEntityDefinition(targetType1, SchemaSpaceID.TARGET, null)));
cell1.setTarget(target1);
target.addType(targetType1);
align.addCell(cell1);
// cell 2
MutableCell cell2 = new DefaultCell();
String id2;
cell2.setTransformationIdentifier(id2 = "trans2");
ListMultimap<String, ParameterValue> parameters2 = LinkedListMultimap.create();
parameters2.put("test", new ParameterValue("4"));
parameters2.put("tx", new ParameterValue("5"));
parameters2.put("tx", new ParameterValue("6"));
// complex parameter value
if (supportsComplexParameters()) {
TestAnnotation commentParam = new TestAnnotation();
commentParam.setAuthor("Gerd");
commentParam.setComment("Should a comment really be used as parameter?");
parameters2.put("comment", new ParameterValue(Value.complex(commentParam)));
}
cell2.setTransformationParameters(parameters2);
ListMultimap<String, Type> target2 = ArrayListMultimap.create();
TypeDefinition targetType2 = new DefaultTypeDefinition(new QName("target2Type"));
target2.put("Some other name", new DefaultType(new TypeEntityDefinition(targetType2, SchemaSpaceID.TARGET, null)));
cell2.setTarget(target2);
target.addType(targetType2);
align.addCell(cell2);
TestAnnotation ann1 = null;
TestAnnotation ann2 = null;
if (supportsAnnotations()) {
// add some annotations
ann1 = (TestAnnotation) cell2.addAnnotation("test");
ann1.setAuthor("Simon");
ann1.setComment("I have really no idea what I did here");
ann2 = (TestAnnotation) cell2.addAnnotation("test");
ann2.setAuthor("Hans");
ann2.setComment("Me neither");
}
String doc1 = "This cell was created in memory of...\nSorry, forgotten.";
String tag1 = "This is a tag";
String tag2 = "awesome";
if (supportsDocumentation()) {
cell1.getDocumentation().put(null, doc1);
cell1.getDocumentation().put("tag", tag1);
cell1.getDocumentation().put("tag", tag2);
}
// write alignment
File alignmentFile = tmp.newFile("alignment.xml");
System.out.println(alignmentFile.getAbsolutePath());
saveAlignment(align, new BufferedOutputStream(new FileOutputStream(alignmentFile)));
// load alignment
// TODO use and check reporter?
MutableAlignment align2 = loadAlignment(new FileInputStream(alignmentFile), source, target);
// compare loaded alignment
Collection<? extends Cell> cells = align2.getCells();
assertFalse(cells.isEmpty());
Iterator<? extends Cell> it = cells.iterator();
// cell 1
Cell ncell1 = it.next();
assertNotNull(ncell1);
assertEquals(id1, ncell1.getTransformationIdentifier());
// documentation
if (supportsDocumentation()) {
assertEquals(3, ncell1.getDocumentation().size());
assertEquals(doc1, ncell1.getDocumentation().get(null).get(0));
assertEquals(tag1, ncell1.getDocumentation().get("tag").get(0));
assertEquals(tag2, ncell1.getDocumentation().get("tag").get(1));
}
if (supportsTransformationModes()) {
assertEquals(TransformationMode.passive, ncell1.getTransformationMode());
}
// source 1
ListMultimap<String, ? extends Entity> source1Entities = ncell1.getSource();
assertEquals(1, source1Entities.size());
List<? extends Entity> s1list = source1Entities.get(source1EntityName);
assertFalse(s1list.isEmpty());
assertEquals(source1TypeName, s1list.get(0).getDefinition().getDefinition().getName());
// filter
assertEquals(filter, s1list.get(0).getDefinition().getFilter());
// target 1
ListMultimap<String, ? extends Entity> target1Entities = ncell1.getTarget();
assertEquals(1, target1Entities.size());
List<? extends Entity> t1list = target1Entities.get(target1EntityName);
assertFalse(t1list.isEmpty());
assertEquals(target1TypeName, t1list.get(0).getDefinition().getDefinition().getName());
// cell 2
Cell ncell2 = it.next();
assertNotNull(ncell2);
assertEquals(id2, ncell2.getTransformationIdentifier());
// parameters
ListMultimap<String, ParameterValue> param2 = ncell2.getTransformationParameters();
if (!supportsComplexParameters()) {
assertEquals(2, param2.keySet().size());
assertEquals(3, param2.values().size());
} else {
assertEquals(3, param2.keySet().size());
assertEquals(4, param2.values().size());
ParameterValue complexParam = param2.get("comment").get(0);
assertTrue(complexParam.getValue() instanceof TestAnnotation);
}
// annotations
if (supportsAnnotations()) {
List<?> annotations = ncell2.getAnnotations("test");
assertEquals(2, annotations.size());
TestAnnotation nann1 = (TestAnnotation) annotations.get(0);
assertEquals(ann1, nann1);
TestAnnotation nann2 = (TestAnnotation) annotations.get(1);
assertEquals(ann2, nann2);
}
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class DefaultAlignmentIOTest method testCellDisableSaveLoad.
/**
* Tests cell disable save and load.
*
* @throws Exception if an error occurs
*/
@Test
public void testCellDisableSaveLoad() 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();
}
// generate base alignment
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> childContext2 = new ArrayList<ChildContext>();
PropertyDefinition child2 = DefinitionUtil.getChild(t, new QName("a1")).asProperty();
childContext2.add(new ChildContext(child2));
ListMultimap<String, Property> source2 = ArrayListMultimap.create();
source2.put(null, new DefaultProperty(new PropertyEntityDefinition(t, childContext2, SchemaSpaceID.SOURCE, null)));
cell2.setSource(source2);
ListMultimap<String, Property> target2 = ArrayListMultimap.create();
target2.put(null, new DefaultProperty(new PropertyEntityDefinition(t, childContext2, SchemaSpaceID.TARGET, null)));
cell2.setTarget(target2);
DefaultCell cell3 = new DefaultCell();
cell3.setTransformationIdentifier("trans3");
List<ChildContext> childContext3 = new ArrayList<ChildContext>();
PropertyDefinition child3 = DefinitionUtil.getChild(t, new QName("b1")).asProperty();
childContext3.add(new ChildContext(child3));
ListMultimap<String, Property> source3 = ArrayListMultimap.create();
source3.put(null, new DefaultProperty(new PropertyEntityDefinition(t, childContext3, SchemaSpaceID.SOURCE, null)));
cell3.setSource(source3);
ListMultimap<String, Property> target3 = ArrayListMultimap.create();
target3.put(null, new DefaultProperty(new PropertyEntityDefinition(t, childContext3, SchemaSpaceID.TARGET, null)));
cell3.setTarget(target3);
baseAlignment.addCell(cell1);
baseAlignment.addCell(cell2);
String baseDisableCellId = cell2.getId();
baseAlignment.addCell(cell3);
String extendedDisableCellId = cell3.getId();
assertEquals(3, baseAlignment.getCells().size());
Cell typeCell = baseAlignment.getTypeCells().iterator().next();
assertEquals(2, baseAlignment.getPropertyCells(typeCell).size());
// test disable, it should not be with the related property cells
cell2.setDisabledFor(cell1, true);
assertEquals(1, baseAlignment.getPropertyCells(typeCell).size());
assertTrue(cell2.getDisabledFor().contains(cell1.getId()));
cell2.setDisabledFor(cell1, false);
assertFalse(cell2.getDisabledFor().contains(cell1.getId()));
cell2.setDisabledFor(cell1, true);
assertEquals(1, baseAlignment.getPropertyCells(typeCell).size());
// save base alignment
File baseAlignmentFile = tmp.newFile("alignment_base.xml");
System.out.println(baseAlignmentFile.getAbsolutePath());
saveAlignment(baseAlignment, new BufferedOutputStream(new FileOutputStream(baseAlignmentFile)));
// load base alignment
MutableAlignment baseAlignment2 = loadAlignment(new FileInputStream(baseAlignmentFile), schema, schema);
typeCell = baseAlignment2.getTypeCells().iterator().next();
assertEquals(3, baseAlignment2.getCells().size());
// test again that it is still disabled
assertEquals(1, baseAlignment2.getPropertyCells(typeCell).size());
// disable the remaining enabled cell in extended alignment
addBaseAlignment(alignment, baseAlignmentFile.toURI(), schema, schema);
assertEquals(1, alignment.getBaseAlignments().size());
String usedPrefix = alignment.getBaseAlignments().keySet().iterator().next();
File alignmentFile = tmp.newFile("alignment_extended.xml");
// check cells
typeCell = alignment.getTypeCells().iterator().next();
assertEquals(3, alignment.getCells().size());
assertEquals(1, alignment.getPropertyCells(typeCell).size());
// disable remaining cell
((ModifiableCell) alignment.getPropertyCells(typeCell, false, false).iterator().next()).setDisabledFor(typeCell, true);
assertEquals(0, alignment.getPropertyCells(typeCell).size());
// save / load extended alignment
System.out.println(alignmentFile.getAbsolutePath());
saveAlignment(alignment, new BufferedOutputStream(new FileOutputStream(alignmentFile)));
// load extended
MutableAlignment alignment2 = loadAlignment(new FileInputStream(alignmentFile), schema, schema);
typeCell = alignment2.getTypeCells().iterator().next();
// test disabled again
assertEquals(3, alignment2.getCells().size());
// test again that it is still disabled
assertEquals(0, alignment2.getPropertyCells(typeCell).size());
// more specifically test whether the disables come from base alignment
// or extended alignment
Cell baseDisableCell = alignment2.getCell(usedPrefix + ":" + baseDisableCellId);
Cell extendedDisableCell = alignment2.getCell(usedPrefix + ":" + extendedDisableCellId);
assertTrue(baseDisableCell instanceof BaseAlignmentCell);
assertEquals(1, baseDisableCell.getDisabledFor().size());
assertEquals(1, ((BaseAlignmentCell) baseDisableCell).getBaseDisabledFor().size());
assertEquals(0, ((BaseAlignmentCell) baseDisableCell).getAdditionalDisabledFor().size());
assertTrue(extendedDisableCell instanceof BaseAlignmentCell);
assertEquals(1, extendedDisableCell.getDisabledFor().size());
assertEquals(0, ((BaseAlignmentCell) extendedDisableCell).getBaseDisabledFor().size());
assertEquals(1, ((BaseAlignmentCell) extendedDisableCell).getAdditionalDisabledFor().size());
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class JaxbAlignmentIO method printCell.
/**
* Print a cell to an output stream (intended for tests/debugging).
*
* @param cell the cell to print
* @param out the output stream
* @throws Exception if an error occurs trying to print the cell
*/
public static void printCell(MutableCell cell, OutputStream out) throws Exception {
DefaultAlignment alignment = new DefaultAlignment();
alignment.addCell(cell);
IOReporter reporter = new DefaultIOReporter(new Locatable() {
@Override
public URI getLocation() {
return null;
}
}, "Print cell", null, false);
PathUpdate pathUpdate = new PathUpdate(null, null);
AlignmentType at = convert(alignment, reporter, pathUpdate);
CellType ct = (CellType) at.getCellOrModifier().get(0);
JAXBContext jc = JAXBContext.newInstance(ALIGNMENT_CONTEXT, ObjectFactory.class.getClassLoader());
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
ObjectFactory of = new ObjectFactory();
try {
m.marshal(of.createCell(ct), out);
} finally {
out.flush();
out.close();
}
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultAlignment in project hale by halestudio.
the class InlineTransformation method evaluate.
@Override
protected Object evaluate(String transformationIdentifier, TransformationEngine engine, ListMultimap<String, PropertyValue> variables, String resultName, PropertyEntityDefinition resultProperty, Map<String, String> executionParameters, TransformationLog log) throws TransformationException, NoResultException {
List<PropertyValue> sources = variables.get(null);
if (sources.isEmpty()) {
throw new NoResultException("No source available to transform");
}
PropertyValue source = sources.get(0);
Object sourceValue = source.getValue();
if (sourceValue == null) {
throw new NoResultException("Source value is null");
}
if (!(sourceValue instanceof Instance)) {
throw new TransformationException("Sources for inline transformation must be instances");
}
Instance sourceInstance = (Instance) sourceValue;
TypeDefinition sourceType = sourceInstance.getDefinition();
// get the original alignment
Alignment orgAlignment = getExecutionContext().getAlignment();
MutableAlignment alignment = new DefaultAlignment(orgAlignment);
// identify relevant type cell(s)
MutableCell queryCell = new DefaultCell();
ListMultimap<String, Type> sourceEntities = ArrayListMultimap.create();
sourceEntities.put(null, new DefaultType(new TypeEntityDefinition(sourceType, SchemaSpaceID.SOURCE, null)));
queryCell.setSource(sourceEntities);
ListMultimap<String, Type> targetEntities = ArrayListMultimap.create();
targetEntities.put(null, new DefaultType(new TypeEntityDefinition(resultProperty.getDefinition().getPropertyType(), SchemaSpaceID.TARGET, null)));
queryCell.setTarget(targetEntities);
Collection<? extends Cell> candidates = alignment.getTypeCells(queryCell);
if (candidates.isEmpty()) {
log.error(log.createMessage("No type transformations found for inline transformation", null));
throw new NoResultException();
}
// filter alignment -> only keep relevant type relations
List<Cell> allTypeCells = new ArrayList<>(alignment.getTypeCells());
for (Cell cell : allTypeCells) {
// remove cell
alignment.removeCell(cell);
if (!cell.getTransformationMode().equals(TransformationMode.disabled)) {
// only readd if not disabled
MutableCell copy = new DefaultCell(cell);
if (candidates.contains(cell)) {
// readd as active
copy.setTransformationMode(TransformationMode.active);
} else {
// readd as passive
copy.setTransformationMode(TransformationMode.passive);
}
alignment.addCell(copy);
}
}
// prepare transformation input/output
DefaultInstanceCollection sourceInstances = new DefaultInstanceCollection();
sourceInstances.add(sourceInstance);
DefaultInstanceSink target = new DefaultInstanceSink();
// run transformation
TransformationService ts = getExecutionContext().getService(TransformationService.class);
if (ts == null) {
throw new TransformationException("Transformation service not available for inline transformation");
}
ProgressIndicator progressIndicator = new LogProgressIndicator();
TransformationReport report = ts.transform(alignment, sourceInstances, new ThreadSafeInstanceSink<InstanceSink>(target), getExecutionContext(), progressIndicator);
// copy report messages
log.importMessages(report);
if (!report.isSuccess()) {
// copy report messages
log.importMessages(report);
throw new TransformationException("Inline transformation failed");
}
// extract result
List<Instance> targetList = target.getInstances();
if (targetList.isEmpty()) {
log.error(log.createMessage("Inline transformation yielded no result", null));
throw new NoResultException("No result from inline transformation");
}
if (targetList.size() > 1) {
log.error(log.createMessage("Inline transformation yielded multiple results, only first result is used", null));
}
return targetList.get(0);
}
Aggregations