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 }