use of eu.esdihumboldt.hale.common.align.model.impl.DefaultCell in project hale by halestudio.
the class DefaultCellMigrator method updateCell.
@Override
public MutableCell updateCell(final Cell originalCell, final AlignmentMigration migration, final MigrationOptions options, SimpleLog log) {
MutableCell result = new DefaultCell(originalCell);
SimpleLog cellLog = SimpleLog.all(log, new CellLog(result, CELL_LOG_CATEGORY));
final AtomicBoolean replacedEntities = new AtomicBoolean(false);
EntryTransformer<String, Entity, Entity> entityTransformer = new EntryTransformer<String, Entity, Entity>() {
@Override
public Entity transformEntry(String key, Entity value) {
EntityDefinition org = value.getDefinition();
Optional<EntityDefinition> replace = migration.entityReplacement(org, cellLog);
EntityDefinition entity = replace.orElse(org);
if (!Objects.equal(entity, org)) {
replacedEntities.set(true);
}
if (entity instanceof PropertyEntityDefinition) {
return new DefaultProperty((PropertyEntityDefinition) entity);
} else if (entity instanceof TypeEntityDefinition) {
return new DefaultType((TypeEntityDefinition) entity);
} else {
throw new IllegalStateException("Invalid entity definition for creating entity");
}
}
};
// update source entities
if (options.updateSource() && result.getSource() != null && !result.getSource().isEmpty()) {
result.setSource(ArrayListMultimap.create(Multimaps.transformEntries(result.getSource(), entityTransformer)));
}
// update target entities
if (options.updateTarget() && result.getTarget() != null && !result.getTarget().isEmpty()) {
result.setTarget(ArrayListMultimap.create(Multimaps.transformEntries(result.getTarget(), entityTransformer)));
}
// TODO anything else?
postUpdateCell(result, options, replacedEntities.get(), cellLog);
return result;
}
use of eu.esdihumboldt.hale.common.align.model.impl.DefaultCell 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.DefaultCell 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.DefaultCell 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.DefaultCell in project hale by halestudio.
the class MarkdownCellExplanationTest method createTestCell.
@SuppressWarnings("unused")
private Cell createTestCell() {
// cell 1
MutableCell cell1 = new DefaultCell();
String id1;
// must be an existing function
cell1.setTransformationIdentifier(id1 = "eu.esdihumboldt.hale.align.formattedstring");
ListMultimap<String, ParameterValue> parameters1 = LinkedListMultimap.create();
// parameter that does not exist (for parameter list testing)
parameters1.put("test", new ParameterValue("1"));
parameters1.put("test", new ParameterValue("2"));
// existing parameter
parameters1.put("pattern", new ParameterValue("3"));
cell1.setTransformationParameters(parameters1);
ListMultimap<String, Type> source1 = ArrayListMultimap.create();
QName source1TypeName;
String source1EntityName;
TypeDefinition sourceType1 = new DefaultTypeDefinition(source1TypeName = new QName("source1Type"));
Filter filter = null;
source1.put(source1EntityName = "var", new DefaultType(new TypeEntityDefinition(sourceType1, SchemaSpaceID.SOURCE, filter)));
cell1.setSource(source1);
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 = null, new DefaultType(new TypeEntityDefinition(targetType1, SchemaSpaceID.TARGET, null)));
cell1.setTarget(target1);
return cell1;
}
Aggregations