001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/portal/context/LayerList.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2007 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: 7982 $
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: 7982 $, $Date: 2007-08-10 16:49:55 +0200 (Fr, 10 Aug 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 int i = 0;
107 for ( Layer layer : list ) {
108 String s = layer.getServer().getOnlineResource().toExternalForm();
109 if ( layer.getName().equals( name ) && s.equals( serverAddress ) ) {
110 return layer;
111 }
112 i++;
113 }
114 } else {
115 for ( Layer layer : list ) {
116 if ( layer.getName().equals( name ) ) {
117 return layer;
118 }
119 }
120 }
121 return null;
122 }
123
124 /**
125 * returns all layers of the web map context
126 *
127 * @return array of layers
128 */
129 public Layer[] getLayers() {
130 Layer[] cl = new Layer[list.size()];
131 return list.toArray( cl );
132 }
133
134 /**
135 * sets all layers of the web map context
136 *
137 * @param layers
138 */
139 public void setLayers( Layer[] layers ) {
140 this.list.clear();
141
142 if ( layers != null ) {
143 for ( int i = 0; i < layers.length; i++ ) {
144 list.add( layers[i] );
145 }
146 }
147 }
148
149 /**
150 * returns the layers of a node of the tree of the web map context
151 *
152 * @return array of layers
153 */
154 public Layer[] getLayersByNodeId( int id ) {
155 List<Layer> nodeLayerList = new ArrayList<Layer>( list.size() );
156 int parentNodeId;
157 for ( int k = 0; k < list.size(); k++ ) {
158 parentNodeId = ( list.get( k ) ).getExtension().getParentNodeId();
159 if ( parentNodeId == id ) {
160 nodeLayerList.add( list.get( k ) );
161 }
162 }
163 Layer[] nodeLayers = new Layer[nodeLayerList.size()];
164 return nodeLayerList.toArray( nodeLayers );
165 }
166
167 /**
168 * TODO: review this changed; it has been introduced as of TreeLayerView Portlet
169 * @param root
170 */
171 public void orderLayerListByLayerTree( Node root ) {
172 treeList.clear();
173 Node[] rootNode = new Node[1];
174 rootNode[0] = root;
175 treeList = getLayerListByNode( rootNode );
176 setLayers( treeList.toArray( new Layer[treeList.size()] ) );
177 }
178
179 /**
180 *
181 * @param nodes
182 * @return list of layers
183 */
184 private List<Layer> getLayerListByNode( Node[] nodes ) {
185 for ( int i = 0; i < nodes.length; i++ ) {
186 getLayerListByNode( nodes[i].getNodes() );
187 Layer[] nl = getLayersByNodeId( nodes[i].getId() );
188 for ( int j = 0; j < nl.length; j++ ) {
189 treeList.add( nl[j] );
190 }
191
192 }
193 return treeList;
194 }
195
196 /**
197 * adds one layer to the the web map context. If a layer with the same
198 * name as the passed layer already exits it will be overwritten
199 *
200 * @param layer
201 */
202 public void addLayer( Layer layer ) {
203 list.add( layer );
204 }
205
206 /**
207 * adds one layer to the top of the web map context. If a layer with the same
208 * name as the passed layer already exits it will be overwritten
209 *
210 * @param layer
211 */
212 public void addLayerToTop( Layer layer ) {
213 list.add( 0, layer );
214 }
215
216 /**
217 * removes a layer identified by its name from the web map context
218 *
219 * @param name name of the layer to be removed
220 *
221 * @return removed layer
222 * @deprecated use @see #removeLayer(String, String) instead
223 */
224 public Layer removeLayer( String name ) {
225 Layer layer = getLayer( name );
226 list.remove( layer );
227 return layer;
228 }
229
230 /**
231 * removes a layer identified by its name from the web map context
232 *
233 * @param name name of the layer to be removed
234 * @param serverAddress
235 *
236 * @return removed layer
237 */
238 public Layer removeLayer( String name, String serverAddress ) {
239 Layer layer = getLayer( name, serverAddress );
240 list.remove( layer );
241 return layer;
242 }
243
244 /**
245 * moves a layer within the layer list up or down
246 * @param layer layer to be moved
247 * @param up if true the layer will be moved up otherwise
248 * it will be moved down
249 * @throws PortalException will be thrown if the layer is not known
250 * by the layer list.
251 */
252 public void move( Layer layer, boolean up ) {
253 int i = 0;
254 Layer target = null;
255 while ( i < list.size() && target == null ) {
256 Layer tmp = list.get( i );
257 if ( tmp.getName().equals( layer.getName() )
258 && tmp.getServer().getOnlineResource().equals(
259 layer.getServer().getOnlineResource() ) ) {
260 target = tmp;
261 }
262 i++;
263 }
264 i--;
265 if ( i > 0 && up ) {
266 Layer o = list.get( i );
267 list.set( i, list.get( i - 1 ) );
268 list.set( i - 1, o );
269 } else if ( i < list.size() - 1 && !up ) {
270 Layer o = list.get( i );
271 list.set( i, list.get( i + 1 ) );
272 list.set( i + 1, o );
273 }
274 }
275
276 /**
277 * moves a layer within the layer list before the beforeLayer
278 * @param layer layer to be moved
279 * @param beforeLayer
280 *
281 */
282 public void move( Layer layer, Layer beforeLayer ) {
283 int i = 0;
284 ArrayList<Layer> newList = new ArrayList<Layer>( list.size() );
285
286 while ( i < list.size() ) {
287 Layer tmp = list.get( i );
288 if ( tmp.getName().equals( beforeLayer.getName() )
289 && tmp.getServer().getOnlineResource().equals(
290 beforeLayer.getServer().getOnlineResource() ) ) {
291 newList.add( layer );
292 newList.add( beforeLayer );
293 } else if ( tmp.getName().equals( layer.getName() )
294 && tmp.getServer().getOnlineResource().equals(
295 layer.getServer().getOnlineResource() ) ) {
296 //do nothing
297 } else {
298 newList.add( tmp );
299 }
300 i++;
301 }
302 list.clear();
303 list = newList;
304 }
305
306 /**
307 * removes all layers from the web map context
308 */
309 public void clear() {
310 list.clear();
311 }
312
313 }