001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_testing/src/org/deegree/portal/portlet/modules/actions/IGeoPortalPortletPerform.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.portlet.modules.actions;
037
038 import java.net.URL;
039 import java.util.HashMap;
040 import java.util.List;
041 import java.util.Map;
042
043 import javax.servlet.ServletContext;
044 import javax.servlet.http.HttpServletRequest;
045 import javax.servlet.http.HttpSession;
046
047 import org.apache.jetspeed.portal.Portlet;
048 import org.apache.turbine.util.RunData;
049 import org.deegree.framework.log.ILogger;
050 import org.deegree.framework.log.LoggerFactory;
051 import org.deegree.framework.util.StringTools;
052 import org.deegree.model.crs.CoordinateSystem;
053 import org.deegree.model.spatialschema.Envelope;
054 import org.deegree.model.spatialschema.GeometryFactory;
055 import org.deegree.model.spatialschema.Point;
056 import org.deegree.portal.context.ContextException;
057 import org.deegree.portal.context.Layer;
058 import org.deegree.portal.context.ViewContext;
059 import org.deegree.portal.context.WebMapContextFactory;
060 import org.deegree.security.drm.model.User;
061
062 /**
063 *
064 *
065 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
066 * @author last edited by: $Author: mschneider $
067 *
068 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
069 */
070 public class IGeoPortalPortletPerform extends AbstractPortletPerform {
071
072 private static final ILogger LOG = LoggerFactory.getLogger( IGeoPortalPortletPerform.class );
073
074 /**
075 * A String denoting BBOX
076 */
077 public static final String PARAM_BBOX = "BBOX";
078
079 /**
080 * A String denoting LAYER
081 */
082 public static final String PARAM_LAYER = "LAYER";
083
084 /**
085 * A String denoting STYLE
086 */
087 public static final String PARAM_STYLE = "STYLE";
088
089 /**
090 * A String denoting MAPMODE
091 */
092 public static final String PARAM_MAPMODE = "MAPMODE";
093
094 /**
095 * A String denoting SESSIONID
096 */
097 public static final String PARAM_SESSIONID = "SESSIONID";
098
099 /**
100 * A String denoting HISTORY
101 */
102 public static final String SESSION_HISTORY = "HISTORY";
103
104 /**
105 * A String denoting HISTORYPOSITION
106 */
107 public static final String SESSION_HISTORYPOSITION = "HISTORYPOSITION";
108
109 protected ServletContext sc = null;
110
111 protected static Map<String, ViewContext> vcMap = new HashMap<String, ViewContext>( 100 );
112
113
114 /**
115 * @param request
116 * @param portlet
117 * @param sc context
118 */
119 public IGeoPortalPortletPerform( HttpServletRequest request, Portlet portlet, ServletContext sc ) {
120 super( request, portlet );
121 this.sc = sc;
122 }
123
124 /**
125 * updates the view context with the current bounding box, the list of visible layers and the
126 * current map mode
127 *
128 */
129 public void updateContext() {
130
131 // update the view contexts bounding box with the current one.
132 setBoundingBoxFromBBOXParam();
133
134 // update the view contexts list of visible layers
135 setLayers();
136
137 // update the map mode
138 setMode();
139
140 }
141
142 /**
143 * sets layers of the view context as visible or invisble depending on the incoming request
144 *
145 */
146 public void setLayers() {
147
148 if ( portlet != null && parameter.get( PARAM_BBOX ) != null && parameter.get( "LAYERS" ) != null ) {
149 // just change layerlist if the request contains a BBOX parameter
150 // and at least one layer because other wise it will be the initial call;
151 ViewContext vc = getCurrentViewContext( portlet.getID() );
152 Layer[] layers = vc.getLayerList().getLayers();
153 String ly = parameter.get( "LAYERS" );
154 StringBuffer sb = new StringBuffer( 100 );
155 for ( int i = 0; i < layers.length; i++ ) {
156 sb.append( layers[i].getName() ).append( '|' );
157 sb.append( layers[i].getServer().getOnlineResource() );
158 if ( ly.indexOf( sb.toString() ) > -1 ) {
159 layers[i].setHidden( false );
160 } else {
161 layers[i].setHidden( true );
162 }
163 sb.delete( 0, sb.length() );
164 }
165
166 setCurrentMapContext( vc, portlet.getID() );
167 }
168
169 }
170
171 /**
172 * writes the current map mode (if set) into the users WMC.
173 *
174 */
175 public void setMode() {
176 String mm = parameter.get( PARAM_MAPMODE );
177 if ( mm != null ) {
178 ViewContext vc = getCurrentViewContext( portlet.getID() );
179 vc.getGeneral().getExtension().setMode( mm );
180 setCurrentMapContext( vc, portlet.getID() );
181 }
182 }
183
184 /**
185 * sets a new bounding box of the map read from the the request object passed when initialized
186 * an instance of <code>MapWindowPortletPerfom</code>
187 *
188 */
189 public void setBoundingBoxFromBBOXParam() {
190 String bbox = parameter.get( PARAM_BBOX );
191 setBoundingBox( bbox );
192 }
193
194 /**
195 * sets a new bounding box of the map read from the the request object passed when initialized
196 * an instance of <code>MapWindowPortletPerfom</code>
197 *
198 * @param env
199 * new bounding box
200 */
201 public void setBoundingBox( Envelope env ) {
202
203 if ( portlet != null ) {
204 ViewContext vc = getCurrentViewContext( portlet.getID() );
205 if ( vc != null ) {
206 CoordinateSystem crs = vc.getGeneral().getBoundingBox()[0].getCoordinateSystem();
207 Point[] pt = new Point[2];
208 pt[0] = GeometryFactory.createPoint( env.getMin().getX(), env.getMin().getY(), crs );
209 pt[1] = GeometryFactory.createPoint( env.getMax().getX(), env.getMax().getY(), crs );
210 try {
211 vc.getGeneral().setBoundingBox( pt );
212 } catch ( ContextException should_never_happen ) {
213 //nottin
214 }
215
216
217 List<Envelope> history = (List<Envelope>) request.getSession().getAttribute( SESSION_HISTORY );
218 int p = (Integer) request.getSession().getAttribute( SESSION_HISTORYPOSITION );
219 Envelope current = history.get( p );
220 if ( current == null || !current.equals( env ) ) {
221 p++;
222 history.add( p, env );
223 request.getSession().setAttribute( IGeoPortalPortletPerform.SESSION_HISTORYPOSITION, p );
224 }
225
226 }
227 setCurrentMapContext( vc, portlet.getID() );
228 }
229 }
230
231 /**
232 * the method expects a string with four comma seperated coordinate values. The created box will
233 * be written
234 *
235 * @param bbox
236 */
237 public void setBoundingBox( String bbox ) {
238
239 if ( bbox != null ) {
240 double[] coords = StringTools.toArrayDouble( bbox, "," );
241 Envelope env = GeometryFactory.createEnvelope( coords[0], coords[1], coords[2], coords[3], null );
242 setBoundingBox( env );
243 }
244 }
245
246 /**
247 * returns the current <@link ViewContext> read from the portlet session.
248 *
249 * @param session
250 * @param pid
251 * MapWindowPortlet id
252 *
253 * @return the current ViewContext read from the portlet session.
254 */
255 public static ViewContext getCurrentViewContext( HttpSession session, String pid ) {
256 return (ViewContext) session.getAttribute( pid + '_' + CURRENT_WMC );
257 }
258
259 /**
260 * returns the current <@link ViewContext> read from the portlet session.
261 *
262 * @param pid
263 * MapWindowPortlet id
264 *
265 * @return the current ViewContext read from the portlet session.
266 */
267 public ViewContext getCurrentViewContext( String pid ) {
268 return getCurrentViewContext( request.getSession(), pid );
269 }
270
271 /**
272 * sets the current MapContext to the users session
273 *
274 * @param session
275 * @param vc
276 * @param pid
277 */
278 public static void setCurrentMapContext( HttpSession session, ViewContext vc, String pid ) {
279 session.setAttribute( pid + '_' + CURRENT_WMC, vc );
280 }
281
282 /**
283 * sets the current MapContext to the users session
284 *
285 * @param vc
286 * @param pid
287 */
288 public void setCurrentMapContext( ViewContext vc, String pid ) {
289 setCurrentMapContext( request.getSession(), vc, pid );
290 }
291
292 /**
293 * writes the name of the current WMC into the users session
294 *
295 * @param session
296 * @param pid
297 * @param name
298 */
299 public static void setCurrentMapContextName( HttpSession session, String pid, String name ) {
300 session.setAttribute( pid + '_' + CURRENT_WMC_NAME, name );
301 }
302
303 /**
304 * writes the name of the current WMC into the users session
305 *
306 * @param pid
307 * @param name
308 */
309 public void setCurrentMapContextName( String pid, String name ) {
310 setCurrentMapContextName( request.getSession(), pid, name );
311 }
312
313 /**
314 * returns the name of the current WMC into the users session
315 *
316 * @param session
317 * @param pid
318 * @return the name of the current WMC into the users session
319 */
320 public static String getCurrentMapContextName( HttpSession session, String pid ) {
321 return (String) session.getAttribute( pid + '_' + CURRENT_WMC_NAME );
322 }
323
324 /**
325 * returns the name of the current WMC into the users session
326 *
327 * @param pid
328 * @return the name of the current WMC into the users session
329 */
330 public String getCurrentMapContextName( String pid ) {
331 return getCurrentMapContextName( request.getSession(), pid );
332 }
333
334 /**
335 * returns an instance of <@link ViewContext> read from the portlet session. If no instance is
336 * available <code>null</code> will be returned.
337 *
338 * @param session
339 * @param name
340 * map context name/id
341 *
342 * @return an instance of ViewContext read from the portlet session. If no instance is available
343 * <code>null</code> will be returned.
344 */
345 public ViewContext getNamedViewContext( HttpSession session, String name ) {
346 URL url = (URL) session.getAttribute( SESSION_VIEWCONTEXT + name );
347 ViewContext vc = null;
348 try {
349 if ( url != null ) {
350
351 RunData rundata = (RunData) request.getAttribute( "data" );
352 if ( rundata != null ) {
353 org.apache.turbine.om.security.User tu = rundata.getUser();
354
355 String username = tu.getUserName();
356 String password = tu.getPassword();
357 String firstname = tu.getFirstName();
358 String lastname = tu.getLastName();
359 String email = tu.getEmail();
360
361 User user = new User( 0, username, password, firstname, lastname, email, null );
362 // User(int id, String name, String password, String
363 // firstName,
364 // String lastName, String emailAddress, SecurityRegistry
365 // registry)
366 String key = url.toExternalForm() + '|' + session.getId();
367 if ( vcMap.get( key ) != null ) {
368 vc = vcMap.get( key );
369 } else {
370 vc = WebMapContextFactory.createViewContext( url, user, null );
371 vcMap.put( key, vc );
372 }
373 } else {
374 String key = url.toExternalForm();
375 if ( vcMap.get( key ) != null ) {
376 vc = vcMap.get( key );
377 } else {
378 vc = WebMapContextFactory.createViewContext( url, null, null );
379 vcMap.put( key, vc );
380 }
381 }
382 }
383 } catch ( Exception e ) {
384 // should never happen
385 LOG.logError( e.getMessage(), e );
386 }
387
388 return vc;
389 }
390
391 /**
392 * returns an instance of <@link ViewContext> read from the portlet session. If no instance is
393 * available <code>null</code> will be returned.
394 *
395 * @param name
396 * map context name/id
397 *
398 * @return instance of ViewContext read from the portlet session. If no instance is available
399 * <code>null</code> will be returned.
400 */
401 public ViewContext getNamedViewContext( String name ) {
402 return getNamedViewContext( request.getSession(), name );
403 }
404
405 /**
406 * writes the URL to a WMC with a assigend name into a users session
407 *
408 * @param session
409 * @param name
410 * @param url
411 */
412 public static void setNameContext( HttpSession session, String name, URL url ) {
413 session.setAttribute( SESSION_VIEWCONTEXT + name, url );
414 }
415
416 /**
417 * writes the URL to a WMC with a assigend name into a users session
418 *
419 * @param name
420 * @param url
421 */
422 public void setNameContext( String name, URL url ) {
423 setNameContext( request.getSession(), name, url );
424 }
425
426 }