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    }