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    }