Search in sources :

Example 6 with Filter

use of eu.esdihumboldt.hale.common.instance.model.Filter in project hale by halestudio.

the class InstanceVisitor method visit.

/**
 * @see AbstractSourceToTargetVisitor#visit(SourceNode)
 */
@Override
public boolean visit(SourceNode source) {
    if (source.getDefinition() instanceof TypeDefinition) {
        if (instance == null)
            return false;
        // source root
        if (source.getDefinition().equals(instance.getDefinition())) {
            // check type filter (if any)
            Filter filter = source.getEntityDefinition().getFilter();
            if (filter != null && !filter.match(instance)) {
                // instance does not match filter, don't descend further
                return false;
            /*
					 * XXX What about merged instances? Will this be OK for
					 * those? A type filter should only apply to the original
					 * instance if it is merged - but most filters should
					 * evaluate the same
					 */
            } else {
                // also sets the node to defined
                source.setValue(instance);
                for (FamilyInstance child : instance.getChildren()) {
                    // Find fitting SourceNodes.
                    Collection<SourceNode> candidateNodes = tree.getRootSourceNodes(child.getDefinition());
                    if (candidateNodes.isEmpty()) {
                        /*
							 * No node found - but this may be because no
							 * property of the type is mapped, but there still
							 * might be child instances (in a Join) that have
							 * types with associated relations. To prevent those
							 * being skipped we add an artificial node
							 * representing the instance.
							 */
                        candidateNodes = new ArrayList<>();
                        EntityDefinition entityDef = new TypeEntityDefinition(child.getDefinition(), SchemaSpaceID.SOURCE, null);
                        candidateNodes.add(new SourceNodeImpl(entityDef, null, false));
                    }
                    for (SourceNode candidateNode : candidateNodes) {
                        filter = candidateNode.getEntityDefinition().getFilter();
                        if (filter == null || filter.match(child)) {
                            // XXX add to all candidates!?
                            if (candidateNode.getValue() == null) {
                                candidateNode.setAnnotatedParent(source);
                                source.addAnnotatedChild(candidateNode);
                            } else {
                                // Duplicate here, because there is no
                                // guarantee, that the Duplication
                                // Visitor will visit candidateNode after
                                // this node.
                                SourceNodeImpl duplicateNode = new SourceNodeImpl(candidateNode.getEntityDefinition(), candidateNode.getParent(), false);
                                duplicateNode.setAnnotatedParent(source);
                                source.addAnnotatedChild(duplicateNode);
                                TransformationContext context = candidateNode.getContext();
                                duplicateNode.setContext(context);
                                if (context != null) {
                                    context.duplicateContext(candidateNode, duplicateNode, Collections.<Cell>emptySet(), log);
                                } else {
                                    /*
										 * Not sure what this really means if we
										 * get here.
										 * 
										 * Best guess: Probably that we weren't
										 * able to determine how the duplication
										 * of this source can be propagted to
										 * the target. Thus the duplicated node
										 * will probably not have any
										 * connection.
										 */
                                    log.warn(log.createMessage("No transformation context for duplicated node of source " + candidateNode.getDefinition().getDisplayName(), null));
                                }
                                candidateNode = duplicateNode;
                            }
                            // run instance visitor on that annotated child
                            InstanceVisitor visitor = new InstanceVisitor(child, tree, log);
                            candidateNode.accept(visitor);
                        }
                    }
                }
                return true;
            }
        } else
            return false;
    } else {
        Object parentValue = source.getParent().getValue();
        if (parentValue == null || !(parentValue instanceof Group)) {
            source.setDefined(false);
            return false;
        } else {
            Group parentGroup = (Group) parentValue;
            Definition<?> currentDef = source.getDefinition();
            Object[] values = parentGroup.getProperty(currentDef.getName());
            if (values == null) {
                source.setDefined(false);
                return false;
            }
            // check for contexts
            EntityDefinition entityDef = source.getEntityDefinition();
            // index context
            Integer index = AlignmentUtil.getContextIndex(entityDef);
            if (index != null) {
                // only use the value at the given index, if present
                if (index < values.length) {
                    // annotate with the value at the index
                    Object value = values[index];
                    source.setValue(value);
                    return true;
                } else {
                    source.setDefined(false);
                    return false;
                }
            }
            // condition context
            Condition condition = AlignmentUtil.getContextCondition(entityDef);
            if (condition != null) {
                if (condition.getFilter() == null) {
                    // assume exclusion
                    source.setDefined(false);
                    return false;
                }
                // apply condition as filter on values and continue with
                // those values
                Collection<Object> matchedValues = new ArrayList<Object>();
                for (Object value : values) {
                    // determine parent
                    Object parent = null;
                    SourceNode parentNode = source.getParent();
                    if (parentNode != null && parentNode.isDefined()) {
                        parent = parentNode.getValue();
                    }
                    // test the condition
                    if (AlignmentUtil.matchCondition(condition, value, parent)) {
                        matchedValues.add(value);
                    }
                }
                values = matchedValues.toArray();
            }
            // default behavior (default context)
            if (values.length >= 1) {
                // annotate with the first value
                Object value = values[0];
                source.setValue(value);
                source.setAllValues(values);
            } else {
                source.setDefined(false);
                return false;
            }
            if (values.length > 1) {
                // handle additional values
                Object[] leftovers = new Object[values.length - 1];
                System.arraycopy(values, 1, leftovers, 0, leftovers.length);
                source.setLeftovers(new LeftoversImpl(source, leftovers));
            }
            return true;
        }
    }
}
Also used : Condition(eu.esdihumboldt.hale.common.align.model.Condition) Group(eu.esdihumboldt.hale.common.instance.model.Group) ArrayList(java.util.ArrayList) TransformationContext(eu.esdihumboldt.hale.common.align.model.transformation.tree.context.TransformationContext) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) SourceNodeImpl(eu.esdihumboldt.hale.common.align.model.transformation.tree.impl.SourceNodeImpl) TypeEntityDefinition(eu.esdihumboldt.hale.common.align.model.impl.TypeEntityDefinition) EntityDefinition(eu.esdihumboldt.hale.common.align.model.EntityDefinition) SourceNode(eu.esdihumboldt.hale.common.align.model.transformation.tree.SourceNode) TypeEntityDefinition(eu.esdihumboldt.hale.common.align.model.impl.TypeEntityDefinition) Filter(eu.esdihumboldt.hale.common.instance.model.Filter) LeftoversImpl(eu.esdihumboldt.hale.common.align.model.transformation.tree.impl.LeftoversImpl) FamilyInstance(eu.esdihumboldt.hale.common.instance.model.FamilyInstance)

Example 7 with Filter

use of eu.esdihumboldt.hale.common.instance.model.Filter in project hale by halestudio.

the class EntityAccessorUtil method createEntity.

/**
 * Create an entity definition from a path.
 *
 * @param path the path, the topmost element has to represent an
 *            {@link EntityDefinition}, all other elements must represent
 *            {@link ChildContext}s
 * @return the created entity definition or <code>null</code> if the path
 *         was <code>null</code>
 */
public static EntityDefinition createEntity(Path<PathElement> path) {
    if (path == null) {
        return null;
    }
    List<PathElement> elements = new ArrayList<>(path.getElements());
    // create entity definition
    PathElement top = elements.remove(0);
    if (top.getRoot() == null) {
        throw new IllegalArgumentException("Topmost path element must be an entity definition");
    }
    EntityDefinition entity = top.getRoot();
    // collect type information
    TypeDefinition type = entity.getType();
    SchemaSpaceID schemaSpace = entity.getSchemaSpace();
    Filter filter = entity.getFilter();
    List<ChildContext> contextPath = new ArrayList<>(entity.getPropertyPath());
    for (PathElement element : elements) {
        ChildContext cc = element.getChild();
        if (cc == null) {
            throw new IllegalArgumentException("All child elements must be defined by a child context");
        }
        contextPath.add(cc);
    }
    return AlignmentUtil.createEntity(type, contextPath, schemaSpace, filter);
}
Also used : EntityDefinition(eu.esdihumboldt.hale.common.align.model.EntityDefinition) PathElement(eu.esdihumboldt.hale.common.align.groovy.accessor.PathElement) Filter(eu.esdihumboldt.hale.common.instance.model.Filter) ArrayList(java.util.ArrayList) ChildContext(eu.esdihumboldt.hale.common.align.model.ChildContext) SchemaSpaceID(eu.esdihumboldt.hale.common.schema.SchemaSpaceID) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition)

Example 8 with Filter

use of eu.esdihumboldt.hale.common.instance.model.Filter in project hale by halestudio.

the class TypeFilterField method updateFilter.

/**
 * Update the filter and valid properties.
 */
protected void updateFilter() {
    Filter lastFilter = filter;
    boolean lastValid = valid;
    String filterString = filterText.getText();
    boolean filterPresent = filterString != null && !filterString.isEmpty();
    if (filterPresent) {
        clearFilter.setEnabled(true);
        try {
            filter = createFilter(filterString);
            valid = true;
            showDefaultDecoration();
        } catch (Throwable e) {
            // show error decoration
            decoration.setImage(FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage());
            decoration.setDescriptionText(e.getMessage());
            decoration.show();
            // mark as invalid
            filter = null;
            valid = false;
        }
    } else {
        clearFilter.setEnabled(false);
        filter = null;
        valid = false;
        showDefaultDecoration();
    }
    // fire events
    if (lastValid != valid) {
        notifyListeners(new PropertyChangeEvent(this, PROPERTY_VALID, lastValid, valid));
    }
    notifyListeners(new PropertyChangeEvent(this, PROPERTY_FILTER, lastFilter, filter));
}
Also used : PropertyChangeEvent(java.beans.PropertyChangeEvent) Filter(eu.esdihumboldt.hale.common.instance.model.Filter)

Example 9 with Filter

use of eu.esdihumboldt.hale.common.instance.model.Filter in project hale by halestudio.

the class CQLFilterDialogFactory method openDialog.

@Override
public Filter openDialog(Shell shell, EntityDefinition entityDef, String title, String message) {
    TypeEntityDefinition parentType;
    if (entityDef.getPropertyPath().isEmpty())
        parentType = AlignmentUtil.getTypeEntity(entityDef);
    else {
        Definition<?> def = entityDef.getDefinition();
        TypeDefinition propertyType = ((PropertyDefinition) def).getPropertyType();
        // create a dummy type for the filter
        TypeDefinition dummyType = new DefaultTypeDefinition(new QName("ValueFilterDummy"));
        // create dummy type entity
        Condition condition = AlignmentUtil.getContextCondition(entityDef);
        Filter filter = condition == null ? null : condition.getFilter();
        parentType = new TypeEntityDefinition(dummyType, entityDef.getSchemaSpace(), filter);
        // with the property type being contained as value
        // property
        new DefaultPropertyDefinition(new QName("value"), dummyType, propertyType);
        // and the parent type as parent property
        new DefaultPropertyDefinition(new QName("parent"), dummyType, ((PropertyDefinition) def).getParentType());
    }
    CQLFilterDialog dialog = new CQLFilterDialog(shell, parentType, title, message);
    if (dialog.open() == CQLFilterDialog.OK) {
        return dialog.getFilter();
    }
    return null;
}
Also used : DefaultTypeDefinition(eu.esdihumboldt.hale.common.schema.model.impl.DefaultTypeDefinition) Condition(eu.esdihumboldt.hale.common.align.model.Condition) DefaultPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.impl.DefaultPropertyDefinition) TypeEntityDefinition(eu.esdihumboldt.hale.common.align.model.impl.TypeEntityDefinition) Filter(eu.esdihumboldt.hale.common.instance.model.Filter) QName(javax.xml.namespace.QName) DefaultPropertyDefinition(eu.esdihumboldt.hale.common.schema.model.impl.DefaultPropertyDefinition) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) TypeDefinition(eu.esdihumboldt.hale.common.schema.model.TypeDefinition) DefaultTypeDefinition(eu.esdihumboldt.hale.common.schema.model.impl.DefaultTypeDefinition)

Example 10 with Filter

use of eu.esdihumboldt.hale.common.instance.model.Filter in project hale by halestudio.

the class AbstractAlignmentMappingExport method addCellData.

// get the information of the cell and add them to the map
private void addCellData(Cell cell) {
    Map<CellType, CellInformation> cellInfos = new HashMap<CellType, CellInformation>();
    // create all entries
    List<CellType> cellTypes = getCellTypes();
    for (int i = 0; i < cellTypes.size(); i++) {
        cellInfos.put(cellTypes.get(i), new CellInformation());
    }
    cellInfos.get(CellType.ID).addText(cell.getId(), 0);
    if (cell.getSource() != null) {
        // save the hierarchy of the properties
        // all entries (in the same CellInfo) with the same hierarchy level
        // have to be shown on the same height
        int position = 0;
        for (Entity entity : cell.getSource().values()) {
            // column source type
            cellInfos.get(CellType.SOURCE_TYPE).addText(entity.getDefinition().getType().getName().getLocalPart(), position);
            if (includeNamespaces)
                // column source type namespace
                cellInfos.get(CellType.SOURCE_TYPE_NAMESPACE).addText(entity.getDefinition().getType().getName().getNamespaceURI(), position);
            // column source type conditions
            Filter entityFilter;
            if ((entityFilter = entity.getDefinition().getFilter()) != null) {
                cellInfos.get(CellType.SOURCE_TYPE_CONDITIONS).addText(FilterDefinitionManager.getInstance().asString(entityFilter), position);
                entity.getDefinition().getType().getName().getLocalPart();
            }
            for (ChildContext childContext : entity.getDefinition().getPropertyPath()) {
                PropertyDefinition child = childContext.getChild().asProperty();
                if (child != null) {
                    // column source properties
                    cellInfos.get(CellType.SOURCE_PROPERTIES).addText(child.getName().getLocalPart(), position);
                    if (includeNamespaces)
                        // column source properties namespace
                        cellInfos.get(CellType.SOURCE_PROPERTIES_NAMESPACE).addText(child.getName().getNamespaceURI(), position);
                    Filter contextFilter;
                    if (childContext.getCondition() != null) {
                        contextFilter = childContext.getCondition().getFilter();
                        // column source property conditions
                        cellInfos.get(CellType.SOURCE_PROPERTY_CONDITIONS).addText(FilterDefinitionManager.getInstance().asString(contextFilter), position);
                    }
                    // add dummy to adapt position of source type and source
                    // type conditions
                    cellInfos.get(CellType.SOURCE_TYPE).addText("", position);
                    cellInfos.get(CellType.SOURCE_TYPE_CONDITIONS).addText("", position);
                    position++;
                }
            }
            // next entries must have higher position
            position++;
        }
    }
    if (cell.getTarget() != null) {
        int position = 0;
        for (Entity entity : cell.getTarget().values()) {
            // column target type
            cellInfos.get(CellType.TARGET_TYPE).addText(entity.getDefinition().getType().getDisplayName(), position);
            if (includeNamespaces)
                // column target type namespace
                cellInfos.get(CellType.TARGET_TYPE_NAMESPACE).addText(entity.getDefinition().getType().getName().getNamespaceURI(), position);
            for (ChildContext childContext : entity.getDefinition().getPropertyPath()) {
                PropertyDefinition child = childContext.getChild().asProperty();
                if (child != null) {
                    // column target properties
                    cellInfos.get(CellType.TARGET_PROPERTIES).addText(child.getName().getLocalPart(), position);
                    if (includeNamespaces)
                        // column target properties namespace
                        cellInfos.get(CellType.TARGET_PROPERTIES_NAMESPACE).addText(child.getName().getNamespaceURI(), position);
                    // add dummy to adapt position of target type
                    cellInfos.get(CellType.TARGET_TYPE).addText("", position);
                    position++;
                }
            }
            position++;
        }
    }
    FunctionDefinition<?> function = FunctionUtil.getFunction(cell.getTransformationIdentifier(), getServiceProvider());
    if (function != null) {
        // column relation name
        cellInfos.get(CellType.RELATION_NAME).addText(function.getDisplayName(), 0);
        // column cell explanation
        CellExplanation cellExpl = function.getExplanation();
        if (cellExpl != null) {
            cellInfos.get(CellType.CELL_EXPLANATION).addText(function.getExplanation().getExplanation(cell, null), 0);
        }
    }
    // column cell notes
    List<String> docs = cell.getDocumentation().get(null);
    if (!docs.isEmpty()) {
        String notes = docs.get(0);
        if (notes != null && !notes.isEmpty()) {
            cellInfos.get(CellType.CELL_NOTES).addText(notes, 0);
        }
    }
    // cell priority
    cellInfos.get(CellType.PRIORITY).addText(cell.getPriority().value(), 0);
    // base cell
    if (cell.isBaseCell()) {
        cellInfos.get(CellType.BASE_CELL).addText("yes", 0);
    } else {
        cellInfos.get(CellType.BASE_CELL).addText("no", 0);
    }
    // column transformation/disabled
    if (transformationAndDisabledMode) {
        if (AlignmentUtil.isTypeCell(cell)) {
            currentTypeCell = cell;
            cellInfos.get(CellType.TRANSFORMATION_AND_DISABLED).addText(cell.getTransformationMode().displayName(), 0);
        } else {
            Set<String> disabledCells = cell.getDisabledFor();
            if (disabledCells.contains(currentTypeCell.getId())) {
                for (String disCell : disabledCells) {
                    cellInfos.get(CellType.TRANSFORMATION_AND_DISABLED).addText(disCell, 0);
                }
            }
        }
    }
    // add the row to the map
    allRelations.add(cellInfos);
}
Also used : Entity(eu.esdihumboldt.hale.common.align.model.Entity) HashMap(java.util.HashMap) PropertyDefinition(eu.esdihumboldt.hale.common.schema.model.PropertyDefinition) CellExplanation(eu.esdihumboldt.hale.common.align.model.CellExplanation) Filter(eu.esdihumboldt.hale.common.instance.model.Filter) ChildContext(eu.esdihumboldt.hale.common.align.model.ChildContext)

Aggregations

Filter (eu.esdihumboldt.hale.common.instance.model.Filter)22 Test (org.junit.Test)9 MutableInstance (eu.esdihumboldt.hale.common.instance.model.MutableInstance)8 DefaultInstance (eu.esdihumboldt.hale.common.instance.model.impl.DefaultInstance)8 TypeDefinition (eu.esdihumboldt.hale.common.schema.model.TypeDefinition)8 TypeEntityDefinition (eu.esdihumboldt.hale.common.align.model.impl.TypeEntityDefinition)7 Instance (eu.esdihumboldt.hale.common.instance.model.Instance)7 EntityDefinition (eu.esdihumboldt.hale.common.align.model.EntityDefinition)5 InstanceCollection (eu.esdihumboldt.hale.common.instance.model.InstanceCollection)5 DefaultTypeDefinition (eu.esdihumboldt.hale.common.schema.model.impl.DefaultTypeDefinition)5 QName (javax.xml.namespace.QName)5 ChildContext (eu.esdihumboldt.hale.common.align.model.ChildContext)4 Condition (eu.esdihumboldt.hale.common.align.model.Condition)4 DefaultPropertyDefinition (eu.esdihumboldt.hale.common.schema.model.impl.DefaultPropertyDefinition)3 Cell (eu.esdihumboldt.hale.common.align.model.Cell)2 MutableCell (eu.esdihumboldt.hale.common.align.model.MutableCell)2 ParameterValue (eu.esdihumboldt.hale.common.align.model.ParameterValue)2 Type (eu.esdihumboldt.hale.common.align.model.Type)2 DefaultCell (eu.esdihumboldt.hale.common.align.model.impl.DefaultCell)2 DefaultType (eu.esdihumboldt.hale.common.align.model.impl.DefaultType)2