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 }