001: //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/trunk/src/org/deegree/model/filterencoding/PropertyIsNullOperation.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 org.deegree.framework.xml.ElementList;
047: import org.deegree.framework.xml.XMLParsingException;
048: import org.deegree.framework.xml.XMLTools;
049: import org.deegree.model.feature.Feature;
050: import org.deegree.ogcbase.CommonNamespaces;
051: import org.deegree.ogcbase.OGCDocument;
052: import org.deegree.ogcbase.PropertyPath;
053: import org.w3c.dom.Element;
054: import org.w3c.dom.Text;
055:
056: /**
057: * Encapsulates the information of a <PropertyIsNull>-element (as defined in Filter DTD). The DTD
058: * defines the properties type to be tested as PropertyName or Literal.
059: *
060: * @author Markus Schneider
061: * @version 07.08.2002
062: */
063:
064: public class PropertyIsNullOperation extends ComparisonOperation {
065:
066: private PropertyName propertyName;
067:
068: /**
069: * @param propertyName
070: * to check for
071: */
072: public PropertyIsNullOperation(PropertyName propertyName) {
073: super (OperationDefines.PROPERTYISNULL);
074: this .propertyName = propertyName;
075: }
076:
077: /**
078: * @return the property name
079: */
080: public PropertyName getPropertyName() {
081: return this .propertyName;
082: }
083:
084: /**
085: * Given a DOM-fragment, a corresponding Operation-object is built. This method recursively
086: * calls other buildFromDOM () - methods to validate the structure of the DOM-fragment.
087: *
088: * @param element
089: * to build the bean from
090: * @param useVersion_1_0_0
091: * if the filterencoding 1.0.0 should be used.
092: * @return a Bean of the DOM
093: *
094: * @throws FilterConstructionException
095: * if the structure of the DOM-fragment is invalid
096: * @deprecated use the 1.0.0 filter encoding aware method instead.
097: */
098: @Deprecated
099: public static Operation buildFromDOM(Element element)
100: throws FilterConstructionException {
101: return buildFromDOM(element, false);
102: }
103:
104: /**
105: * Given a DOM-fragment, a corresponding Operation-object is built. This method recursively
106: * calls other buildFromDOM () - methods to validate the structure of the DOM-fragment.
107: *
108: * @param element
109: * to build the bean from
110: * @param useVersion_1_0_0
111: * if the filterencoding 1.0.0 should be used.
112: * @return a Bean of the DOM
113: *
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 equals 'PropertyIsNull'
122: if (!element.getLocalName().equals("PropertyIsNull"))
123: throw new FilterConstructionException(
124: "Name of element does not equal 'PropertyIsNull'!");
125:
126: ElementList children = XMLTools.getChildElements(element);
127: if (children.getLength() != 1)
128: throw new FilterConstructionException(
129: "'PropertyIsNull' requires exactly 1 element!");
130:
131: Element child = children.item(0);
132: PropertyName propertyName = null;
133:
134: switch (ExpressionDefines.getIdByName(child.getLocalName())) {
135: case ExpressionDefines.PROPERTYNAME: {
136: propertyName = (PropertyName) PropertyName
137: .buildFromDOM(child);
138: break;
139: }
140: case ExpressionDefines.LITERAL: {
141: if (useVersion_1_0_0) {
142:
143: try {
144: Text node = (Text) XMLTools.getRequiredNode(child,
145: "text()", CommonNamespaces
146: .getNamespaceContext());
147: PropertyPath propertyPath = OGCDocument
148: .parsePropertyPath(node);
149: propertyName = new PropertyName(propertyPath);
150: } catch (XMLParsingException e) {
151: throw new FilterConstructionException(
152: "The literal "
153: + child.getTextContent()
154: + " in the PropertyIsNull operation Element could not be transformed to a 'PropertyName'!");
155: }
156: break;
157: }
158: // slip through if useVersion_1_0_0 is false
159: }
160: default: {
161: throw new FilterConstructionException(
162: "PropertyIsNull operation Element does not contain a 'PropertyName'!");
163: }
164: }
165:
166: return new PropertyIsNullOperation(propertyName);
167: }
168:
169: /** Produces an indented XML representation of this object. */
170: public StringBuffer toXML() {
171: StringBuffer sb = new StringBuffer(500);
172: sb.append("<ogc:").append(getOperatorName()).append(">");
173: sb.append(propertyName.toXML());
174: sb.append("</ogc:").append(getOperatorName()).append(">");
175: return sb;
176: }
177:
178: /**
179: * Calculates the <tt>PropertyIsNull</tt> -Operation's logical value based on the certain
180: * property values of the given <tt>Feature</tt>.
181: *
182: * @param feature
183: * that determines the property values
184: * @return true, if the <tt>PropertyIsNull</tt> -Operation evaluates to true, else false
185: * @throws FilterEvaluationException
186: * if the evaluation fails
187: */
188: public boolean evaluate(Feature feature)
189: throws FilterEvaluationException {
190: Object value = propertyName.evaluate(feature);
191: if (value == null)
192: return true;
193: return false;
194: }
195: }
|