Search in sources :

Example 1 with Navajo

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

the class ASTReactiveScriptNode method interpretToLambda.

@Override
public ContextExpression interpretToLambda(List<String> problems, String originalExpression, Function<String, FunctionClassification> functionClassifier, Function<String, Optional<Node>> mapResolver) {
    int start = hasHeader ? headers : 0;
    if (hasHeader) {
        for (int i = 0; i < headers; i++) {
            ASTKeyValueNode hdr = (ASTKeyValueNode) jjtGetChild(i);
            NamedExpression ne = (NamedExpression) hdr.interpretToLambda(problems, originalExpression, functionClassifier, mapResolver);
            String key = ne.name;
            headerMap.put(key, ne.apply());
        }
    }
    int count = jjtGetNumChildren();
    List<Node> unnamedPipes = new ArrayList<>();
    Map<String, Node> namedPipes = new HashMap<>();
    for (int i = start; i < count; i++) {
        Node child = jjtGetChild(i);
        // ASTReactivePipe pipe = null;
        if (child instanceof ASTPipeDefinition) {
            unnamedPipes.add((ASTPipeDefinition) child);
        } else if (child instanceof ASTKeyValueNode) {
            ASTKeyValueNode kvNode = (ASTKeyValueNode) child;
            String streamName = kvNode.val;
            Node namedPipe = kvNode.jjtGetChild(0);
            // assert value types perhaps? TODO
            namedPipes.put(streamName, namedPipe);
        }
    }
    List<ReactivePipeNode> pipes = unnamedPipes.stream().map(p -> (ReactivePipeNode) p.interpretToLambda(problems, originalExpression, functionClassifier, name -> {
        Optional<Node> initial = Optional.ofNullable(namedPipes.get(name));
        if (initial.isPresent()) {
            return initial;
        } else {
            return mapResolver.apply(name);
        }
    })).collect(Collectors.toList());
    return new ContextExpression() {

        @Override
        public Optional<String> returnType() {
            return Optional.of(Reactive.ReactiveItemType.REACTIVE_SCRIPT.toString());
        }

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

        @Override
        public String expression() {
            return "";
        }

        @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 Operand.ofCustom(pipes, Reactive.ReactiveItemType.REACTIVE_SCRIPT.toString());
        }
    };
}
Also used : TipiLink(com.dexels.navajo.expression.api.TipiLink) Arrays(java.util.Arrays) Access(com.dexels.navajo.script.api.Access) Message(com.dexels.navajo.document.Message) Reactive(com.dexels.navajo.reactive.api.Reactive) HashMap(java.util.HashMap) Function(java.util.function.Function) Collectors(java.util.stream.Collectors) ContextExpression(com.dexels.navajo.expression.api.ContextExpression) ArrayList(java.util.ArrayList) List(java.util.List) Operand(com.dexels.navajo.document.Operand) Selection(com.dexels.navajo.document.Selection) FunctionClassification(com.dexels.navajo.expression.api.FunctionClassification) NamedExpression(com.dexels.navajo.parser.NamedExpression) ReactivePipeNode(com.dexels.navajo.parser.compiled.api.ReactivePipeNode) Map(java.util.Map) Optional(java.util.Optional) ImmutableMessage(com.dexels.immutable.api.ImmutableMessage) Collections(java.util.Collections) MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) Navajo(com.dexels.navajo.document.Navajo) MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) Optional(java.util.Optional) Message(com.dexels.navajo.document.Message) ImmutableMessage(com.dexels.immutable.api.ImmutableMessage) HashMap(java.util.HashMap) Selection(com.dexels.navajo.document.Selection) ReactivePipeNode(com.dexels.navajo.parser.compiled.api.ReactivePipeNode) MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) ContextExpression(com.dexels.navajo.expression.api.ContextExpression) ArrayList(java.util.ArrayList) Access(com.dexels.navajo.script.api.Access) Navajo(com.dexels.navajo.document.Navajo) ReactivePipeNode(com.dexels.navajo.parser.compiled.api.ReactivePipeNode) TipiLink(com.dexels.navajo.expression.api.TipiLink) NamedExpression(com.dexels.navajo.parser.NamedExpression)

Example 2 with Navajo

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

the class DefaultExpressionEvaluator method createUpdateQueue.

private final List<Property> createUpdateQueue(Map<Property, List<Property>> mm) throws NavajoException {
    Map<Property, List<Property>> dependencyMap = duplicateDependencyMap(mm);
    Set<Property> propKeys = dependencyMap.keySet();
    List<Property> queue = new ArrayList<Property>();
    Navajo first = null;
    while (dependencyMap.size() > 0) {
        for (Iterator<Property> iter = propKeys.iterator(); iter.hasNext(); ) {
            Property item = iter.next();
            if (first == null) {
                first = item.getRootDoc();
            }
            if (!Property.EXPRESSION_PROPERTY.equals(item.getType())) {
                if (!queue.contains(item)) {
                    queue.add(item);
                }
                dependencyMap.remove(item);
                break;
            }
            List<Property> deps = dependencyMap.get(item);
            if (deps == null) {
                if (!queue.contains(item)) {
                    queue.add(item);
                }
                dependencyMap.remove(item);
                break;
            }
            if (!containsExpressions(deps)) {
                if (!queue.contains(item)) {
                    queue.add(item);
                }
                dependencyMap.remove(item);
                break;
            }
            if (queue.containsAll(deps)) {
                if (!queue.contains(item)) {
                    queue.add(item);
                }
                dependencyMap.remove(item);
                break;
            }
            try {
                addExpressionToQueue(item, dependencyMap, queue);
                break;
            } catch (ExpressionDependencyException ex1) {
                logger.info("Did not succeed adding. Continuing", ex1);
            }
        }
    }
    // UUUUUUUUUUUGLY: MAKE SURE EVERY SINGLE ONE GETS ADDED
    if (first != null) {
        queue.addAll(getExpressionList(first));
    }
    return queue;
}
Also used : ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) Navajo(com.dexels.navajo.document.Navajo) Property(com.dexels.navajo.document.Property)

Example 3 with Navajo

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

the class ASTDatePatternNode method interpretToLambda.

@Override
public ContextExpression interpretToLambda(List<String> problems, String expression, Function<String, FunctionClassification> functionClassifier, Function<String, Optional<Node>> mapResolver) {
    ContextExpression y = jjtGetChild(0).interpretToLambda(problems, expression, functionClassifier, mapResolver);
    checkOrAdd("Year (item 0) field should be an integer", problems, y.returnType(), Property.INTEGER_PROPERTY);
    ContextExpression m = jjtGetChild(1).interpretToLambda(problems, expression, functionClassifier, mapResolver);
    checkOrAdd("Month (item 1) field should be an integer", problems, y.returnType(), Property.INTEGER_PROPERTY);
    ContextExpression d = jjtGetChild(2).interpretToLambda(problems, expression, functionClassifier, mapResolver);
    checkOrAdd("Day (item 2) field should be an integer", problems, y.returnType(), Property.INTEGER_PROPERTY);
    ContextExpression h = jjtGetChild(3).interpretToLambda(problems, expression, functionClassifier, mapResolver);
    checkOrAdd("Hour (item 3) field should be an integer", problems, y.returnType(), Property.INTEGER_PROPERTY);
    ContextExpression min = jjtGetChild(4).interpretToLambda(problems, expression, functionClassifier, mapResolver);
    checkOrAdd("Minute (item 4) field should be an integer", problems, y.returnType(), Property.INTEGER_PROPERTY);
    ContextExpression s = jjtGetChild(5).interpretToLambda(problems, expression, functionClassifier, mapResolver);
    checkOrAdd("Second (item 5) field should be an integer", problems, y.returnType(), Property.INTEGER_PROPERTY);
    final boolean isLiteral = y.isLiteral() && m.isLiteral() && d.isLiteral() && h.isLiteral() && min.isLiteral() && s.isLiteral();
    return new ContextExpression() {

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

        @Override
        public Operand apply(Navajo doc, Message parentMsg, Message parentParamMsg, Selection parentSel, MappableTreeNode mapNode, TipiLink tipiLink, Access access, Optional<ImmutableMessage> immutableMessage, Optional<ImmutableMessage> paramMessage) {
            int yearT = ((Integer) y.apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage).value).intValue();
            int monthT = ((Integer) m.apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage).value).intValue();
            int dayT = ((Integer) d.apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage).value).intValue();
            int hourT = ((Integer) h.apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage).value).intValue();
            int minT = ((Integer) min.apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage).value).intValue();
            int secT = ((Integer) s.apply(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage).value).intValue();
            return Operand.ofDatePattern(new DatePattern(yearT, monthT, dayT, hourT, minT, secT, true));
        }

        @Override
        public Optional<String> returnType() {
            return Optional.of(Property.DATE_PATTERN_PROPERTY);
        }

        @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) ContextExpression(com.dexels.navajo.expression.api.ContextExpression) Access(com.dexels.navajo.script.api.Access) Navajo(com.dexels.navajo.document.Navajo) TipiLink(com.dexels.navajo.expression.api.TipiLink) DatePattern(com.dexels.navajo.document.types.DatePattern)

Example 4 with Navajo

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

the class ASTForAllNode method interpretToLambda.

@Override
public 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<String> problems = new ArrayList<>();
            ContextExpression a = jjtGetChild(0).interpretToLambda(problems, expression, functionClassifier, mapResolver);
            ContextExpression b = jjtGetChild(1).interpretToLambda(problems, expression, functionClassifier, mapResolver);
            if (!problems.isEmpty()) {
                throw new TMLExpressionException(problems, expression);
            }
            return interpret(doc, parentMsg, parentParamMsg, parentSel, mapNode, tipiLink, access, immutableMessage, paramMessage, a, b);
        }

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

        @Override
        public String expression() {
            return expression;
        }
    };
}
Also used : MappableTreeNode(com.dexels.navajo.script.api.MappableTreeNode) TipiLink(com.dexels.navajo.expression.api.TipiLink) Message(com.dexels.navajo.document.Message) ImmutableMessage(com.dexels.immutable.api.ImmutableMessage) Optional(java.util.Optional) Selection(com.dexels.navajo.document.Selection) 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)

Example 5 with Navajo

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

the class XMLutils method createNavajoInstance.

public static Navajo createNavajoInstance(String filename) throws IOException {
    Document d = null;
    Navajo navajo = null;
    try (FileInputStream input = new FileInputStream(new File(filename))) {
        d = XMLDocumentUtils.createDocument(input, false);
        d.getDocumentElement().normalize();
        navajo = NavajoFactory.getInstance().createNavajo(d);
    }
    return navajo;
}
Also used : Navajo(com.dexels.navajo.document.Navajo) Document(org.w3c.dom.Document) File(java.io.File) FileInputStream(java.io.FileInputStream)

Aggregations

Navajo (com.dexels.navajo.document.Navajo)258 Message (com.dexels.navajo.document.Message)131 Test (org.junit.Test)109 Property (com.dexels.navajo.document.Property)86 NavajoException (com.dexels.navajo.document.NavajoException)31 Access (com.dexels.navajo.script.api.Access)30 IOException (java.io.IOException)28 StringWriter (java.io.StringWriter)27 TMLExpressionException (com.dexels.navajo.expression.api.TMLExpressionException)26 FunctionInterface (com.dexels.navajo.expression.api.FunctionInterface)25 ImmutableMessage (com.dexels.immutable.api.ImmutableMessage)22 Selection (com.dexels.navajo.document.Selection)22 Header (com.dexels.navajo.document.Header)20 Operand (com.dexels.navajo.document.Operand)20 InputStream (java.io.InputStream)17 UserException (com.dexels.navajo.script.api.UserException)16 Optional (java.util.Optional)16 FatalException (com.dexels.navajo.script.api.FatalException)14 SystemException (com.dexels.navajo.script.api.SystemException)14 ContextExpression (com.dexels.navajo.expression.api.ContextExpression)13