Search in sources :

Example 26 with FieldGroup

use of io.atlasmap.v2.FieldGroup in project atlasmap by atlasmap.

the class DefaultAtlasExpressionProcessor method processExpression.

/**
 * Processes the expression.
 * @param session session
 * @param expression expression
 */
public static void processExpression(DefaultAtlasSession session, String expression) {
    if (expression == null || expression.trim().isEmpty()) {
        return;
    }
    try {
        Map<String, Field> sourceFieldMap = new HashMap<>();
        Field parent = session.head().getSourceField();
        if (parent != null && !AtlasUtil.isEmpty(parent.getDocId()) && !AtlasUtil.isEmpty(parent.getPath())) {
            sourceFieldMap.put(parent.getDocId() + ":" + parent.getPath(), parent);
        }
        // Anonymous FieldGroup is just a wrapping, peel it off
        if (parent instanceof FieldGroup && AtlasUtil.isEmpty(parent.getPath())) {
            FieldGroup parentGroup = FieldGroup.class.cast(parent);
            for (Field child : parentGroup.getField()) {
                if (!(AtlasUtil.isEmpty(child.getDocId()) && AtlasUtil.isEmpty(child.getPath()))) {
                    sourceFieldMap.put(child.getDocId() + ":" + child.getPath(), child);
                }
            }
        }
        Expression parsedExpression = Expression.parse(expression, DefaultAtlasFunctionResolver.getInstance());
        Object answer = parsedExpression.evaluate((path) -> {
            if (path == null || path.isEmpty()) {
                return null;
            }
            try {
                Field f = sourceFieldMap.get(path);
                if (f == null) {
                    return null;
                }
                AtlasModule sourceModule;
                Map<String, AtlasModule> sourceModules = session.getAtlasContext().getSourceModules();
                if (f instanceof ConstantField) {
                    sourceModule = sourceModules.get(AtlasConstants.CONSTANTS_DOCUMENT_ID);
                } else if (f instanceof PropertyField) {
                    sourceModule = sourceModules.get(AtlasConstants.PROPERTIES_SOURCE_DOCUMENT_ID);
                } else {
                    String[] splitted = path.split(":", 2);
                    sourceModule = sourceModules.get(splitted[0]);
                }
                if (sourceModule == null) {
                    throw new ExpressionException(String.format("Module for the path '%s' is not found", path));
                }
                session.head().setSourceField(f);
                sourceModule.readSourceValue(session);
                return session.head().getSourceField();
            } catch (Exception e) {
                throw new ExpressionException(e);
            }
        });
        if (answer instanceof Field) {
            session.head().setSourceField((Field) answer);
        } else {
            Field from = session.head().getSourceField();
            SimpleField to = new SimpleField();
            AtlasModelFactory.copyField(from, to, false);
            to.setValue(answer);
            session.head().setSourceField(to);
        }
    } catch (Exception e) {
        AtlasUtil.addAudit(session, expression, String.format("Expression processing error [%s]: %s", expression, e.getMessage()), AuditStatus.ERROR, null);
        if (LOG.isDebugEnabled()) {
            LOG.debug("", e);
        }
    }
}
Also used : HashMap(java.util.HashMap) FieldGroup(io.atlasmap.v2.FieldGroup) ConstantField(io.atlasmap.v2.ConstantField) ExpressionException(io.atlasmap.expression.ExpressionException) ExpressionException(io.atlasmap.expression.ExpressionException) SimpleField(io.atlasmap.v2.SimpleField) ConstantField(io.atlasmap.v2.ConstantField) PropertyField(io.atlasmap.v2.PropertyField) Field(io.atlasmap.v2.Field) AtlasModule(io.atlasmap.spi.AtlasModule) PropertyField(io.atlasmap.v2.PropertyField) Expression(io.atlasmap.expression.Expression) SimpleField(io.atlasmap.v2.SimpleField)

Example 27 with FieldGroup

use of io.atlasmap.v2.FieldGroup in project atlasmap by atlasmap.

the class DefaultAtlasFieldActionService method processAction.

private Field processAction(Action action, ActionProcessor processor, FieldType sourceType, Field field) throws AtlasException {
    ActionDetail detail = processor.getActionDetail();
    Multiplicity multiplicity = detail.getMultiplicity() != null ? detail.getMultiplicity() : Multiplicity.ONE_TO_ONE;
    if (multiplicity == Multiplicity.MANY_TO_ONE) {
        return processManyToOne(action, processor, sourceType, field);
    }
    if (multiplicity == Multiplicity.ONE_TO_MANY) {
        if (field instanceof FieldGroup) {
            while (field instanceof FieldGroup) {
                field = ((FieldGroup) field).getField().get(0);
            }
        }
        return processOneToMany(action, processor, sourceType, field);
    }
    if (field instanceof FieldGroup) {
        return processActionForEachCollectionItem(action, processor, sourceType, (FieldGroup) field);
    }
    Object value = field.getValue();
    if (value != null && !isAssignableFieldType(detail.getSourceType(), sourceType)) {
        value = getConversionService().convertType(value, sourceType, detail.getSourceType());
    }
    value = processor.process(action, value);
    field.setFieldType(processor.getActionDetail().getTargetType());
    field.setValue(value);
    return field;
}
Also used : ActionDetail(io.atlasmap.v2.ActionDetail) FieldGroup(io.atlasmap.v2.FieldGroup) Multiplicity(io.atlasmap.v2.Multiplicity)

Example 28 with FieldGroup

use of io.atlasmap.v2.FieldGroup in project atlasmap by atlasmap.

the class DefaultAtlasFieldActionService method extractNestedListValuesForExpressionAction.

private void extractNestedListValuesForExpressionAction(Field field, List<Object> fieldValues) {
    if (!(field instanceof FieldGroup)) {
        fieldValues.add(field.getValue());
        return;
    }
    FieldGroup fieldGroup = (FieldGroup) field;
    if (fieldGroup == null || fieldGroup.getField() == null || fieldGroup.getField().isEmpty()) {
        return;
    }
    List<Field> fields = null;
    // passed in to Expression.
    while (fieldGroup.getPath() == null || fieldGroup.getPath().isEmpty()) {
        if (fieldGroup.getField().size() == 1 && (fieldGroup.getField().get(0) instanceof FieldGroup)) {
            fieldGroup = (FieldGroup) fieldGroup.getField().get(0);
        } else {
            fields = fieldGroup.getField();
            break;
        }
    }
    if (fields == null) {
        fields = new LinkedList<>();
        fields.add(fieldGroup);
    }
    doExtractValuesForExpressionAction(fields, fieldValues);
}
Also used : Field(io.atlasmap.v2.Field) SimpleField(io.atlasmap.v2.SimpleField) FieldGroup(io.atlasmap.v2.FieldGroup)

Example 29 with FieldGroup

use of io.atlasmap.v2.FieldGroup in project atlasmap by atlasmap.

the class DefaultAtlasFieldActionService method processActionForEachCollectionItem.

private FieldGroup processActionForEachCollectionItem(Action action, ActionProcessor processor, FieldType sourceType, FieldGroup fieldGroup) throws AtlasException {
    for (Field subField : fieldGroup.getField()) {
        if (subField instanceof FieldGroup) {
            processActionForEachCollectionItem(action, processor, sourceType, (FieldGroup) subField);
            continue;
        }
        Object value = subField.getValue();
        if (value != null && isAssignableFieldType(processor.getActionDetail().getSourceType(), sourceType)) {
            value = getConversionService().convertType(value, sourceType, processor.getActionDetail().getSourceType());
        }
        value = processor.process(action, value);
        subField.setValue(value);
    }
    return fieldGroup;
}
Also used : Field(io.atlasmap.v2.Field) SimpleField(io.atlasmap.v2.SimpleField) FieldGroup(io.atlasmap.v2.FieldGroup)

Example 30 with FieldGroup

use of io.atlasmap.v2.FieldGroup in project atlasmap by atlasmap.

the class DefaultAtlasFieldActionService method doExtractValuesForExpressionAction.

private void doExtractValuesForExpressionAction(List<Field> fields, List<Object> values) {
    for (Field subField : fields) {
        Object subValue = null;
        if (subField instanceof FieldGroup) {
            List<Object> subValues = new ArrayList<>();
            doExtractValuesForExpressionAction(((FieldGroup) subField).getField(), subValues);
            subValue = subValues;
        } else {
            subValue = subField.getValue();
        }
        Integer index = subField.getIndex();
        if (index != null) {
            while (index >= values.size()) {
                values.add(null);
            }
            values.set(index, subValue);
        } else {
            values.add(subValue);
        }
    }
}
Also used : Field(io.atlasmap.v2.Field) SimpleField(io.atlasmap.v2.SimpleField) FieldGroup(io.atlasmap.v2.FieldGroup) ArrayList(java.util.ArrayList)

Aggregations

FieldGroup (io.atlasmap.v2.FieldGroup)110 Field (io.atlasmap.v2.Field)89 Test (org.junit.jupiter.api.Test)48 SimpleField (io.atlasmap.v2.SimpleField)32 AtlasPath (io.atlasmap.core.AtlasPath)28 ArrayList (java.util.ArrayList)24 AtlasInternalSession (io.atlasmap.spi.AtlasInternalSession)17 CsvField (io.atlasmap.csv.v2.CsvField)16 AtlasException (io.atlasmap.api.AtlasException)15 Audits (io.atlasmap.v2.Audits)14 KafkaConnectField (io.atlasmap.kafkaconnect.v2.KafkaConnectField)13 ConstantField (io.atlasmap.v2.ConstantField)13 Head (io.atlasmap.spi.AtlasInternalSession.Head)12 JsonField (io.atlasmap.json.v2.JsonField)11 Mapping (io.atlasmap.v2.Mapping)11 PropertyField (io.atlasmap.v2.PropertyField)11 JavaField (io.atlasmap.java.v2.JavaField)10 XmlField (io.atlasmap.xml.v2.XmlField)9 SegmentContext (io.atlasmap.core.AtlasPath.SegmentContext)8 LinkedList (java.util.LinkedList)8