public Object eval()

in src/main/java/org/apache/bsf/engines/xslt/XSLTEngine.java [85:177]


    public Object eval (final String source, final int lineNo, final int columnNo,
                        final Object oscript) throws BSFException {
    // get the style base URI (the place from where Xerces XSLT will
    // look for imported/included files and referenced docs): if a
    // bean named "xslt:styleBaseURI" is registered, then cvt it
    // to a string and use that. Otherwise use ".", which means the
    // base is the directory where the process is running from
    final Object sbObj = mgr.lookupBean ("xslt:styleBaseURI");
    final String styleBaseURI = (sbObj == null) ? "." : sbObj.toString ();

    // Locate the stylesheet.
    StreamSource styleSource;

        styleSource =
            new StreamSource(new StringReader(oscript.toString ()));
        styleSource.setSystemId(styleBaseURI);

        try {
            transformer = tFactory.newTransformer(styleSource);
        } catch (final Exception e) {
            logger.error("Exception from Xerces XSLT:", e);
            throw new BSFException (BSFException.REASON_EXECUTION_ERROR,
                                    "Exception from Xerces XSLT: " + e, e);
        }

    // get the src to work on: if a bean named "xslt:src" is registered
    // and its a Node, then use it as the source. If its not a Node, then
    // if its a URL parse it, if not treat it as a file and make a URL and
    // parse it and go. If no xslt:src is found, use an empty document
    // (stylesheet is treated as a literal result element stylesheet)
    final Object srcObj = mgr.lookupBean ("xslt:src");
    Object xis = null;
    if (srcObj != null) {
            if (srcObj instanceof Node) {
        xis = new DOMSource((Node)srcObj);
            } else {
        try {
                    String mesg = "as anything";
                    if (srcObj instanceof Reader) {
            xis = new StreamSource ((Reader) srcObj);
            mesg = "as a Reader";
                    } else if (srcObj instanceof File) {
                        xis = new StreamSource ((File) srcObj);
                        mesg = "as a file";
                    } else {
                        final String srcObjstr=srcObj.toString();
                        xis = new StreamSource (new StringReader(srcObjstr));
                        if (srcObj instanceof URL) {
                            mesg = "as a URL";
                        } else {
                            ((StreamSource) xis).setPublicId (srcObjstr);
                            mesg = "as an XML string";
                        }
                    }

                    if (xis == null) {
            throw new Exception ("Unable to get input from '" +
                                             srcObj + "' " + mesg);
                    }
        } catch (final Exception e) {
                    throw new BSFException (BSFException.REASON_EXECUTION_ERROR,
                                            "BSF:XSLTEngine: unable to get " +
                                            "input from '" + srcObj + "' as XML", e);
        }
            }
    } else {
            // create an empty document - real src must come into the
            // stylesheet using "doc(...)" [see XSLT spec] or the stylesheet
            // must be of literal result element type
            xis = new StreamSource();
    }

    // set all declared beans as parameters.
    for (int i = 0; i < declaredBeans.size (); i++) {
            final BSFDeclaredBean b = (BSFDeclaredBean) declaredBeans.elementAt (i);
            transformer.setParameter (b.name, new XObject (b.bean));
    }

    // declare a "bsf" parameter which is the BSF handle so that
    // the script can do BSF stuff if it wants to
    transformer.setParameter ("bsf",
                                  new XObject (new BSFFunctions (mgr, this)));

    // do it
    try {
            final DOMResult result = new DOMResult();
            transformer.transform ((StreamSource) xis, result);
            return new XSLTResultNode (result.getNode());
    } catch (final Exception e) {
            throw new BSFException (BSFException.REASON_EXECUTION_ERROR,
                                    "exception while eval'ing XSLT script" + e, e);
    }
    }