Search in sources :

Example 1 with ThreadLocalNotifierClosable

use of org.matheclipse.logging.ThreadLocalNotifyingAppender.ThreadLocalNotifierClosable in project symja_android_library by axkr.

the class Pods method createResult.

public static ObjectNode createResult(String inputStr, int formats, boolean strictSymja) {
    ObjectNode messageJSON = JSON_OBJECT_MAPPER.createObjectNode();
    ObjectNode queryresult = JSON_OBJECT_MAPPER.createObjectNode();
    messageJSON.putPOJO("queryresult", queryresult);
    queryresult.put("success", "false");
    queryresult.put("error", "false");
    queryresult.put("numpods", 0);
    queryresult.put("version", "0.1");
    boolean error = false;
    int numpods = 0;
    IExpr inExpr = S.Null;
    IExpr outExpr = S.Null;
    EvalEngine engine = EvalEngine.get();
    ArrayNode podsArray = JSON_OBJECT_MAPPER.createArrayNode();
    if (strictSymja) {
        engine.setPackageMode(false);
        final ExprParser parser = new ExprParser(engine, true);
        try {
            inExpr = parser.parse(inputStr);
            if (inExpr.isPresent()) {
                long numberOfLeaves = inExpr.leafCount();
                if (numberOfLeaves < Config.MAX_INPUT_LEAVES) {
                    outExpr = inExpr;
                    final StringWriter errorWriter = new StringWriter();
                    WriterOutputStream werrors = new WriterOutputStream(errorWriter);
                    PrintStream errors = new PrintStream(werrors);
                    IExpr firstEval = F.NIL;
                    try (ThreadLocalNotifierClosable c = setLogEventNotifier(errors)) {
                        engine.setErrorPrintStream(errors);
                        firstEval = engine.evaluateNIL(inExpr);
                    } finally {
                        engine.setErrorPrintStream(null);
                    }
                    addSymjaPod(podsArray, inExpr, inExpr, "Input", "Identity", formats, engine);
                    numpods++;
                    String errorString = "";
                    if (firstEval.isPresent()) {
                        outExpr = firstEval;
                    } else {
                        errorString = errorWriter.toString().trim();
                    }
                    outExpr = engine.evaluate(inExpr);
                    if (outExpr instanceof GraphExpr) {
                        String javaScriptStr = GraphFunctions.graphToJSForm((GraphExpr) outExpr);
                        if (javaScriptStr != null) {
                            String html = VISJS_IFRAME;
                            html = StringUtils.replace(html, "`1`", javaScriptStr);
                            html = // 
                            StringUtils.replace(// 
                            html, // 
                            "`2`", // 
                            "  var options = { };\n");
                            // html = StringEscapeUtils.escapeHtml4(html);
                            int form = internFormat(SYMJA, "visjs");
                            addPod(podsArray, inExpr, outExpr, html, "Graph data", "Graph", form, engine);
                            numpods++;
                        } else {
                            addSymjaPod(podsArray, inExpr, outExpr, errorString, "Evaluated result", "Expression", formats, engine, true);
                            numpods++;
                        }
                    } else {
                        addSymjaPod(podsArray, inExpr, outExpr, errorString, "Evaluated result", "Expression", formats, engine, true);
                        numpods++;
                    }
                    resultStatistics(queryresult, error, numpods, podsArray);
                    return messageJSON;
                }
            }
        } catch (SyntaxError serr) {
            // this includes syntax errors
            LOGGER.debug("Pods.createResult() failed", serr);
            return errorJSON("0", serr.getMessage());
        }
        queryresult.put("error", error ? "true" : "false");
        return messageJSON;
    }
    inExpr = parseInput(inputStr, engine);
    if (inExpr.isPresent()) {
        long numberOfLeaves = inExpr.leafCount();
        if (numberOfLeaves < Config.MAX_INPUT_LEAVES) {
            outExpr = inExpr;
            final StringWriter errorWriter = new StringWriter();
            WriterOutputStream werrors = new WriterOutputStream(errorWriter);
            PrintStream errors = new PrintStream(werrors);
            IExpr firstEval = F.NIL;
            try (ThreadLocalNotifierClosable c = setLogEventNotifier(errors)) {
                engine.setErrorPrintStream(errors);
                firstEval = engine.evaluateNIL(inExpr);
            } finally {
                engine.setErrorPrintStream(null);
            }
            addSymjaPod(podsArray, inExpr, inExpr, "Input", "Identity", formats, engine);
            numpods++;
            String errorString = "";
            if (firstEval.isPresent()) {
                outExpr = firstEval;
            } else {
                errorString = errorWriter.toString().trim();
            }
            IExpr podOut = outExpr;
            IExpr numExpr = F.NIL;
            IExpr evaledNumExpr = F.NIL;
            if (outExpr.isNumericFunction(true)) {
                numExpr = inExpr.isAST(S.N) ? inExpr : F.N(inExpr);
                evaledNumExpr = engine.evaluate(F.N(outExpr));
            }
            if (outExpr.isNumber() || outExpr.isQuantity()) {
                if (outExpr.isInteger()) {
                    numpods += integerPods(podsArray, inExpr, (IInteger) outExpr, formats, engine);
                    resultStatistics(queryresult, error, numpods, podsArray);
                    return messageJSON;
                } else {
                    podOut = outExpr;
                    if (outExpr.isRational()) {
                        addSymjaPod(podsArray, inExpr, podOut, "Exact result", "Rational", formats, engine);
                        numpods++;
                    }
                    if (// 
                    numExpr.isPresent() && (evaledNumExpr.isInexactNumber() || evaledNumExpr.isQuantity())) {
                        addSymjaPod(podsArray, numExpr, evaledNumExpr, "Decimal form", "Numeric", formats, engine);
                        numpods++;
                        if (!outExpr.isRational()) {
                            if (evaledNumExpr.isInexactNumber()) {
                                inExpr = F.Rationalize(evaledNumExpr);
                                podOut = engine.evaluate(inExpr);
                                addSymjaPod(podsArray, inExpr, podOut, "Rational form", "Numeric", formats, engine);
                                numpods++;
                            }
                        }
                    }
                    if (outExpr.isFraction()) {
                        IFraction frac = (IFraction) outExpr;
                        if (!frac.integerPart().equals(F.C0)) {
                            inExpr = F.List(F.IntegerPart(outExpr), F.FractionalPart(outExpr));
                            podOut = engine.evaluate(inExpr);
                            String plaintext = podOut.first().toString() + " " + podOut.second().toString();
                            addSymjaPod(podsArray, inExpr, podOut, plaintext, "Mixed fraction", "Rational", formats, engine);
                            numpods++;
                            inExpr = F.ContinuedFraction(outExpr);
                            podOut = engine.evaluate(inExpr);
                            StringBuilder plainBuf = new StringBuilder();
                            if (podOut.isNonEmptyList()) {
                                IAST list = (IAST) podOut;
                                plainBuf.append('[');
                                plainBuf.append(list.arg1().toString());
                                plainBuf.append(';');
                                for (int i = 2; i < list.size(); i++) {
                                    plainBuf.append(' ');
                                    plainBuf.append(list.get(i).toString());
                                    if (i < list.size() - 1) {
                                        plainBuf.append(',');
                                    }
                                }
                                plainBuf.append(']');
                            }
                            addSymjaPod(podsArray, inExpr, podOut, plainBuf.toString(), "Continued fraction", "ContinuedFraction", formats, engine);
                            numpods++;
                        }
                    }
                    resultStatistics(queryresult, error, numpods, podsArray);
                    return messageJSON;
                }
            } else {
                if (outExpr.isAST(S.Plot, 2) && outExpr.first().isList()) {
                    outExpr = outExpr.first();
                }
                if (outExpr.isList()) {
                    IAST list = (IAST) outExpr;
                    ListPod listPod = new ListPod(list);
                    numpods += listPod.addJSON(podsArray, formats, engine);
                }
                if (// 
                numExpr.isPresent() && (evaledNumExpr.isInexactNumber() || evaledNumExpr.isQuantity())) {
                    addSymjaPod(podsArray, numExpr, evaledNumExpr, "Decimal form", "Numeric", formats, engine);
                    numpods++;
                }
                if (outExpr.isSymbol() || outExpr.isString()) {
                    String inputWord = outExpr.toString();
                    StringBuilder buf = new StringBuilder();
                    // }
                    if (outExpr.isSymbol() && Documentation.getMarkdown(buf, inputWord)) {
                        numpods += DocumentationPod.addDocumentationPod(new DocumentationPod((ISymbol) outExpr), podsArray, buf, formats);
                        resultStatistics(queryresult, error, numpods, podsArray);
                        return messageJSON;
                    } else {
                        if (outExpr.isString()) {
                            int mimeTyp = ((IStringX) outExpr).getMimeType();
                            if (mimeTyp == IStringX.APPLICATION_SYMJA || mimeTyp == IStringX.APPLICATION_JAVA || mimeTyp == IStringX.APPLICATION_JAVASCRIPT) {
                                String html = toHighligthedCode(outExpr.toString());
                                addSymjaPod(podsArray, inExpr, F.NIL, html, "Result", "String form", HTML, engine);
                                numpods++;
                                resultStatistics(queryresult, error, numpods, podsArray);
                                return messageJSON;
                            } else if (outExpr.isString()) {
                                podOut = outExpr;
                                addSymjaPod(podsArray, inExpr, podOut, "String form", "String", formats, engine);
                                numpods++;
                            }
                        }
                        ArrayList<IPod> soundsLike = listOfPods(inputWord);
                        if (soundsLike != null) {
                            boolean evaled = false;
                            for (int i = 0; i < soundsLike.size(); i++) {
                                IPod pod = soundsLike.get(i);
                                if (pod.keyWord().equalsIgnoreCase(inputWord)) {
                                    int numberOfEntries = pod.addJSON(podsArray, formats, engine);
                                    if (numberOfEntries > 0) {
                                        numpods += numberOfEntries;
                                        evaled = true;
                                        break;
                                    }
                                }
                            }
                            if (!evaled) {
                                for (int i = 0; i < soundsLike.size(); i++) {
                                    IPod pod = soundsLike.get(i);
                                    int numberOfEntries = pod.addJSON(podsArray, formats, engine);
                                    if (numberOfEntries > 0) {
                                        numpods += numberOfEntries;
                                    }
                                }
                            }
                            resultStatistics(queryresult, error, numpods, podsArray);
                            return messageJSON;
                        }
                    }
                } else {
                    if (inExpr.isAST(S.D, 2, 3)) {
                        if (inExpr.isAST1()) {
                            VariablesSet varSet = new VariablesSet(inExpr.first());
                            IAST variables = varSet.getVarList();
                            IASTAppendable result = ((IAST) inExpr).copyAppendable();
                            result.appendArgs(variables);
                            inExpr = result;
                        }
                        outExpr = engine.evaluate(inExpr);
                        podOut = outExpr;
                        addSymjaPod(podsArray, inExpr, podOut, "Derivative", "Derivative", formats, engine);
                        numpods++;
                        if (!outExpr.isFreeAST(x -> x.isTrigFunction())) {
                            inExpr = F.TrigToExp(outExpr);
                            podOut = engine.evaluate(inExpr);
                            // if (!S.PossibleZeroQ.ofQ(engine, F.Subtract(podOut, outExpr))) {
                            if (!podOut.equals(outExpr)) {
                                addSymjaPod(// 
                                podsArray, inExpr, podOut, "Alternate form", "Simplification", formats, engine);
                                numpods++;
                            }
                        }
                        resultStatistics(queryresult, error, numpods, podsArray);
                        return messageJSON;
                    } else if (inExpr.isAST(S.Integrate, 2, 3)) {
                        if (inExpr.isAST1()) {
                            VariablesSet varSet = new VariablesSet(inExpr.first());
                            IAST variables = varSet.getVarList();
                            IASTAppendable result = ((IAST) inExpr).copyAppendable();
                            result.appendArgs(variables);
                            inExpr = result;
                        }
                        outExpr = engine.evaluate(inExpr);
                        podOut = outExpr;
                        addSymjaPod(podsArray, inExpr, podOut, "Integration", "Integral", formats, engine);
                        numpods++;
                        if (!outExpr.isFreeAST(x -> x.isTrigFunction())) {
                            inExpr = F.TrigToExp(outExpr);
                            podOut = engine.evaluate(inExpr);
                            if (!podOut.equals(outExpr)) {
                                addSymjaPod(podsArray, inExpr, podOut, "Alternate form", "Simplification", formats, engine);
                                numpods++;
                            }
                        }
                        resultStatistics(queryresult, error, numpods, podsArray);
                        return messageJSON;
                    } else if (inExpr.isAST(S.Solve, 2, 4)) {
                        if (inExpr.isAST1()) {
                            VariablesSet varSet = new VariablesSet(inExpr.first());
                            IAST variables = varSet.getVarList();
                            IASTAppendable result = ((IAST) inExpr).copyAppendable();
                            result.append(variables);
                            inExpr = result;
                        }
                        outExpr = engine.evaluate(inExpr);
                        podOut = outExpr;
                        addSymjaPod(podsArray, inExpr, podOut, "Solve equation", "Solver", formats, engine);
                        numpods++;
                        if (!outExpr.isFreeAST(x -> x.isTrigFunction())) {
                            inExpr = F.TrigToExp(outExpr);
                            podOut = engine.evaluate(inExpr);
                            // if (!S.PossibleZeroQ.ofQ(engine, F.Subtract(podOut, outExpr))) {
                            if (!podOut.equals(outExpr)) {
                                addSymjaPod(// 
                                podsArray, inExpr, podOut, "Alternate form", "Simplification", formats, engine);
                                numpods++;
                            }
                        }
                        resultStatistics(queryresult, error, numpods, podsArray);
                        return messageJSON;
                    } else {
                        IExpr expr = inExpr;
                        if (outExpr.isAST(S.JSFormData, 3)) {
                            podOut = outExpr;
                            int form = internFormat(SYMJA, podOut.second().toString());
                            addPod(podsArray, inExpr, podOut, podOut.first().toString(), StringFunctions.inputForm(inExpr), "Function", "Plotter", form, engine);
                            numpods++;
                        } else if (outExpr instanceof GraphExpr) {
                            String javaScriptStr = GraphFunctions.graphToJSForm((GraphExpr) outExpr);
                            if (javaScriptStr != null) {
                                String html = VISJS_IFRAME;
                                html = StringUtils.replace(html, "`1`", javaScriptStr);
                                html = // 
                                StringUtils.replace(// 
                                html, // 
                                "`2`", // 
                                "  var options = { };\n");
                                // html = StringEscapeUtils.escapeHtml4(html);
                                int form = internFormat(SYMJA, "visjs");
                                addPod(podsArray, inExpr, podOut, html, "Graph data", "Graph", form, engine);
                                numpods++;
                            }
                        } else {
                            IExpr head = outExpr.head();
                            if (head instanceof IBuiltInSymbol && outExpr.size() > 1) {
                                IEvaluator evaluator = ((IBuiltInSymbol) head).getEvaluator();
                                if (evaluator instanceof IDistribution) {
                                    // if (evaluator instanceof IDiscreteDistribution) {
                                    int snumpods = statisticsPods(podsArray, (IAST) outExpr, podOut, formats, engine);
                                    numpods += snumpods;
                                }
                            }
                            VariablesSet varSet = new VariablesSet(outExpr);
                            IAST variables = varSet.getVarList();
                            if (outExpr.isBooleanFormula()) {
                                numpods += booleanPods(podsArray, outExpr, variables, formats, engine);
                            }
                            if (outExpr.isAST(S.Equal, 3)) {
                                IExpr arg1 = outExpr.first();
                                IExpr arg2 = outExpr.second();
                                if (// 
                                arg1.isNumericFunction(varSet) && arg2.isNumericFunction(varSet)) {
                                    if (variables.argSize() == 1) {
                                        IExpr plot2D = F.Plot(F.List(arg1, arg2), F.List(variables.arg1(), F.num(-20), F.num(20)));
                                        podOut = engine.evaluate(plot2D);
                                        if (podOut.isAST(S.JSFormData, 3)) {
                                            int form = internFormat(SYMJA, podOut.second().toString());
                                            addPod(podsArray, inExpr, podOut, podOut.first().toString(), StringFunctions.inputForm(plot2D), "Function", "Plotter", form, engine);
                                            numpods++;
                                        }
                                    }
                                    if (!arg1.isZero() && !arg2.isZero()) {
                                        inExpr = F.Equal(engine.evaluate(F.Subtract(arg1, arg2)), F.C0);
                                        podOut = inExpr;
                                        addSymjaPod(podsArray, inExpr, podOut, "Alternate form", "Simplification", formats, engine);
                                        numpods++;
                                    }
                                    inExpr = F.Solve(F.binaryAST2(S.Equal, arg1, arg2), variables);
                                    podOut = engine.evaluate(inExpr);
                                    addSymjaPod(podsArray, inExpr, podOut, "Solution", "Reduce", formats, engine);
                                    numpods++;
                                }
                                resultStatistics(queryresult, error, numpods, podsArray);
                                return messageJSON;
                            } else {
                                if (!inExpr.equals(outExpr)) {
                                    addSymjaPod(podsArray, inExpr, outExpr, "Result", "Identity", formats, engine);
                                    numpods++;
                                }
                            }
                            boolean isNumericFunction = outExpr.isNumericFunction(varSet);
                            if (isNumericFunction) {
                                if (variables.argSize() == 1) {
                                    IExpr plot2D = F.Plot(outExpr, F.List(variables.arg1(), F.num(-7), F.num(7)));
                                    podOut = engine.evaluate(plot2D);
                                    if (podOut.isAST(S.JSFormData, 3)) {
                                        int form = internFormat(SYMJA, podOut.second().toString());
                                        addPod(podsArray, inExpr, podOut, podOut.first().toString(), StringFunctions.inputForm(plot2D), "Function", "Plotter", form, engine);
                                        numpods++;
                                    }
                                } else if (variables.argSize() == 2) {
                                    IExpr plot3D = F.Plot3D(outExpr, F.List(variables.arg1(), F.num(-3.5), F.num(3.5)), F.List(variables.arg2(), F.num(-3.5), F.num(3.5)));
                                    podOut = engine.evaluate(plot3D);
                                    if (podOut.isAST(S.JSFormData, 3)) {
                                        int form = internFormat(SYMJA, podOut.second().toString());
                                        addPod(podsArray, inExpr, podOut, podOut.first().toString(), StringFunctions.inputForm(plot3D), "3D plot", "Plot", form, engine);
                                        numpods++;
                                    }
                                }
                            }
                            if (!outExpr.isFreeAST(x -> x.isTrigFunction())) {
                                inExpr = F.TrigToExp(outExpr);
                                podOut = engine.evaluate(inExpr);
                                // {
                                if (!podOut.equals(outExpr)) {
                                    addSymjaPod(podsArray, inExpr, podOut, "Alternate form", "Simplification", formats, engine);
                                    numpods++;
                                }
                            }
                            if (isNumericFunction && variables.argSize() == 1) {
                                if (outExpr.isPolynomial(variables) && !outExpr.isAtom()) {
                                    inExpr = F.Factor(outExpr);
                                    podOut = engine.evaluate(inExpr);
                                    addSymjaPod(podsArray, inExpr, podOut, "Factor", "Polynomial", formats, engine);
                                    numpods++;
                                    IExpr x = variables.first();
                                    inExpr = F.Minimize(outExpr, x);
                                    podOut = engine.evaluate(inExpr);
                                    if (podOut.isAST(S.List, 3) && podOut.first().isNumber() && podOut.second().isAST(S.List, 2)) {
                                        IExpr rule = podOut.second().first();
                                        if (rule.isRule()) {
                                            StringBuilder buf = new StringBuilder();
                                            buf.append("min{");
                                            buf.append(outExpr.toString());
                                            buf.append("} = ");
                                            buf.append(podOut.first());
                                            buf.append(" at ");
                                            buf.append(rule.first().toString());
                                            buf.append(" = ");
                                            buf.append(rule.second().toString());
                                            addSymjaPod(podsArray, inExpr, podOut, buf.toString(), "GlobalExtrema", "GlobalMinimum", formats, engine);
                                            numpods++;
                                        }
                                    }
                                    inExpr = F.Maximize(outExpr, x);
                                    podOut = engine.evaluate(inExpr);
                                    if (podOut.isAST(S.List, 3) && podOut.first().isNumber() && podOut.second().isAST(S.List, 2)) {
                                        IExpr rule = podOut.second().first();
                                        if (rule.isRule()) {
                                            StringBuilder buf = new StringBuilder();
                                            buf.append("max{");
                                            buf.append(outExpr.toString());
                                            buf.append("} = ");
                                            buf.append(podOut.first());
                                            buf.append(" at ");
                                            buf.append(rule.first().toString());
                                            buf.append(" = ");
                                            buf.append(rule.second().toString());
                                            addSymjaPod(podsArray, inExpr, podOut, buf.toString(), "GlobalExtrema", "GlobalMaximum", formats, engine);
                                            numpods++;
                                        }
                                    }
                                }
                                inExpr = F.D(outExpr, variables.arg1());
                                podOut = engine.evaluate(inExpr);
                                addSymjaPod(podsArray, inExpr, podOut, "Derivative", "Derivative", formats, engine);
                                numpods++;
                                inExpr = F.Integrate(outExpr, variables.arg1());
                                podOut = engine.evaluate(inExpr);
                                addSymjaPod(podsArray, inExpr, podOut, "Indefinite integral", "Integral", formats, engine);
                                numpods++;
                            }
                        }
                        if (numpods == 1) {
                            // only Identity pod was appended
                            if (// 
                            errorString.length() == 0 && !firstEval.isPresent()) {
                                addSymjaPod(podsArray, expr, outExpr, "Evaluated result", "Expression", formats, engine);
                                numpods++;
                            } else {
                                addSymjaPod(podsArray, expr, outExpr, errorString, "Evaluated result", "Expression", formats, engine, true);
                                numpods++;
                            }
                        }
                        resultStatistics(queryresult, error, numpods, podsArray);
                        return messageJSON;
                    }
                }
            }
            if (numpods > 0) {
                resultStatistics(queryresult, error, numpods, podsArray);
                return messageJSON;
            }
        }
    }
    queryresult.put("error", error ? "true" : "false");
    return messageJSON;
}
Also used : IStringX(org.matheclipse.core.interfaces.IStringX) Level(org.apache.logging.log4j.Level) IInteger(org.matheclipse.core.interfaces.IInteger) StringUtils(org.apache.commons.lang3.StringUtils) ThreadLocalNotifyingAppender(org.matheclipse.logging.ThreadLocalNotifyingAppender) TeXUtilities(org.matheclipse.core.eval.TeXUtilities) IDistribution(org.matheclipse.core.interfaces.IDistribution) Trie(org.matheclipse.parser.trie.Trie) VariablesSet(org.matheclipse.core.convert.VariablesSet) Map(java.util.Map) EvalEngine(org.matheclipse.core.eval.EvalEngine) ID(org.matheclipse.core.expression.ID) IASTAppendable(org.matheclipse.core.interfaces.IASTAppendable) Set(java.util.Set) LevenshteinDistance(org.apache.commons.text.similarity.LevenshteinDistance) JSBuilder(org.matheclipse.core.form.output.JSBuilder) ISymbol(org.matheclipse.core.interfaces.ISymbol) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) MathMLUtilities(org.matheclipse.core.eval.MathMLUtilities) Logger(org.apache.logging.log4j.Logger) StringFunctions(org.matheclipse.core.builtin.StringFunctions) ExprParser(org.matheclipse.core.parser.ExprParser) GraphExpr(org.matheclipse.core.expression.data.GraphExpr) StandardTokenizer(org.apache.lucene.analysis.standard.StandardTokenizer) TrieBuilder(org.matheclipse.parser.trie.TrieBuilder) IEvaluator(org.matheclipse.core.interfaces.IEvaluator) IFraction(org.matheclipse.core.interfaces.IFraction) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Encode(org.owasp.encoder.Encode) Message(org.apache.logging.log4j.message.Message) WriterOutputStream(org.matheclipse.core.eval.util.WriterOutputStream) Documentation(org.matheclipse.core.form.Documentation) TrieMatch(org.matheclipse.parser.trie.TrieMatch) Suppliers(com.google.common.base.Suppliers) FuzzyParser(org.matheclipse.api.parser.FuzzyParser) ThreadLocalNotifierClosable(org.matheclipse.logging.ThreadLocalNotifyingAppender.ThreadLocalNotifierClosable) SyntaxError(org.matheclipse.parser.client.SyntaxError) Soundex(org.apache.commons.codec.language.Soundex) PrintStream(java.io.PrintStream) CharTermAttribute(org.apache.lucene.analysis.tokenattributes.CharTermAttribute) TokenStream(org.apache.lucene.analysis.TokenStream) F(org.matheclipse.core.expression.F) IAST(org.matheclipse.core.interfaces.IAST) IBuiltInSymbol(org.matheclipse.core.interfaces.IBuiltInSymbol) StringWriter(java.io.StringWriter) PorterStemFilter(org.apache.lucene.analysis.en.PorterStemFilter) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Config(org.matheclipse.core.basic.Config) GraphFunctions(org.matheclipse.core.builtin.GraphFunctions) IOException(java.io.IOException) StringEscapeUtils(org.apache.commons.text.StringEscapeUtils) S(org.matheclipse.core.expression.S) StringReader(java.io.StringReader) ElementData1(org.matheclipse.core.data.ElementData1) TeXParser(org.matheclipse.core.form.tex.TeXParser) IExpr(org.matheclipse.core.interfaces.IExpr) Comparator(java.util.Comparator) Collections(java.util.Collections) LogManager(org.apache.logging.log4j.LogManager) RomanArabicConverter(com.baeldung.algorithms.romannumerals.RomanArabicConverter) WriterOutputStream(org.matheclipse.core.eval.util.WriterOutputStream) IBuiltInSymbol(org.matheclipse.core.interfaces.IBuiltInSymbol) StringWriter(java.io.StringWriter) SyntaxError(org.matheclipse.parser.client.SyntaxError) IInteger(org.matheclipse.core.interfaces.IInteger) EvalEngine(org.matheclipse.core.eval.EvalEngine) ArrayNode(com.fasterxml.jackson.databind.node.ArrayNode) IAST(org.matheclipse.core.interfaces.IAST) IStringX(org.matheclipse.core.interfaces.IStringX) IDistribution(org.matheclipse.core.interfaces.IDistribution) IFraction(org.matheclipse.core.interfaces.IFraction) PrintStream(java.io.PrintStream) ObjectNode(com.fasterxml.jackson.databind.node.ObjectNode) ThreadLocalNotifierClosable(org.matheclipse.logging.ThreadLocalNotifyingAppender.ThreadLocalNotifierClosable) VariablesSet(org.matheclipse.core.convert.VariablesSet) ExprParser(org.matheclipse.core.parser.ExprParser) IEvaluator(org.matheclipse.core.interfaces.IEvaluator) IASTAppendable(org.matheclipse.core.interfaces.IASTAppendable) GraphExpr(org.matheclipse.core.expression.data.GraphExpr) IExpr(org.matheclipse.core.interfaces.IExpr)

Example 2 with ThreadLocalNotifierClosable

use of org.matheclipse.logging.ThreadLocalNotifyingAppender.ThreadLocalNotifierClosable in project symja_android_library by axkr.

the class AJAXQueryServlet method evaluate.

private String evaluate(HttpServletRequest request, String expression, String numericMode, String function, int counter) {
    if (expression == null || expression.length() == 0) {
        return JSONBuilder.createJSONErrorString("No input expression posted!");
    }
    if (expression.trim().length() == 0) {
        return JSONBuilder.createJSONErrorString("No input expression posted!");
    } else if (expression.length() >= Short.MAX_VALUE) {
        return JSONBuilder.createJSONErrorString("Input expression greater than: " + Short.MAX_VALUE + " characters!");
    }
    String[] result = null;
    HttpSession session = request.getSession();
    LOGGER.warn("({}) In::{}", session.getId(), expression);
    final StringWriter outWriter = new StringWriter();
    WriterOutputStream wouts = new WriterOutputStream(outWriter);
    final StringWriter errorWriter = new StringWriter();
    WriterOutputStream werrors = new WriterOutputStream(errorWriter);
    try (PrintStream outs = new PrintStream(wouts);
        PrintStream errors = new PrintStream(werrors);
        ThreadLocalNotifierClosable c = ServletServer.setLogEventNotifier(outs, errors)) {
        EvalEngine engine = ENGINES.get(session.getId());
        if (engine == null) {
            engine = new EvalEngine(session.getId(), 256, 256, outs, errors, isRelaxedSyntax());
            engine.setOutListDisabled(false, (short) 100);
            engine.setPackageMode(false);
            ENGINES.put(session.getId(), engine);
        } else {
            engine.setOutPrintStream(outs);
            engine.setErrorPrintStream(errors);
        }
        result = evaluateString(engine, expression, numericMode, function, outWriter, errorWriter);
    } finally {
        // tear down associated ThreadLocal from EvalEngine
        EvalEngine.remove();
    }
    if (result == null) {
        return JSONBuilder.createJSONError("Calculation result is undefined")[1];
    }
    return result[1].toString();
}
Also used : PrintStream(java.io.PrintStream) StringWriter(java.io.StringWriter) HttpSession(javax.servlet.http.HttpSession) ThreadLocalNotifierClosable(org.matheclipse.logging.ThreadLocalNotifyingAppender.ThreadLocalNotifierClosable) EvalEngine(org.matheclipse.core.eval.EvalEngine) WriterOutputStream(org.matheclipse.core.eval.util.WriterOutputStream)

Aggregations

PrintStream (java.io.PrintStream)2 StringWriter (java.io.StringWriter)2 EvalEngine (org.matheclipse.core.eval.EvalEngine)2 WriterOutputStream (org.matheclipse.core.eval.util.WriterOutputStream)2 RomanArabicConverter (com.baeldung.algorithms.romannumerals.RomanArabicConverter)1 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 ArrayNode (com.fasterxml.jackson.databind.node.ArrayNode)1 ObjectNode (com.fasterxml.jackson.databind.node.ObjectNode)1 Suppliers (com.google.common.base.Suppliers)1 IOException (java.io.IOException)1 StringReader (java.io.StringReader)1 ArrayList (java.util.ArrayList)1 Collections (java.util.Collections)1 Comparator (java.util.Comparator)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1 Set (java.util.Set)1 HttpSession (javax.servlet.http.HttpSession)1 Soundex (org.apache.commons.codec.language.Soundex)1 StringUtils (org.apache.commons.lang3.StringUtils)1