001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/portal/context/MapModel.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 - Department of Geography, University of Bonn - 006 and 007 - lat/lon GmbH - 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 package org.deegree.portal.context; 037 038 import java.util.ArrayList; 039 040 import java.util.Collections; 041 import java.util.List; 042 043 import org.deegree.portal.PortalException; 044 045 /** 046 * TODO add class documentation here 047 * 048 * @author <a href="mailto:name@deegree.org">Andreas Poth</a> 049 * @author last edited by: $Author: apoth $ 050 * 051 * @version $Revision: 20771 $, $Date: 2009-11-12 18:37:45 +0100 (Do, 12. Nov 2009) $ 052 */ 053 public class MapModel { 054 055 private List<LayerGroup> layerGroups; 056 057 /** 058 * 059 * @param layerGroups 060 */ 061 public void setLayerGroups( List<LayerGroup> layerGroups ) { 062 this.layerGroups = layerGroups; 063 } 064 065 /** 066 * @return the layerGroups 067 */ 068 public List<LayerGroup> getLayerGroups() { 069 return layerGroups; 070 } 071 072 /** 073 * 074 * @param action 075 * @return list of {@link Layer} selected for the passed action 076 */ 077 public List<MMLayer> getLayersSelectedForAction( String action ) { 078 List<MMLayer> tmp = new ArrayList<MMLayer>(); 079 getLayersForAction( layerGroups, action, tmp ); 080 return Collections.unmodifiableList( tmp ); 081 } 082 083 private void getLayersForAction( List<LayerGroup> lgs, String action, List<MMLayer> collector ) { 084 for ( LayerGroup layerGroup : lgs ) { 085 List<MMLayer> mapModelEntries = layerGroup.getLayers(); 086 for ( MMLayer mapModelEntrry : mapModelEntries ) { 087 if ( mapModelEntrry.getSelectedFor().contains( action ) ) { 088 collector.add( mapModelEntrry ); 089 } 090 } 091 getLayersForAction( layerGroup.getLayerGroups(), action, collector ); 092 } 093 } 094 095 /** 096 * 097 * @param mapModelEntry 098 * {@link MapModelEntry} to be inserted 099 * @param parent 100 * if <code>null</code> root node of layertree will be used as parent 101 * @param antecessor 102 * if <code>null</code> layer will be inserted directly underneath its parent 103 * @param first 104 * if true layer will be inserted as first layer of a group if antecessor == null 105 * @throws Exception 106 */ 107 public void insert( final MapModelEntry mapModelEntry, LayerGroup parent, MapModelEntry antecessor, boolean first ) 108 throws Exception { 109 110 // check if layer already exists in map model 111 walkLayerTree( new MapModelVisitor() { 112 113 public void visit( MMLayer layer ) 114 throws Exception { 115 if ( layer.getIdentifier().equals( mapModelEntry.getIdentifier() ) ) { 116 throw new PortalException( "layer: " + layer.getTitle() + " already contained in tree" ); 117 } 118 } 119 120 public void visit( LayerGroup layerGroup ) 121 throws Exception { 122 if ( layerGroup.getIdentifier().equals( mapModelEntry.getIdentifier() ) ) { 123 throw new PortalException( "layergroup: " + layerGroup.getTitle() + " already contained in tree" ); 124 } 125 } 126 127 } ); 128 129 if ( mapModelEntry instanceof MMLayer ) { 130 insertLayer( (MMLayer) mapModelEntry, parent, antecessor, first ); 131 } else if ( mapModelEntry instanceof LayerGroup ) { 132 insertLayerGroup( (LayerGroup) mapModelEntry, parent, antecessor, first ); 133 } 134 } 135 136 /** 137 * 138 * @param layer 139 * @param parent 140 * if <code>null</code> root node of layertree will be used as parent 141 * @param antecessor 142 * if <code>null</code> layer will be inserted directly underneath its parent 143 * @param first 144 * if true layer will be inserted as first layer of a group if antecessor == null 145 */ 146 private void insertLayer( MMLayer layer, LayerGroup parent, MapModelEntry antecessor, boolean first ) { 147 insertLayer( layer, parent, antecessor, layerGroups, first ); 148 } 149 150 private void insertLayer( MMLayer layer, LayerGroup parent, MapModelEntry antecessor, List<LayerGroup> lgs, 151 boolean first ) { 152 for ( LayerGroup layerGroup : lgs ) { 153 if ( parent != null && parent.equals( layerGroup ) ) { 154 layerGroup.insert( layer, antecessor, first ); 155 break; 156 } else { 157 insertLayer( layer, parent, antecessor, layerGroup.getLayerGroups(), first ); 158 } 159 } 160 } 161 162 /** 163 * 164 * @param layerGroup 165 * @param parent 166 * if <code>null</code> root node of layer tree will be used as parent 167 * @param antecessor 168 * if <code>null</code> layer will be inserted directly underneath its parent 169 * @param first 170 * if true layer will be inserted as first layer group of a group if antecessor == null 171 */ 172 private void insertLayerGroup( LayerGroup layerGroup, LayerGroup parent, MapModelEntry antecessor, boolean first ) { 173 if ( parent == null ) { 174 layerGroups.add( layerGroup ); 175 } 176 insertLayerGroup( layerGroup, parent, antecessor, layerGroups, first ); 177 } 178 179 private void insertLayerGroup( LayerGroup lg, LayerGroup parent, MapModelEntry antecessor, List<LayerGroup> lgs, 180 boolean first ) { 181 for ( LayerGroup layerGroup : lgs ) { 182 if ( parent != null && parent.equals( layerGroup ) ) { 183 layerGroup.insert( lg, antecessor, first ); 184 break; 185 } else { 186 insertLayerGroup( lg, parent, antecessor, layerGroup.getLayerGroups(), first ); 187 } 188 } 189 } 190 191 /** 192 * 193 * @param visitor 194 * @throws Exception 195 */ 196 public void walkLayerTree( MapModelVisitor visitor ) 197 throws Exception { 198 for ( LayerGroup layerGroup : layerGroups ) { 199 applyVisitor( layerGroup, visitor ); 200 } 201 } 202 203 private void applyVisitor( LayerGroup layerGroup, MapModelVisitor visitor ) 204 throws Exception { 205 visitor.visit( layerGroup ); 206 List<MapModelEntry> entries = layerGroup.getMapModelEntries(); 207 for ( MapModelEntry entry : entries ) { 208 if ( entry instanceof MMLayer ) { 209 visitor.visit( (MMLayer) entry ); 210 } else { 211 applyVisitor( (LayerGroup) entry, visitor ); 212 } 213 } 214 } 215 216 /** 217 * 218 * @param identifier 219 * @return {@link MapModelEntry} matching passed identifier 220 */ 221 public MapModelEntry getMapModelEntryByIdentifier( final String identifier ) { 222 final List<MapModelEntry> list = new ArrayList<MapModelEntry>(); 223 try { 224 walkLayerTree( new MapModelVisitor() { 225 226 public void visit( LayerGroup layerGroup ) 227 throws Exception { 228 if ( identifier.equals( layerGroup.getIdentifier() ) ) { 229 list.add( layerGroup ); 230 } 231 232 } 233 234 public void visit( MMLayer layer ) 235 throws Exception { 236 if ( identifier.equals( layer.getIdentifier() ) ) { 237 list.add( layer ); 238 } 239 240 } 241 } ); 242 } catch ( Exception e ) { 243 e.printStackTrace(); 244 } 245 if ( list.size() > 0 ) { 246 return list.get( 0 ); 247 } else { 248 return null; 249 } 250 } 251 }