001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/io/datastore/sql/wherebuilder/FeatureTypeNode.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree, http://deegree.org/
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 and
007 lat/lon GmbH
008
009 This library is free software; you can redistribute it and/or modify it under
010 the terms of the GNU Lesser General Public License as published by the Free
011 Software Foundation; either version 2.1 of the License, or (at your option)
012 any later version.
013 This library is distributed in the hope that it will be useful, but WITHOUT
014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016 details.
017 You should have received a copy of the GNU Lesser General Public License
018 along with this library; if not, write to the Free Software Foundation, Inc.,
019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020
021 Contact information:
022
023 lat/lon GmbH
024 Aennchenstr. 19, 53177 Bonn
025 Germany
026 http://lat-lon.de/
027
028 Department of Geography, University of Bonn
029 Prof. Dr. Klaus Greve
030 Postfach 1147, 53001 Bonn
031 Germany
032 http://www.geographie.uni-bonn.de/deegree/
033
034 e-mail: info@deegree.org
035 ----------------------------------------------------------------------------*/
036 package org.deegree.io.datastore.sql.wherebuilder;
037
038 import java.util.ArrayList;
039 import java.util.HashMap;
040 import java.util.Iterator;
041 import java.util.List;
042 import java.util.Map;
043
044 import org.deegree.io.datastore.schema.MappedFeatureType;
045 import org.deegree.io.datastore.schema.MappedPropertyType;
046
047 /**
048 * Represents a {@link MappedFeatureType} as a node in a {@link QueryTableTree}.
049 *
050 * @author <a href="mailto:schneider@lat-lon.de">Markus Schneider </a>
051 * @author last edited by: $Author: mschneider $
052 *
053 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
054 */
055 class FeatureTypeNode {
056
057 // associated MappedFeatureType instance (contains the table name)
058 private MappedFeatureType ft;
059
060 // alias (may be null)
061 private String ftAlias;
062
063 // unique alias for the corresponding table
064 private String tableAlias;
065
066 private Map<MappedPropertyType, List<PropertyNode>> propertyMap = new HashMap<MappedPropertyType, List<PropertyNode>>();
067
068 /**
069 * Creates a new <code>FeatureTypeNode</code> from the given parameters.
070 *
071 * @param ft
072 * @param ftAlias
073 * @param tableAlias
074 */
075 FeatureTypeNode( MappedFeatureType ft, String ftAlias, String tableAlias ) {
076 this.ft = ft;
077 this.ftAlias = ftAlias;
078 this.tableAlias = tableAlias;
079 }
080
081 /**
082 * Returns the associated {@link MappedFeatureType}.
083 *
084 * @return associated MappedFeatureType
085 */
086 public MappedFeatureType getFeatureType() {
087 return this.ft;
088 }
089
090 /**
091 * Returns the alias as specified in the corresponding query.
092 *
093 * @return the alias (may be null)
094 */
095 public String getFtAlias() {
096 return this.ftAlias;
097 }
098
099 /**
100 * Returns the name of the associated table.
101 *
102 * @return the name of the associated table
103 */
104 public String getTable() {
105 return this.ft.getTable();
106 }
107
108 /**
109 * Returns the alias that uniquely identifies the table (in an SQL query).
110 *
111 * @return the unique alias for the table
112 */
113 public String getTableAlias() {
114 return this.tableAlias;
115 }
116
117 /**
118 * Returns all child {@link PropertyNode}s.
119 *
120 * @return all child PropertyNodes
121 */
122 public PropertyNode[] getPropertyNodes() {
123 List<PropertyNode> propertyNodeList = new ArrayList<PropertyNode>();
124 Iterator<?> iter = this.propertyMap.values().iterator();
125 while ( iter.hasNext() ) {
126 Iterator<?> iter2 = ( (List) iter.next() ).iterator();
127 while ( iter2.hasNext() ) {
128 propertyNodeList.add( (PropertyNode) iter2.next() );
129 }
130 }
131 return propertyNodeList.toArray( new PropertyNode[propertyNodeList.size()] );
132 }
133
134 /**
135 * Returns the child {@link PropertyNode}s with the given type.
136 *
137 * @param type
138 * the property type to look up
139 * @return the child PropertyNode for the given property, may be null
140 */
141 public PropertyNode getPropertyNode( MappedPropertyType type ) {
142 PropertyNode propertyNode = null;
143 List<?> propertyNodeList = this.propertyMap.get( type );
144 if ( propertyNodeList != null ) {
145 Iterator<?> propertyNodeIter = propertyNodeList.iterator();
146 boolean found = false;
147 while ( propertyNodeIter.hasNext() ) {
148 propertyNode = (PropertyNode) propertyNodeIter.next();
149 if ( propertyNode.getProperty() == type ) {
150 found = true;
151 break;
152 }
153 }
154 if ( !found ) {
155 propertyNode = null;
156 }
157 }
158 return propertyNode;
159 }
160
161 /**
162 * Adds the given property node as a child.
163 *
164 * @param propertyNode
165 * the child node to add
166 */
167 public void addPropertyNode( PropertyNode propertyNode ) {
168 List<PropertyNode> propertyNodeList = this.propertyMap.get( propertyNode.getProperty() );
169 if ( propertyNodeList == null ) {
170 propertyNodeList = new ArrayList<PropertyNode>();
171 this.propertyMap.put( propertyNode.getProperty(), propertyNodeList );
172 }
173 propertyNodeList.add( propertyNode );
174 }
175
176 /**
177 * Returns an indented string representation of the object.
178 *
179 * @param indent
180 * current indentation (String consisting of spaces)
181 * @return an indented string representation of the object
182 */
183 String toString( String indent ) {
184 StringBuffer sb = new StringBuffer();
185 sb.append( indent );
186 sb.append( "- " );
187 sb.append( this.ft.getName() );
188 sb.append( " (FeatureTypeNode, alias: '" );
189 sb.append( this.ftAlias == null ? '-' : this.ftAlias );
190 sb.append( "', table: '" );
191 sb.append( this.ft.getTable() );
192 sb.append( "', tableAlias: '" );
193 sb.append( this.tableAlias );
194 sb.append( "')\n" );
195 Iterator<?> iter = this.propertyMap.values().iterator();
196 while ( iter.hasNext() ) {
197 List<?> propertyNodeList = (List) iter.next();
198 Iterator<?> iter2 = propertyNodeList.iterator();
199 while ( iter2.hasNext() ) {
200 PropertyNode propertyNode = (PropertyNode) iter2.next();
201 sb.append( propertyNode.toString( indent + " " ) );
202 }
203 }
204 return sb.toString();
205 }
206
207 @Override
208 public boolean equals( Object obj ) {
209 if ( obj == null || ( !( obj instanceof FeatureTypeNode ) ) ) {
210 return false;
211 }
212 FeatureTypeNode that = (FeatureTypeNode) obj;
213 if ( this.getTable().equals( that.getTable() ) && this.tableAlias.equals( that.tableAlias ) ) {
214 return true;
215 }
216 return false;
217 }
218
219 @Override
220 public int hashCode() {
221 return this.tableAlias.hashCode();
222 }
223 }