use of eu.esdihumboldt.hale.common.align.model.MutableCell in project hale by halestudio.
the class FormattedStringMigrator method updateCell.
@Override
public MutableCell updateCell(Cell originalCell, AlignmentMigration migration, MigrationOptions options, SimpleLog log) {
MutableCell result = super.updateCell(originalCell, migration, options, log);
log = SimpleLog.all(log, new CellLog(result, CELL_LOG_CATEGORY));
if (options.updateSource()) {
ListMultimap<String, ParameterValue> modParams = ArrayListMultimap.create(result.getTransformationParameters());
List<ParameterValue> patternParams = modParams.get(FormattedStringFunction.PARAMETER_PATTERN);
if (!patternParams.isEmpty()) {
String pattern = patternParams.get(0).as(String.class);
if (pattern != null) {
patternParams.clear();
patternParams.add(new ParameterValue(Value.of(convertPattern(pattern, originalCell.getSource(), migration, log))));
}
}
result.setTransformationParameters(modParams);
}
return result;
}
use of eu.esdihumboldt.hale.common.align.model.MutableCell in project hale by halestudio.
the class JoinMigrator method updateCell.
@Override
public MutableCell updateCell(Cell originalCell, AlignmentMigration migration, MigrationOptions options, SimpleLog log) {
MutableCell result = super.updateCell(originalCell, migration, options, log);
SimpleLog cellLog = SimpleLog.all(log, new CellLog(result, CELL_LOG_CATEGORY));
if (options.updateSource()) {
ListMultimap<String, ParameterValue> modParams = ArrayListMultimap.create(result.getTransformationParameters());
List<ParameterValue> joinParams = modParams.get(JoinFunction.PARAMETER_JOIN);
if (!joinParams.isEmpty()) {
JoinParameter joinParam = joinParams.get(0).as(JoinParameter.class);
if (joinParam != null) {
joinParams.clear();
joinParams.add(new ParameterValue(Value.complex(convertJoinParameter(joinParam, migration, options, cellLog))));
}
}
result.setTransformationParameters(modParams);
}
return result;
}
use of eu.esdihumboldt.hale.common.align.model.MutableCell in project hale by halestudio.
the class AbstractMergeCellMigratorTest method mergeWithMigrator.
/**
* Perform merging using a specific merge migrator.
*
* @param migrator the migrator to test, <code>null</code> if the migrator
* configured in the system should be used
* @param cellId the ID of the cell to migrate
* @param projectToMigrate the location of the project containing the cell
* (Mapping from B to C)
* @param matchingProject the location of the project providing the matching
* (Mapping from A to B) information
* @return the merge result
* @throws Exception if preparing or running the test fails
*/
public List<MutableCell> mergeWithMigrator(MergeCellMigrator migrator, String cellId, URL projectToMigrate, URL matchingProject) throws Exception {
ProjectTransformationEnvironment projectToMigrateEnv = projectCache.get(projectToMigrate.toURI());
Alignment migrateAlignment = projectToMigrateEnv.getAlignment();
Cell cellToMigrate = migrateAlignment.getCell(cellId);
assertNotNull(MessageFormat.format("Cell with ID {0} not found in alignment to migrate", cellId), cellToMigrate);
ProjectTransformationEnvironment matchingProjectEnv = projectCache.get(matchingProject.toURI());
return mergeWithMigrator(migrator, cellToMigrate, matchingProjectEnv);
}
use of eu.esdihumboldt.hale.common.align.model.MutableCell in project hale by halestudio.
the class JoinContext method apply.
/**
* Apply information collected in the context to the cell.
*
* @param newCell the merged cell
* @param log the cell log
* @param migration the alignment migration
*/
public void apply(MutableCell newCell, AlignmentMigration migration, SimpleLog log) {
ListMultimap<String, ParameterValue> params = ArrayListMultimap.create();
/*
* Order: Keep original order but replace entities w/ all matches
*/
Set<TypeEntityDefinition> types = new LinkedHashSet<>();
for (TypeEntityDefinition type : orgParameter.getTypes()) {
List<TypeEntityDefinition> repl = replacements.get(type);
if (repl.isEmpty()) {
log.error("Could not find replacement for type {0} in join order", type);
types.add(type);
} else {
types.addAll(repl);
}
}
/*
* Conditions: (1) add conditions from matches and (2) add conditions
* from original cell translated to new schema (via property mapping),
* if they are not duplicates
*/
Set<Pair<PropertyEntityDefinition, PropertyEntityDefinition>> cons = new LinkedHashSet<>();
// add conditions from matches
for (Cell match : joinMatches) {
JoinParameter matchParameter = CellUtil.getFirstParameter(match, JoinFunction.PARAMETER_JOIN).as(JoinParameter.class);
for (JoinCondition condition : matchParameter.getConditions()) {
cons.add(new Pair<>(condition.baseProperty, condition.joinProperty));
}
}
// migrate original conditions
Set<JoinCondition> migrated = orgParameter.getConditions().stream().map(condition -> {
PropertyEntityDefinition baseProperty = processOriginalConditionProperty(condition.baseProperty, migration, log);
PropertyEntityDefinition joinProperty = processOriginalConditionProperty(condition.joinProperty, migration, log);
JoinCondition result = new JoinCondition(baseProperty, joinProperty);
return result;
}).collect(Collectors.toSet());
for (JoinCondition condition : migrated) {
if (!condition.baseProperty.equals(condition.joinProperty)) {
// migrated condition may contain "loop" condition
cons.add(new Pair<>(condition.baseProperty, condition.joinProperty));
}
}
// add messages on dropped filter/conditions
for (EntityDefinition stripped : strippedSources) {
if (!AlignmentUtil.isDefaultEntity(stripped)) {
String msg = "Conditions/contexts for an original source could not be transfered and were dropped: " + MergeUtil.getContextInfoString(stripped);
log.warn(msg);
}
}
// all conditions
Set<JoinCondition> conditions = new HashSet<>();
for (Pair<PropertyEntityDefinition, PropertyEntityDefinition> condition : cons) {
conditions.add(new JoinCondition(condition.getFirst(), condition.getSecond()));
}
JoinParameter newParam = new JoinParameter(new ArrayList<>(types), conditions);
params.replaceValues(JoinFunction.PARAMETER_JOIN, Collections.singleton(new ParameterValue(Value.of(newParam))));
// Use Groovy Join if original or match uses a script
if (!scripts.isEmpty()) {
boolean originalScript = scripts.size() == 1 && GroovyJoin.ID.equals(newCell.getTransformationIdentifier());
Text script;
if (originalScript) {
// use original script
script = new Text(scripts.get(0).getSecond());
// create annotation
log.warn("The Groovy script from the original cell was reused, logic and references to sources are very likely not valid anymore.");
} else {
// dummy script with all original scripts
newCell.setTransformationIdentifier(GroovyJoin.ID);
script = buildScript(scripts);
// create annotation
log.warn("At least one source mapping used a Groovy script, the script could not be combined automatically and was replaced with a dummy script (old scripts are commented out). Please check how you can migrate the old functionality.");
}
params.replaceValues(GroovyConstants.PARAMETER_SCRIPT, Collections.singleton(new ParameterValue(Value.of(script))));
}
newCell.setTransformationParameters(params);
}
use of eu.esdihumboldt.hale.common.align.model.MutableCell 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);
}
}
Aggregations