001: /*
002: * ====================================================================
003: *
004: * XFLOW - Process Management System
005: * Copyright (C) 2003 Rob Tan
006: * All rights reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * 1. Redistributions of source code must retain the above copyright
013: * notice, this list of conditions, and the following disclaimer.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright
016: * notice, this list of conditions, and the disclaimer that follows
017: * these conditions in the documentation and/or other materials
018: * provided with the distribution.
019: *
020: * 3. The name "XFlow" must not be used to endorse or promote products
021: * derived from this software without prior written permission. For
022: * written permission, please contact rcktan@yahoo.com
023: *
024: * 4. Products derived from this software may not be called "XFlow", nor
025: * may "XFlow" appear in their name, without prior written permission
026: * from the XFlow Project Management (rcktan@yahoo.com)
027: *
028: * In addition, we request (but do not require) that you include in the
029: * end-user documentation provided with the redistribution and/or in the
030: * software itself an acknowledgement equivalent to the following:
031: * "This product includes software developed by the
032: * XFlow Project (http://xflow.sourceforge.net/)."
033: * Alternatively, the acknowledgment may be graphical using the logos
034: * available at http://xflow.sourceforge.net/
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE XFLOW AUTHORS OR THE PROJECT
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: * ====================================================================
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the XFlow Project and was originally
052: * created by Rob Tan (rcktan@yahoo.com)
053: * For more information on the XFlow Project, please see:
054: * <http://xflow.sourceforge.net/>.
055: * ====================================================================
056: */
057:
058: package xflow.server.controller;
059:
060: import java.util.*;
061: import java.io.*;
062: import java.text.*;
063: import javax.xml.parsers.*;
064: import org.w3c.dom.*;
065: import org.xml.sax.*;
066: import jaxen.*;
067: import jaxen.dom.*;
068: import xflow.common.*;
069:
070: /**
071: * Rule engine to evaluate XPath expressions.
072: *
073: **/
074: public class XPathRuleEngine {
075:
076: private XPath xpath = null;
077:
078: public boolean executeRule(String xml, String expression,
079: Vector namespaces) throws XflowException {
080:
081: boolean result = false;
082:
083: try {
084:
085: xpath = new DOMXPath(expression);
086: if (namespaces != null) {
087: SimpleNamespaceContext nsc = new SimpleNamespaceContext();
088: for (int i = 0; i < namespaces.size(); i++) {
089: String nsStr = (String) namespaces.elementAt(i);
090: Namespace ns = Namespace.getNamespace(nsStr);
091: nsc.addNamespace(ns.alias, ns.uri);
092: }
093: xpath.setNamespaceContext(nsc);
094: }
095: } catch (Exception e) {
096: throw new XflowException(e.getMessage());
097: }
098:
099: try {
100: DocumentBuilderFactory factory = DocumentBuilderFactory
101: .newInstance();
102: DocumentBuilder builder = factory.newDocumentBuilder();
103: StringReader sreader = new StringReader(xml);
104: InputSource is = new InputSource(sreader);
105: Document doc = builder.parse(is);
106: List list = xpath.selectNodes(doc);
107: if (list.size() > 0) {
108: result = true;
109: }
110: } catch (Exception e) {
111: e.printStackTrace();
112: }
113:
114: return result;
115: }
116:
117: /**
118: * Unit tester
119: *
120: **/
121: public static void main(String[] args) throws XflowException {
122:
123: String xmlId = args[0];
124: String rule = args[1];
125: //String ns = args[2];
126:
127: Vector namespaces = new Vector();
128: //namespaces.addElement (ns);
129: XPathRuleEngine re = new XPathRuleEngine();
130:
131: String xml = null;
132:
133: try {
134: FileInputStream inStream = new FileInputStream(xmlId);
135: int sizeOfFile = inStream.available();
136: byte[] buffer = new byte[sizeOfFile];
137: inStream.read(buffer);
138: inStream.close();
139: xml = new String(buffer);
140: } catch (Exception e) {
141: e.printStackTrace();
142: }
143: boolean result = re.executeRule(xml, rule, namespaces);
144: System.out.println("Result is: " + result);
145: }
146: }
|