Search in sources :

Example 51 with Operand

use of com.dexels.navajo.document.Operand in project navajo by Dexels.

the class ScriptCompiler method processDependencies.

private Set<String> processDependencies(List<Dependency> dependencies) {
    Set<String> dependentResources = new HashSet<>();
    for (Dependency d : dependencies) {
        if ("resource".equals(d.getType()) && (d instanceof AdapterFieldDependency)) {
            final AdapterFieldDependency adapterFieldDep = (AdapterFieldDependency) d;
            logger.info("ID: {}. It's an aadapter field. with multiple: {} type {}", adapterFieldDep.getId(), adapterFieldDep.hasMultipleDependencies(), adapterFieldDep.getClass());
            Operand op = expressionEvaluator.evaluate(adapterFieldDep.getId(), null, Optional.empty(), Optional.empty());
            if (op != null && op.value instanceof String) {
                logger.debug("Succeeded evaluation of id: {}", ((String) op.value));
                dependentResources.add((String) op.value);
            }
            logger.info("Resource dependency detected: {} type: {} dependency id: {}", d.getClass().getName(), d.getType(), d.getId());
            Dependency[] subs = adapterFieldDep.getMultipleDependencies();
            if (subs != null) {
                for (Dependency dependency : subs) {
                    logger.info("Nested dependency detected: {}, type {}", dependency.getClass().getName(), dependency.getType());
                }
            }
        }
    }
    return dependentResources;
}
Also used : AdapterFieldDependency(com.dexels.navajo.mapping.compiler.meta.AdapterFieldDependency) Operand(com.dexels.navajo.document.Operand) ExtendDependency(com.dexels.navajo.mapping.compiler.meta.ExtendDependency) AdapterFieldDependency(com.dexels.navajo.mapping.compiler.meta.AdapterFieldDependency) IncludeDependency(com.dexels.navajo.mapping.compiler.meta.IncludeDependency) Dependency(com.dexels.navajo.script.api.Dependency) HashSet(java.util.HashSet)

Example 52 with Operand

use of com.dexels.navajo.document.Operand in project navajo by Dexels.

the class FunctionInterface method operandWithType.

public Object operandWithType(int index, String type) {
    Operand d = operand(index);
    if (d.value == null) {
        return null;
    }
    if (d.type.equals(type)) {
        return d.value;
    }
    Object value = d.value;
    Class<?> valueClass = value == null ? null : value.getClass();
    throw new TMLExpressionException("Illegal operand type operand (index = " + index + ") should be of type: " + type + " but was of type: " + d.type + " the value class is: " + valueClass);
}
Also used : Operand(com.dexels.navajo.document.Operand)

Example 53 with Operand

use of com.dexels.navajo.document.Operand in project navajo by Dexels.

the class ASTMappableNode method interpretToLambda.

@Override
public ContextExpression interpretToLambda(List<String> problems, String expression, Function<String, FunctionClassification> functionClassifier, Function<String, Optional<Node>> mapResolver) {
    Optional<Node> resolved = mapResolver.apply(val);
    if (resolved.isPresent()) {
        return resolved.get().interpretToLambda(problems, expression, functionClassifier, mapResolver);
    }
    return new ContextExpression() {

        @Override
        public boolean isLiteral() {
            return false;
        }

        @Override
        public Operand apply(Navajo doc, Message parentMsg, Message parentParamMsg, Selection parentSel, MappableTreeNode mapNode, TipiLink tipiLink, Access access, Optional<ImmutableMessage> immutableMessage, Optional<ImmutableMessage> paramMessage) {
            if (mapNode == null) {
                throw new TMLExpressionException("No known mapobject resolver");
            }
            // MappableTreeNode mapNode = mapNodeResolver.apply(val);
            // if(mapNode==null) {
            // throw new TMLExpressionException("No known mapobject");
            // 
            // }
            // if(mapNode==null) {
            // Node resolvedItem = mapResolver.get().apply(val);
            // System.err.println(">> "+resolvedItem.getClass());
            // resolvedItem.interpretToLambda(problems, expression, functionClassifier, mapResolver);
            // 
            // }
            List objects = null;
            // Parameter array may contain parameters that are used when calling the get method.
            Object[] parameterArray = null;
            if (args > 0) {
                objects = new ArrayList();
            }
            for (int i = 0; i < args; i++) {
                List<String> problems = new ArrayList<>();
                Operand a = jjtGetChild(i).interpretToLambda(problems, expression, functionClassifier, mapResolver).apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage);
                if (!problems.isEmpty()) {
                    throw new TMLExpressionException(problems, expression);
                }
                if (objects != null) {
                    objects.add(a.value);
                }
            }
            // List<String> problems
            if (objects != null) {
                parameterArray = new Object[objects.size()];
                parameterArray = objects.toArray(parameterArray);
            }
            try {
                Object oValue = maybeGetMapAttribute(val, mapNode, parameterArray);
                if (oValue == null)
                    return Operand.NULL;
                else if (oValue instanceof Float) {
                    return Operand.ofFloat(((Float) oValue).doubleValue());
                } else if (oValue instanceof Long) {
                    return Operand.ofLong(((Long) oValue).longValue());
                } else {
                    return Operand.ofDynamic(oValue);
                }
            } catch (Exception me) {
                throw new TMLExpressionException(me.getMessage(), me);
            }
        }

        @Override
        public Optional<String> returnType() {
            return Optional.empty();
        }

        @Override
        public String expression() {
            return expression;
        }
    };
}
Also used : MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) Message(com.dexels.navajo.document.Message) ImmutableMessage(com.dexels.immutable.api.ImmutableMessage) Optional(java.util.Optional) Selection(com.dexels.navajo.document.Selection) Operand(com.dexels.navajo.document.Operand) MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) ContextExpression(com.dexels.navajo.expression.api.ContextExpression) Access(com.dexels.navajo.script.api.Access) ArrayList(java.util.ArrayList) Navajo(com.dexels.navajo.document.Navajo) TMLExpressionException(com.dexels.navajo.expression.api.TMLExpressionException) TMLExpressionException(com.dexels.navajo.expression.api.TMLExpressionException) TipiLink(com.dexels.navajo.expression.api.TipiLink) ArrayList(java.util.ArrayList) List(java.util.List)

Example 54 with Operand

use of com.dexels.navajo.document.Operand in project navajo by Dexels.

the class ASTTmlNode method interpretToLambda.

@Override
public final ContextExpression interpretToLambda(List<String> problems, String expression, Function<String, FunctionClassification> functionClassifier, Function<String, Optional<Node>> mapResolver) {
    return new ContextExpression() {

        @Override
        public boolean isLiteral() {
            return false;
        }

        @Override
        public Operand apply(Navajo doc, Message parentMsg, Message parentParamMsg, Selection parentSel, MappableTreeNode mapNode, TipiLink tipiLink, Access access, Optional<ImmutableMessage> immutableMessage, Optional<ImmutableMessage> paramMessage) {
            List<Property> match = null;
            List<Object> resultList = new ArrayList<>();
            boolean singleMatch = true;
            if (val.equals("[") || val.equals("[/")) {
                return immutableMessage.map(msg -> Operand.ofImmutable(msg)).orElse(parentMsg != null ? Operand.ofMessage(parentMsg) : Operand.NULL);
            }
            String[] parts = val.split("\\|");
            String text = parts.length > 1 ? parts[1] : val;
            boolean isParam = false;
            Property prop = null;
            if (parentSel != null) {
                String dum = text;
                if (dum.length() > 1 && dum.startsWith("[")) {
                    dum = dum.substring(1, dum.length());
                }
                if (dum.equals("name") || selectionOption.equals("name")) {
                    return Operand.ofString(parentSel.getName());
                } else if (dum.equals("value") || selectionOption.equals("value")) {
                    return Operand.ofString(parentSel.getValue());
                } else if (dum.equals("selected") || selectionOption.equals("selected")) {
                    return Operand.ofBoolean(parentSel.isSelected());
                }
            }
            if (!exists) {
                if (text.startsWith("[")) {
                    text = text.substring(1, text.length());
                }
            } else {
                if (text.startsWith("?[")) {
                    text = text.substring(2, text.length());
                }
            }
            if (text.length() > 0 && text.charAt(0) == '@') {
                // relative param property.
                isParam = true;
                text = text.substring(1);
            }
            if (text.startsWith("/@")) {
                // Absolute param property, exclude the '[/@]' expression
                isParam = true;
                if (!text.equals("/@")) {
                    parentParamMsg = doc.getMessage("__parms__");
                    text = text.substring(2);
                }
            }
            if (text.contains("__globals__")) {
                // Absolute globals property.
                parentMsg = doc.getMessage("__globals__");
                int length = "__globals__".length();
                if (text.startsWith("/")) {
                    length += 1;
                }
                // trailing /
                length += 1;
                text = text.substring(length);
            }
            if (Util.isRegularExpression(text))
                singleMatch = false;
            else
                singleMatch = true;
            try {
                if (!isParam && immutableMessage != null && immutableMessage.isPresent()) {
                    ImmutableMessage rm = immutableMessage.get();
                    return parseImmutablePath(text, rm);
                }
                if (isParam && paramMessage != null && paramMessage.isPresent()) {
                    ImmutableMessage rm = paramMessage.get();
                    return parseImmutablePath(text, rm);
                }
                if (parentMsg == null && !isParam) {
                    if (text.indexOf(Navajo.MESSAGE_SEPARATOR) != -1) {
                        if (doc == null) {
                            throw new NullPointerException("Can't evaluate TML node: No parent message and no document found.");
                        }
                        match = doc.getProperties(text);
                        if (match.size() > 1) {
                            singleMatch = false;
                        }
                    } else {
                        throw new TMLExpressionException("No parent message present for property: " + text + " -> " + ImmutableFactory.getInstance().describe(immutableMessage.orElse(ImmutableFactory.empty())));
                    }
                } else if (parentParamMsg == null && isParam) {
                    parentParamMsg = doc.getMessage("__parms__");
                    if (text.indexOf(Navajo.MESSAGE_SEPARATOR) != -1) {
                        match = doc.getProperties(text);
                        if (match.size() > 1) {
                            singleMatch = false;
                        }
                    } else
                        throw new TMLExpressionException("No parent message present for param: " + text);
                } else {
                    if (text.indexOf(Navajo.MESSAGE_SEPARATOR) != -1) {
                        match = (!isParam ? parentMsg.getProperties(text) : parentParamMsg.getProperties(text));
                        if (match.size() > 1)
                            singleMatch = false;
                    } else {
                        match = new ArrayList<>();
                        match.add((!isParam ? parentMsg.getProperty(text) : parentParamMsg.getProperty(text)));
                    }
                }
            } catch (NavajoException te) {
                throw new TMLExpressionException(te.getMessage(), te);
            }
            for (int j = 0; j < match.size(); j++) {
                prop = (Property) match.get(j);
                if (!exists && (prop == null))
                    if (parentMsg != null) {
                        throw new TMLExpressionException("TML property does not exist: " + text + " parent message: " + parentMsg.getFullMessageName());
                    } else {
                        throw new TMLExpressionException("TML property does not exist: " + text + " exists? " + exists);
                    }
                else if (exists) {
                    // Check for existence and datatype validity.
                    if (prop != null) {
                        // Check type. If integer, float or date type and if is empty
                        String type = prop.getType();
                        // of binary properties. Should be equivalent, and MUCH faster.
                        if (prop.getTypedValue() == null && !type.equals(Property.SELECTION_PROPERTY)) {
                            return Operand.FALSE;
                        }
                        if (type.equals(Property.INTEGER_PROPERTY)) {
                            try {
                                Integer.parseInt(prop.getValue());
                                return Operand.TRUE;
                            } catch (Exception e) {
                                return Operand.FALSE;
                            }
                        } else if (type.equals(Property.FLOAT_PROPERTY)) {
                            try {
                                Double.parseDouble(prop.getValue());
                                return Operand.TRUE;
                            } catch (Exception e) {
                                return Operand.FALSE;
                            }
                        } else if (type.equals(Property.DATE_PROPERTY)) {
                            try {
                                if (prop.getTypedValue() instanceof Date) {
                                    return Operand.TRUE;
                                } else {
                                    return Operand.FALSE;
                                }
                            } catch (Exception e) {
                                return Operand.FALSE;
                            }
                        } else if (type.equals(Property.CLOCKTIME_PROPERTY)) {
                            try {
                                ClockTime ct = new ClockTime(prop.getValue());
                                if (ct.calendarValue() == null) {
                                    return Operand.FALSE;
                                }
                                return Operand.TRUE;
                            } catch (Exception e) {
                                return Operand.FALSE;
                            }
                        } else
                            return Operand.TRUE;
                    } else
                        return Operand.FALSE;
                }
                String type = prop.getType();
                Object value = prop.getTypedValue();
                /**
                 * LEGACY MODE!
                 */
                if (value instanceof NavajoType && ((NavajoType) value).isEmpty()) {
                    value = null;
                }
                if (value == null && !type.equals(Property.SELECTION_PROPERTY)) {
                    // If value attribute does not exist AND property is not selection property assume null value
                    resultList.add(null);
                } else if (type.equals(Property.SELECTION_PROPERTY)) {
                    if (!prop.getCardinality().equals("+")) {
                        // Uni-selection property.
                        try {
                            List<Selection> list = prop.getAllSelectedSelections();
                            if (!list.isEmpty()) {
                                Selection sel = list.get(0);
                                resultList.add((selectionOption.equals("name") ? sel.getName() : sel.getValue()));
                            } else {
                                return Operand.NULL;
                            }
                        } catch (com.dexels.navajo.document.NavajoException te) {
                            throw new TMLExpressionException(te.getMessage());
                        }
                    } else {
                        // Multi-selection property.
                        try {
                            List<Selection> list = prop.getAllSelectedSelections();
                            List<Object> result = new ArrayList<>();
                            for (int i = 0; i < list.size(); i++) {
                                Selection sel = list.get(i);
                                Object o = (selectionOption.equals("name")) ? sel.getName() : sel.getValue();
                                result.add(o);
                            }
                            resultList.add(result);
                        } catch (NavajoException te) {
                            throw new TMLExpressionException(te.getMessage(), te);
                        }
                    }
                } else if (type.equals(Property.DATE_PROPERTY)) {
                    if (value == null)
                        resultList.add(null);
                    else {
                        if (!option.equals("")) {
                            try {
                                Date a = (Date) prop.getTypedValue();
                                Calendar cal = Calendar.getInstance();
                                cal.setTime(a);
                                int altA = 0;
                                if (option.equals("month")) {
                                    altA = cal.get(Calendar.MONTH) + 1;
                                } else if (option.equals("day")) {
                                    altA = cal.get(Calendar.DAY_OF_MONTH);
                                } else if (option.equals("year")) {
                                    altA = cal.get(Calendar.YEAR);
                                } else if (option.equals("hour")) {
                                    altA = cal.get(Calendar.HOUR_OF_DAY);
                                } else if (option.equals("minute")) {
                                    altA = cal.get(Calendar.MINUTE);
                                } else if (option.equals("second")) {
                                    altA = cal.get(Calendar.SECOND);
                                } else {
                                    throw new TMLExpressionException("Option not supported: " + option + ", for type: " + type);
                                }
                                resultList.add(altA);
                            } catch (Exception ue) {
                                throw new TMLExpressionException("Invalid date: " + prop.getValue(), ue);
                            }
                        } else {
                            try {
                                Date a = (Date) prop.getTypedValue();
                                resultList.add(a);
                            } catch (java.lang.Exception pe) {
                                resultList.add(null);
                            }
                        }
                    }
                } else if (type.equals(Property.EXPRESSION_PROPERTY)) {
                    resultList.add(prop.getTypedValue());
                } else {
                    try {
                        resultList.add(value);
                    } catch (Exception e) {
                        throw new TMLExpressionException(e.getMessage(), e);
                    }
                }
            }
            if (!singleMatch)
                return Operand.ofList(resultList);
            else if (!resultList.isEmpty())
                return Operand.ofDynamic(resultList.get(0));
            else if (!exists)
                throw new TMLExpressionException("Property does not exist: " + text);
            else
                return Operand.FALSE;
        }

        private Operand parseImmutablePath(String text, ImmutableMessage rm) {
            if ("".equals(text) || "/@".equals(text)) {
                return Operand.ofImmutable(rm);
            }
            if (text.endsWith("/")) {
                String trunc = text.substring(0, text.length() - 1);
                List<String> parts = Arrays.asList(trunc.split("/"));
                return parseImmutableMessagePath(parts, rm);
            }
            List<String> parts = Arrays.asList(text.split("/"));
            return parseImmutablePath(parts, rm);
        }

        private Operand parseImmutableMessagePath(List<String> path, ImmutableMessage rm) {
            if (path.isEmpty()) {
                return Operand.ofImmutable(rm);
            }
            String first = path.get(0);
            Optional<ImmutableMessage> sub = rm.subMessage(first);
            if (!sub.isPresent()) {
                throw new TMLExpressionException("Missing submessage: " + first);
            }
            List<String> copy = new ArrayList<>(path);
            copy.remove(0);
            return parseImmutableMessagePath(copy, sub.get());
        }

        private Operand parseImmutablePath(List<String> path, ImmutableMessage rm) {
            if (path.size() > 1) {
                Optional<ImmutableMessage> imm = rm.subMessage(path.get(0));
                if (imm.isPresent()) {
                    List<String> parts = new LinkedList<>(path);
                    parts.remove(0);
                    return parseImmutablePath(parts, imm.get());
                }
                return null;
            }
            String type = rm.columnType(path.get(0));
            if (type != null) {
                return Operand.ofCustom(rm.value(path.get(0)).orElse(null), type);
            }
            return Operand.ofDynamic(rm.value(path.get(0)).orElse(null));
        }

        @Override
        public Optional<String> returnType() {
            return Optional.empty();
        }

        @Override
        public String expression() {
            return expression;
        }
    };
}
Also used : Arrays(java.util.Arrays) Date(java.util.Date) NavajoException(com.dexels.navajo.document.NavajoException) Function(java.util.function.Function) ArrayList(java.util.ArrayList) ClockTime(com.dexels.navajo.document.types.ClockTime) TMLExpressionException(com.dexels.navajo.expression.api.TMLExpressionException) Util(com.dexels.navajo.util.Util) Calendar(java.util.Calendar) Operand(com.dexels.navajo.document.Operand) Selection(com.dexels.navajo.document.Selection) LinkedList(java.util.LinkedList) ImmutableMessage(com.dexels.immutable.api.ImmutableMessage) Navajo(com.dexels.navajo.document.Navajo) TipiLink(com.dexels.navajo.expression.api.TipiLink) Access(com.dexels.navajo.script.api.Access) NavajoType(com.dexels.navajo.document.types.NavajoType) Message(com.dexels.navajo.document.Message) ContextExpression(com.dexels.navajo.expression.api.ContextExpression) ImmutableFactory(com.dexels.immutable.factory.ImmutableFactory) List(java.util.List) FunctionClassification(com.dexels.navajo.expression.api.FunctionClassification) Optional(java.util.Optional) Property(com.dexels.navajo.document.Property) MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) ImmutableMessage(com.dexels.immutable.api.ImmutableMessage) Message(com.dexels.navajo.document.Message) Selection(com.dexels.navajo.document.Selection) Access(com.dexels.navajo.script.api.Access) ArrayList(java.util.ArrayList) TMLExpressionException(com.dexels.navajo.expression.api.TMLExpressionException) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) Property(com.dexels.navajo.document.Property) Optional(java.util.Optional) NavajoType(com.dexels.navajo.document.types.NavajoType) ContextExpression(com.dexels.navajo.expression.api.ContextExpression) Calendar(java.util.Calendar) NavajoException(com.dexels.navajo.document.NavajoException) Navajo(com.dexels.navajo.document.Navajo) ClockTime(com.dexels.navajo.document.types.ClockTime) NavajoException(com.dexels.navajo.document.NavajoException) TMLExpressionException(com.dexels.navajo.expression.api.TMLExpressionException) Date(java.util.Date) LinkedList(java.util.LinkedList) TipiLink(com.dexels.navajo.expression.api.TipiLink) ImmutableMessage(com.dexels.immutable.api.ImmutableMessage)

Example 55 with Operand

use of com.dexels.navajo.document.Operand in project navajo by Dexels.

the class ExpressionCache method parse.

public ContextExpression parse(List<String> problems, String expression, Function<String, FunctionClassification> functionClassifier, Function<String, Optional<Node>> mapResolver) {
    Optional<ContextExpression> cachedParsedExpression = exprCache.getUnchecked(expression);
    if (cachedParsedExpression.isPresent()) {
        hitCount.incrementAndGet();
        return cachedParsedExpression.get();
    }
    CompiledParser cp;
    try {
        StringReader sr = new StringReader(expression);
        cp = new CompiledParser(sr);
        cp.Expression();
        ContextExpression parsed = cp.getJJTree().rootNode().interpretToLambda(problems, expression, functionClassifier, mapResolver);
        parsedCount.incrementAndGet();
        if (parsed.isLiteral()) {
            Operand result = parsed.apply();
            exprCache.put(expression, Optional.ofNullable(parsed));
            if (result != null) {
                expressionValueCache.put(expression, Optional.of(result));
            }
            return new ContextExpression() {

                @Override
                public boolean isLiteral() {
                    return true;
                }

                @Override
                public Operand apply(Navajo doc, Message parentMsg, Message parentParamMsg, Selection parentSel, MappableTreeNode mapNode, TipiLink tipiLink, Access access, Optional<ImmutableMessage> immutableMessage, Optional<ImmutableMessage> paramMessage) {
                    return result;
                }

                @Override
                public Optional<String> returnType() {
                    return Optional.ofNullable(result.type);
                }

                @Override
                public String expression() {
                    return expression;
                }
            };
        } else {
            exprCache.put(expression, Optional.ofNullable(parsed));
            return parsed;
        }
    } catch (ParseException e) {
        throw new TMLExpressionException("Error parsing expression: " + expression, e);
    } catch (Throwable e) {
        throw new TMLExpressionException("Unexpected error parsing expression: " + expression, e);
    }
}
Also used : MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) ImmutableMessage(com.dexels.immutable.api.ImmutableMessage) Message(com.dexels.navajo.document.Message) Optional(java.util.Optional) Operand(com.dexels.navajo.document.Operand) Selection(com.dexels.navajo.document.Selection) ContextExpression(com.dexels.navajo.expression.api.ContextExpression) Access(com.dexels.navajo.script.api.Access) Navajo(com.dexels.navajo.document.Navajo) TMLExpressionException(com.dexels.navajo.expression.api.TMLExpressionException) CompiledParser(com.dexels.navajo.parser.compiled.CompiledParser) TipiLink(com.dexels.navajo.expression.api.TipiLink) StringReader(java.io.StringReader) ParseException(com.dexels.navajo.parser.compiled.ParseException)

Aggregations

Operand (com.dexels.navajo.document.Operand)95 Test (org.junit.Test)57 Message (com.dexels.navajo.document.Message)22 ImmutableMessage (com.dexels.immutable.api.ImmutableMessage)20 Navajo (com.dexels.navajo.document.Navajo)20 TMLExpressionException (com.dexels.navajo.expression.api.TMLExpressionException)15 ContextExpression (com.dexels.navajo.expression.api.ContextExpression)14 ArrayList (java.util.ArrayList)12 Selection (com.dexels.navajo.document.Selection)11 Property (com.dexels.navajo.document.Property)10 FunctionInterface (com.dexels.navajo.expression.api.FunctionInterface)10 Access (com.dexels.navajo.script.api.Access)10 MappableTreeNode (com.dexels.navajo.script.api.MappableTreeNode)10 NavajoException (com.dexels.navajo.document.NavajoException)9 TipiLink (com.dexels.navajo.expression.api.TipiLink)9 Optional (java.util.Optional)9 FunctionDefinition (com.dexels.navajo.expression.api.FunctionDefinition)8 GiveLongTestFunction (com.dexels.navajo.expression.compiled.GiveLongTestFunction)6 SystemException (com.dexels.navajo.script.api.SystemException)6 List (java.util.List)6