001    /**
002     * Copyright 2005-2012 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kew.xml.xstream;
017    
018    import java.util.List;
019    
020    import javax.xml.xpath.XPath;
021    import javax.xml.xpath.XPathExpressionException;
022    import javax.xml.xpath.XPathFunction;
023    import javax.xml.xpath.XPathFunctionException;
024    
025    import org.w3c.dom.Node;
026    
027    /**
028     * An XPathFunction which will run XStream safe XPath queries.
029     * 
030     * @see XStreamSafeEvaluator
031     * 
032     * @author Kuali Rice Team (rice.collab@kuali.org)
033     */
034    public class XStreamSafeSearchFunction implements XPathFunction {
035    
036            private final Node rootNode;
037            private XPath xpath;
038            private static XStreamSafeEvaluator evaluator = new XStreamSafeEvaluator();
039            
040            public XStreamSafeSearchFunction(Node rootNode, XPath xpath) {
041                    this.rootNode = rootNode;
042                    this.xpath = xpath;
043            }
044            
045            public Object evaluate(List parameters) throws XPathFunctionException {
046                    String xPathExpression = getXPathExpressionParameter(parameters);
047                    evaluator.setXpath(xpath);
048                    //Node rootSearchNode = getRootSearchNodeParameter(parameters);
049                    try {
050                            return evaluator.evaluate(xPathExpression, rootNode);
051                    } catch (XPathExpressionException e) {
052                            throw new XPathFunctionException(e);
053                    }
054            }
055            
056            private String getXPathExpressionParameter(List parameters) throws XPathFunctionException {
057                    if (parameters.size() < 1) {
058                            throw new XPathFunctionException("First parameter must be an XPath expression.");
059                    }
060                    if (!(parameters.get(0) instanceof String)) {
061                            throw new XPathFunctionException("First parameter must be an XPath expression String");
062                    }
063                    return (String)parameters.get(0);
064            }
065    
066            public XPath getXpath() {
067                    return xpath;
068            }
069    
070            public void setXpath(XPath xpath) {
071                    this.xpath = xpath;
072            }
073            
074            /*private Node getRootSearchNodeParameter(List parameters) throws XPathFunctionException {
075                    if (parameters.size() < 2) {
076                            throw new XPathFunctionException("Second parameter should be root node and is required");
077                    }
078                    System.out.println(parameters.get(1));
079                    if (!(parameters.get(1) instanceof Node)) {
080                            throw new XPathFunctionException("Second parameter should be an instance of Node (try using the root() XPath function).");
081                    }
082                    return (Node)parameters.get(1);
083            }*/
084    
085    }