001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/portal/context/LayerList.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.portal.context;
045
046 import java.util.ArrayList;
047 import java.util.List;
048
049 import org.deegree.portal.PortalException;
050
051 /**
052 *
053 *
054 *
055 * @version $Revision: 9346 $
056 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
057 * @author last edited by: $Author: apoth $
058 *
059 * @version 1.0. $Revision: 9346 $, $Date: 2007-12-27 17:39:07 +0100 (Do, 27 Dez 2007) $
060 *
061 * @since 2.0
062 */
063 public class LayerList {
064
065 private List<Layer> list = new ArrayList<Layer>( 50 );
066
067 private List<Layer> treeList = new ArrayList<Layer>( 50 );
068
069 /**
070 * Creates a new LayerList object.
071 *
072 * @param layers
073 */
074 public LayerList( Layer[] layers ) {
075 setLayers( layers );
076 }
077
078 /**
079 * returns a layer identifies by its name
080 *
081 * @param name name ofthe layer
082 *
083 * @return names layer
084 * @deprecated use @see #getLayer(String, String) instead
085 */
086 public Layer getLayer( String name ) {
087 for ( Layer layer : list ) {
088 if ( layer.getName().equals( name ) ) {
089 return layer;
090 }
091 }
092 return null;
093 }
094
095 /**
096 * returns a layer identifies by its name and service address
097 *
098 * @param name name ofthe layer
099 * @param serverAddress address of the server which servers the layer
100 *
101 * @return named layer
102 */
103 public Layer getLayer( String name, String serverAddress ) {
104
105 if ( serverAddress != null ) {
106 for ( Layer layer : list ) {
107 String s = layer.getServer().getOnlineResource().toExternalForm();
108 if ( layer.getName().equals( name ) && s.equals( serverAddress ) ) {
109 return layer;
110 }
111 }
112 } else {
113 for ( Layer layer : list ) {
114 if ( layer.getName().equals( name ) ) {
115 return layer;
116 }
117 }
118 }
119 return null;
120 }
121
122 /**
123 * returns all layers of the web map context
124 *
125 * @return array of layers
126 */
127 public Layer[] getLayers() {
128 Layer[] cl = new Layer[list.size()];
129 return list.toArray( cl );
130 }
131
132 /**
133 * sets all layers of the web map context
134 *
135 * @param layers
136 */
137 public void setLayers( Layer[] layers ) {
138 this.list.clear();
139
140 if ( layers != null ) {
141 for ( int i = 0; i < layers.length; i++ ) {
142 list.add( layers[i] );
143 }
144 }
145 }
146
147 /**
148 * returns the layers of a node of the tree of the web map context
149 *
150 * @return array of layers
151 */
152 public Layer[] getLayersByNodeId( int id ) {
153 List<Layer> nodeLayerList = new ArrayList<Layer>( list.size() );
154 int parentNodeId;
155 for ( int k = 0; k < list.size(); k++ ) {
156 parentNodeId = ( list.get( k ) ).getExtension().getParentNodeId();
157 if ( parentNodeId == id ) {
158 nodeLayerList.add( list.get( k ) );
159 }
160 }
161 Layer[] nodeLayers = new Layer[nodeLayerList.size()];
162 return nodeLayerList.toArray( nodeLayers );
163 }
164
165 /**
166 * TODO: review this changed; it has been introduced as of TreeLayerView Portlet
167 * @param root
168 */
169 public void orderLayerListByLayerTree( Node root ) {
170 treeList.clear();
171 Node[] rootNode = new Node[1];
172 rootNode[0] = root;
173 treeList = getLayerListByNode( rootNode );
174 setLayers( treeList.toArray( new Layer[treeList.size()] ) );
175 }
176
177 /**
178 *
179 * @param nodes
180 * @return list of layers
181 */
182 private List<Layer> getLayerListByNode( Node[] nodes ) {
183 for ( int i = 0; i < nodes.length; i++ ) {
184 getLayerListByNode( nodes[i].getNodes() );
185 Layer[] nl = getLayersByNodeId( nodes[i].getId() );
186 for ( int j = 0; j < nl.length; j++ ) {
187 treeList.add( nl[j] );
188 }
189
190 }
191 return treeList;
192 }
193
194 /**
195 * adds one layer to the the web map context. If a layer with the same
196 * name as the passed layer already exits it will be overwritten
197 *
198 * @param layer
199 */
200 public void addLayer( Layer layer ) {
201 list.add( layer );
202 }
203
204 /**
205 * adds one layer to the top of the web map context. If a layer with the same
206 * name as the passed layer already exits it will be overwritten
207 *
208 * @param layer
209 */
210 public void addLayerToTop( Layer layer ) {
211 list.add( 0, layer );
212 }
213
214 /**
215 * removes a layer identified by its name from the web map context
216 *
217 * @param name name of the layer to be removed
218 *
219 * @return removed layer
220 * @deprecated use @see #removeLayer(String, String) instead
221 */
222 public Layer removeLayer( String name ) {
223 Layer layer = getLayer( name );
224 list.remove( layer );
225 return layer;
226 }
227
228 /**
229 * removes a layer identified by its name from the web map context
230 *
231 * @param name name of the layer to be removed
232 * @param serverAddress
233 *
234 * @return removed layer
235 */
236 public Layer removeLayer( String name, String serverAddress ) {
237 Layer layer = getLayer( name, serverAddress );
238 list.remove( layer );
239 return layer;
240 }
241
242 /**
243 * moves a layer within the layer list up or down
244 * @param layer layer to be moved
245 * @param up if true the layer will be moved up otherwise
246 * it will be moved down
247 * @throws PortalException will be thrown if the layer is not known
248 * by the layer list.
249 */
250 public void move( Layer layer, boolean up ) {
251 int i = 0;
252 Layer target = null;
253 while ( i < list.size() && target == null ) {
254 Layer tmp = list.get( i );
255 if ( tmp.getName().equals( layer.getName() )
256 && tmp.getServer().getOnlineResource().equals(
257 layer.getServer().getOnlineResource() ) ) {
258 target = tmp;
259 }
260 i++;
261 }
262 i--;
263 if ( i > 0 && up ) {
264 Layer o = list.get( i );
265 list.set( i, list.get( i - 1 ) );
266 list.set( i - 1, o );
267 } else if ( i < list.size() - 1 && !up ) {
268 Layer o = list.get( i );
269 list.set( i, list.get( i + 1 ) );
270 list.set( i + 1, o );
271 }
272 }
273
274 /**
275 * moves a layer within the layer list before the beforeLayer
276 * @param layer layer to be moved
277 * @param beforeLayer
278 *
279 */
280 public void move( Layer layer, Layer beforeLayer ) {
281 int i = 0;
282 ArrayList<Layer> newList = new ArrayList<Layer>( list.size() );
283
284 while ( i < list.size() ) {
285 Layer tmp = list.get( i );
286 if ( tmp.getName().equals( beforeLayer.getName() )
287 && tmp.getServer().getOnlineResource().equals(
288 beforeLayer.getServer().getOnlineResource() ) ) {
289 newList.add( layer );
290 newList.add( beforeLayer );
291 } else if ( tmp.getName().equals( layer.getName() )
292 && tmp.getServer().getOnlineResource().equals(
293 layer.getServer().getOnlineResource() ) ) {
294 //do nothing
295 } else {
296 newList.add( tmp );
297 }
298 i++;
299 }
300 list.clear();
301 list = newList;
302 }
303
304 /**
305 * removes all layers from the web map context
306 */
307 public void clear() {
308 list.clear();
309 }
310
311 }