001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/model/filterencoding/LogicalOperation.java $
002: /*---------------- FILE HEADER ------------------------------------------
003:
004: This file is part of deegree.
005: Copyright (C) 2001-2008 by:
006: EXSE, Department of Geography, University of Bonn
007: http://www.giub.uni-bonn.de/deegree/
008: lat/lon GmbH
009: http://www.lat-lon.de
010:
011: This library is free software; you can redistribute it and/or
012: modify it under the terms of the GNU Lesser General Public
013: License as published by the Free Software Foundation; either
014: version 2.1 of the License, or (at your option) any later version.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: Contact:
026:
027: Andreas Poth
028: lat/lon GmbH
029: Aennchenstr. 19
030: 53115 Bonn
031: Germany
032: E-Mail: poth@lat-lon.de
033:
034: Prof. Dr. Klaus Greve
035: Department of Geography
036: University of Bonn
037: Meckenheimer Allee 166
038: 53115 Bonn
039: Germany
040: E-Mail: greve@giub.uni-bonn.de
041:
042:
043: ---------------------------------------------------------------------------*/
044: package org.deegree.model.filterencoding;
045:
046: import java.util.ArrayList;
047: import java.util.List;
048:
049: import org.deegree.framework.xml.ElementList;
050: import org.deegree.framework.xml.XMLTools;
051: import org.deegree.model.feature.Feature;
052: import org.w3c.dom.Element;
053:
054: /**
055: * Encapsulates the information of a logical_ops entity (as defined in the Filter DTD).
056: *
057: * @version $Revision: 9343 $
058: * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider</a>
059: * @author last edited by: $Author: apoth $
060: *
061: * @version 1.0. $Revision: 9343 $, $Date: 2007-12-27 05:30:32 -0800 (Thu, 27 Dec 2007) $
062: *
063: * @since 2.0
064: */
065: public class LogicalOperation extends AbstractOperation {
066:
067: /** Arguments of the Operation. */
068: private List<Operation> arguments;
069:
070: /**
071: * Constructs a new LogicalOperation.
072: *
073: * @see OperationDefines
074: *
075: * @param operatorId
076: * @param arguments
077: */
078: public LogicalOperation(int operatorId, List<Operation> arguments) {
079: super (operatorId);
080: this .arguments = arguments;
081: }
082:
083: /**
084: * Returns the arguments of the operation. These are <tt>OperationsMetadata</tt> as well.
085: *
086: * @return a list of arguments of the operation
087: */
088: public List<Operation> getArguments() {
089: return arguments;
090: }
091:
092: /**
093: * Given a DOM-fragment, a corresponding Operation-object is built. This method recursively
094: * calls other buildFromDOM () - methods to validate the structure of the DOM-fragment.
095: *
096: * @param element
097: * @return opertation
098: * @throws FilterConstructionException
099: * if the structure of the DOM-fragment is invalid
100: * @deprecated use the 1.0.0 filter encoding aware method instead.
101: */
102: @Deprecated
103: public static Operation buildFromDOM(Element element)
104: throws FilterConstructionException {
105: return buildFromDOM(element, false);
106: }
107:
108: /**
109: * Given a DOM-fragment, a corresponding Operation-object is built. This method recursively
110: * calls other buildFromDOM () - methods to validate the structure of the DOM-fragment.
111: *
112: * @param element
113: * @return opertation
114: * @throws FilterConstructionException
115: * if the structure of the DOM-fragment is invalid
116: */
117: public static Operation buildFromDOM(Element element,
118: boolean useVersion_1_0_0)
119: throws FilterConstructionException {
120:
121: // check if root element's name is a known operator
122: String name = element.getLocalName();
123: int operatorId = OperationDefines.getIdByName(name);
124: List<Operation> arguments = new ArrayList<Operation>();
125:
126: switch (operatorId) {
127: case OperationDefines.AND:
128: case OperationDefines.OR: {
129: ElementList children = XMLTools.getChildElements(element);
130: if (children.getLength() < 2)
131: throw new FilterConstructionException("'" + name
132: + "' requires at least 2 elements!");
133: for (int i = 0; i < children.getLength(); i++) {
134: Element child = children.item(i);
135: Operation childOperation = AbstractOperation
136: .buildFromDOM(child, useVersion_1_0_0);
137: arguments.add(childOperation);
138: }
139: break;
140: }
141: case OperationDefines.NOT: {
142: ElementList children = XMLTools.getChildElements(element);
143: if (children.getLength() != 1)
144: throw new FilterConstructionException("'" + name
145: + "' requires exactly 1 element!");
146: Element child = children.item(0);
147: Operation childOperation = AbstractOperation.buildFromDOM(
148: child, useVersion_1_0_0);
149: arguments.add(childOperation);
150: break;
151: }
152: default: {
153: throw new FilterConstructionException("'" + name
154: + "' is not a logical operator!");
155: }
156: }
157: return new LogicalOperation(operatorId, arguments);
158: }
159:
160: /**
161: * Produces an indented XML representation of this object.
162: *
163: * @return XML representation of opertation
164: */
165: public StringBuffer toXML() {
166: StringBuffer sb = new StringBuffer(1000);
167: sb.append("<ogc:").append(getOperatorName()).append(">");
168:
169: for (int i = 0; i < arguments.size(); i++) {
170: sb.append(arguments.get(i).toXML());
171: }
172:
173: sb.append("</ogc:").append(getOperatorName()).append(">");
174: return sb;
175: }
176:
177: /**
178: * Calculates the <tt>LogicalOperation</tt>'s logical value based on the certain property
179: * values of the given <tt>Feature</tt>.
180: *
181: * @param feature
182: * that determines the property values
183: * @return true, if the <tt>LogicalOperation</tt> evaluates to true, else false
184: * @throws FilterEvaluationException
185: * if the evaluation fails
186: */
187: public boolean evaluate(Feature feature)
188: throws FilterEvaluationException {
189: switch (getOperatorId()) {
190: case OperationDefines.AND: {
191: for (int i = 0; i < arguments.size(); i++) {
192: if (!arguments.get(i).evaluate(feature))
193: return false;
194: }
195: return true;
196: }
197: case OperationDefines.OR: {
198: for (int i = 0; i < arguments.size(); i++) {
199: if (arguments.get(i).evaluate(feature))
200: return true;
201: }
202: return false;
203: }
204: case OperationDefines.NOT: {
205: return !arguments.get(0).evaluate(feature);
206: }
207: default: {
208: throw new FilterEvaluationException(
209: "Unknown LogicalOperation encountered: '"
210: + getOperatorName() + "'");
211: }
212: }
213: }
214: }
|