001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/portal/portlet/modules/map/actions/portlets/MapActionPortletAction.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.map.actions.portlets;
037    
038    import java.lang.reflect.Constructor;
039    import java.util.Map;
040    
041    import javax.servlet.http.HttpServletRequest;
042    
043    import org.apache.jetspeed.modules.actions.portlets.JspPortletAction;
044    import org.apache.jetspeed.portal.Portlet;
045    import org.apache.turbine.om.security.User;
046    import org.apache.turbine.util.RunData;
047    import org.deegree.framework.log.ILogger;
048    import org.deegree.framework.log.LoggerFactory;
049    import org.deegree.framework.util.KVP2Map;
050    import org.deegree.portal.PortalException;
051    
052    /**
053     *
054     *
055     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
056     * @author last edited by: $Author: mschneider $
057     *
058     * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
059     */
060    public class MapActionPortletAction extends JspPortletAction {
061    
062        private ILogger LOG = LoggerFactory.getLogger( MapActionPortletAction.class );
063    
064        /**
065         * @throws Exception
066         *
067         */
068        @Override
069        protected void buildNormalContext( Portlet portlet, RunData data )
070                                throws Exception {
071    
072            try {
073                MapActionPortletPerform mapp = new MapActionPortletPerform( data.getRequest(), portlet,
074                                                                            data.getServletContext() );
075                mapp.buildNormalContext();
076                data.getRequest().setAttribute( "User", data.getUser().getUserName() );
077                data.getRequest().setAttribute( "Password", data.getUser().getPassword() );
078            } catch ( Exception e ) {
079                throw e;
080            }
081    
082        }
083    
084        /**
085         * Changes the CRS of the underlying ViewContext. The actual action is implemented by the
086         * <code>CRSChooserPortletPerform</code>.
087         *
088         * @param data
089         * @param portlet
090         * @throws PortalException
091         */
092        public void doCrschoose( RunData data, Portlet portlet )
093                                throws PortalException {
094    
095            try {
096                Portlet port = portlet.getPortletConfig().getPortletSet().getPortletByName( "iGeoPortal:CRSChooserPortlet" );
097                CRSChooserPortletPerform ccpp = new CRSChooserPortletPerform( data.getRequest(), port,
098                                                                              data.getServletContext() );
099                ccpp.doCRSChange();
100            } catch ( Exception e ) {
101                LOG.logError( e.getMessage(), e );
102                throw new PortalException( e.getMessage() );
103            }
104        }
105    
106        /**
107         * returns the MapWindowPortlet targeted by the current action
108         *
109         * @param rundata
110         * @param portlet
111         * @return the MapWindowPortlet targeted by the current action
112         */
113        private Portlet getMapWindowPortlet( RunData rundata, Portlet portlet ) {
114            Map map = KVP2Map.toMap( rundata.getRequest() );
115            String id = (String) map.get( "MAPPORTLET" );
116            Portlet port = portlet.getPortletConfig().getPortletSet().getPortletByID( id );
117            return port;
118        }
119    
120        /**
121         *
122         * @param data
123         * @param portlet
124         * @throws Exception
125         */
126        public void doFeatureinfo( RunData data, Portlet portlet )
127                                throws Exception {
128    
129            try {
130                HttpServletRequest req = data.getRequest();
131                req.setAttribute( "$U$", data.getUser().getUserName() );
132                req.setAttribute( "$P$", data.getUser().getPassword() );
133                Portlet port = getMapWindowPortlet( data, portlet );
134                FeatureInfoPortletPerform fipp = new FeatureInfoPortletPerform( req, port, data.getServletContext() );
135                fipp.doGetFeatureInfo();
136            } catch ( Exception e ) {
137                e.printStackTrace();
138            }
139    
140        }
141    
142        /**
143         *
144         * @param data
145         * @param portlet
146         * @throws Exception
147         */
148        public void doFeatureinfoForward( RunData data, Portlet portlet )
149                                throws Exception {
150    
151            try {
152                Portlet port = getMapWindowPortlet( data, portlet );
153                String className = portlet.getPortletConfig().getInitParameter( "performingClass" );
154                Class[] classes = new Class[3];
155                classes[0] = data.getRequest().getClass();
156                classes[1] = port.getClass();
157                classes[2] = data.getRequest().getClass();
158                Object[] o = new Object[3];
159                o[0] = data.getRequest();
160                o[1] = portlet;
161                o[2] = data.getRequest();
162    
163                Class clss = Class.forName( className );
164                Constructor constructor = clss.getConstructor( classes );
165                constructor.newInstance( o );
166    
167                FeatureInfoForwardPortletPerform fifpp = (FeatureInfoForwardPortletPerform) constructor.newInstance( o );
168                fifpp.doGetFeatureInfo();
169            } catch ( Exception e ) {
170                e.printStackTrace();
171            }
172    
173        }
174    
175        /**
176         * sets a new bounding box for the current ViewContext.
177         *
178         * @param data
179         * @param portlet
180         */
181        public void doSetboundingbox( RunData data, Portlet portlet ) {
182            try {
183                Portlet port = getMapWindowPortlet( data, portlet );
184                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( data.getRequest(), port,
185                                                                            data.getServletContext() );
186                mwpp.setBoundingBoxFromBBOXParam();
187                mwpp.setLayers();
188                mwpp.setCurrentFILayer();
189            } catch ( Exception e ) {
190                e.printStackTrace();
191            }
192        }
193    
194        /**
195         * sets the maps boundingbox to the defined home boundingbox
196         *
197         * @param data
198         * @param portlet
199         */
200        public void doSethomeboundingbox( RunData data, Portlet portlet ) {
201            try {
202                Portlet port = getMapWindowPortlet( data, portlet );
203                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( data.getRequest(), port,
204                                                                            data.getServletContext() );
205                mwpp.setHomeBoundingbox();
206                // mwpp.setLayers( port.getID() );
207                // mwpp.setCurrentFILayer();
208            } catch ( Exception e ) {
209                e.printStackTrace();
210            }
211    
212        }
213    
214        /**
215         * sets a new size of the map (pixel)
216         *
217         * @param rundata
218         * @param portlet
219         * @throws Exception
220         */
221        public void doSetmapsize( RunData rundata, Portlet portlet )
222                                throws Exception {
223            try {
224                Portlet port = getMapWindowPortlet( rundata, portlet );
225                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
226                                                                            rundata.getServletContext() );
227                mwpp.setMapSize();
228                mwpp.setBoundingBoxFromBBOXParam();
229                mwpp.setLayers();
230                mwpp.setCurrentFILayer();
231            } catch ( Exception e ) {
232                e.printStackTrace();
233            }
234        }
235    
236        /**
237         * Performs a repaint of the current ViewContext by regenerating the assigend OWS requests. In opposite to
238         * <code>doActualizeViewContext(RunData, Portlet)</code> no parameters from the client are solved to actualize the
239         * current ViewContext.
240         *
241         * @param rundata
242         * @param portlet
243         * @throws Exception
244         */
245        public void doRepaint( RunData rundata, Portlet portlet )
246                                throws Exception {
247            try {
248                Portlet port = getMapWindowPortlet( rundata, portlet );
249                if ( port != null ) {
250                    MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
251                                                                                rundata.getServletContext() );
252                    mwpp.setBoundingBoxFromBBOXParam();
253                    mwpp.setLayers();
254                    mwpp.setCurrentFILayer();
255                    mwpp.setMode();
256                }
257            } catch ( Exception e ) {
258                e.printStackTrace();
259            }
260        }
261    
262        /**
263         * performs a zoomIn or a zoomOut on the current map model (ViewContext)
264         *
265         * @param rundata
266         * @param portlet
267         * @throws Exception
268         */
269        public void doZoom( RunData rundata, Portlet portlet )
270                                throws Exception {
271            try {
272                Portlet port = getMapWindowPortlet( rundata, portlet );
273                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
274                                                                            rundata.getServletContext() );
275                mwpp.zoom();
276                mwpp.setLayers();
277                mwpp.setCurrentFILayer();
278            } catch ( Exception e ) {
279                e.printStackTrace();
280            }
281        }
282    
283        /**
284         * performs a panning on the current map model (ViewContext)
285         *
286         * @param rundata
287         * @param portlet
288         * @throws Exception
289         */
290        public void doPan( RunData rundata, Portlet portlet )
291                                throws Exception {
292            try {
293                Portlet port = getMapWindowPortlet( rundata, portlet );
294                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
295                                                                            rundata.getServletContext() );
296                mwpp.pan();
297                mwpp.setLayers();
298                mwpp.setCurrentFILayer();
299            } catch ( Exception e ) {
300                e.printStackTrace();
301            }
302        }
303    
304        /**
305         * performs a recentering on the current map model (ViewContext)
306         *
307         * @param rundata
308         * @param portlet
309         * @throws Exception
310         */
311        public void doRecenter( RunData rundata, Portlet portlet )
312                                throws Exception {
313            try {
314                Portlet port = getMapWindowPortlet( rundata, portlet );
315                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
316                                                                            rundata.getServletContext() );
317                mwpp.recenter();
318                mwpp.setLayers();
319                mwpp.setCurrentFILayer();
320            } catch ( Exception e ) {
321                e.printStackTrace();
322            }
323        }
324    
325        /**
326         * sets layers of the view context as visible or invisble depending on the incoming request
327         *
328         * @param rundata
329         * @param portlet
330         *
331         * @throws Exception
332         */
333        public void doSetlayers( RunData rundata, Portlet portlet )
334                                throws Exception {
335            try {
336                Portlet port = getMapWindowPortlet( rundata, portlet );
337                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
338                                                                            rundata.getServletContext() );
339                mwpp.setLayers();
340                mwpp.setBoundingBoxFromBBOXParam();
341                mwpp.setCurrentFILayer();
342            } catch ( Exception e ) {
343                e.printStackTrace();
344            }
345        }
346    
347        /**
348         * moves the layer passed through by the HTTP request up for one position
349         *
350         * @param rundata
351         * @param portlet
352         * @throws Exception
353         */
354        public void doMoveup( RunData rundata, Portlet portlet )
355                                throws Exception {
356            try {
357                Portlet port = getMapWindowPortlet( rundata, portlet );
358                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
359                                                                            rundata.getServletContext() );
360                mwpp.setLayers();
361                mwpp.moveUp();
362                mwpp.setBoundingBoxFromBBOXParam();
363                mwpp.setCurrentFILayer();
364            } catch ( Exception e ) {
365                e.printStackTrace();
366            }
367        }
368    
369        /**
370         * moves the layer passed through by the HTTP request down for one position
371         *
372         * @param rundata
373         * @param portlet
374         * @throws Exception
375         */
376        public void doMovedown( RunData rundata, Portlet portlet )
377                                throws Exception {
378            try {
379                Portlet port = getMapWindowPortlet( rundata, portlet );
380                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
381                                                                            rundata.getServletContext() );
382                mwpp.setLayers();
383                mwpp.moveDown();
384                mwpp.setBoundingBoxFromBBOXParam();
385                mwpp.setCurrentFILayer();
386            } catch ( Exception e ) {
387                e.printStackTrace();
388            }
389        }
390    
391        /**
392         * move the map view (just bounding box) to the next entry in the history
393         *
394         * @param rundata
395         * @param portlet
396         * @throws Exception
397         */
398        public void doHistoryforward( RunData rundata, Portlet portlet )
399                                throws Exception {
400            try {
401                Portlet port = getMapWindowPortlet( rundata, portlet );
402                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
403                                                                            rundata.getServletContext() );
404                mwpp.setLayers();
405                mwpp.setCurrentFILayer();
406                mwpp.doHistoryforward();
407            } catch ( Exception e ) {
408                e.printStackTrace();
409            }
410        }
411    
412        /**
413         * move the map view (just bounding box) to the previous entry in the history
414         *
415         * @param rundata
416         * @param portlet
417         * @throws Exception
418         */
419        public void doHistorybackward( RunData rundata, Portlet portlet )
420                                throws Exception {
421            try {
422                Portlet port = getMapWindowPortlet( rundata, portlet );
423                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
424                                                                            rundata.getServletContext() );
425                mwpp.setLayers();
426                mwpp.setCurrentFILayer();
427                mwpp.doHistorybackward();
428            } catch ( Exception e ) {
429                e.printStackTrace();
430            }
431        }
432    
433        /**
434         *
435         * @param rundata
436         * @param portlet
437         * @throws Exception
438         */
439        public void doAddows( RunData rundata, Portlet portlet )
440                                throws Exception {
441            try {
442                Portlet port = getMapWindowPortlet( rundata, portlet );
443                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
444                                                                            rundata.getServletContext() );
445                mwpp.doAddows();
446            } catch ( Exception e ) {
447                e.printStackTrace();
448            }
449        }
450    
451        /**
452         *
453         * @param rundata
454         * @param portlet
455         * @throws Exception
456         */
457        public void doRemoveows( RunData rundata, Portlet portlet )
458                                throws Exception {
459            try {
460                Portlet port = getMapWindowPortlet( rundata, portlet );
461                MapWindowPortletPerform mwpp = new MapWindowPortletPerform( rundata.getRequest(), port,
462                                                                            rundata.getServletContext() );
463                mwpp.doRemoveows();
464            } catch ( Exception e ) {
465                e.printStackTrace();
466            }
467        }
468    
469        /**
470         * selects the current context of a MapWindowPortlet
471         *
472         * @param data
473         * @param portlet
474         * @throws PortalException
475         */
476        public void doSelectwmc( RunData data, Portlet portlet )
477                                throws PortalException {
478            try {
479                Portlet port = portlet.getPortletConfig().getPortletSet().getPortletByName( "iGeoPortal:SelectWMCPortlet" );
480                SelectWMCPortletPerform swp = new SelectWMCPortletPerform( data.getRequest(), port,
481                                                                           data.getServletContext() );
482                swp.doSelectwmc();
483            } catch ( Exception e ) {
484                e.printStackTrace();
485                LOG.logError( e.getMessage(), e );
486                throw new PortalException( e.getMessage() );
487            }
488        }
489    
490        /**
491         * selects the current context of a MapWindowPortlet
492         *
493         * @param data
494         * @param portlet
495         * @throws PortalException
496         */
497        public void doLoadwmc( RunData data, Portlet portlet )
498                                throws PortalException {
499            try {
500                Portlet port = portlet.getPortletConfig().getPortletSet().getPortletByName( "iGeoPortal:SelectWMCPortlet" );
501                SelectWMCPortletPerform swp = new SelectWMCPortletPerform( data.getRequest(), port,
502                                                                           data.getServletContext() );
503                User user = data.getUser();
504                org.deegree.security.drm.model.User du = null;
505                if ( !"anon".equals( user.getUserName() ) ) {
506                    du = new org.deegree.security.drm.model.User( 1, user.getUserName(), user.getPassword(),
507                                                                  user.getFirstName(), user.getLastName(), user.getEmail(),
508                                                                  null );
509                }
510                swp.doLoadwmc( du );
511            } catch ( Exception e ) {
512                e.printStackTrace();
513                LOG.logError( e.getMessage(), e );
514                throw new PortalException( e.getMessage() );
515            }
516        }
517    
518        /**
519         * Changes the scale.
520         *
521         * @param data
522         * @param portlet
523         * @throws PortalException
524         */
525        public void doChangescale( RunData data, Portlet portlet )
526                                throws PortalException {
527            try {
528                Portlet port = portlet.getPortletConfig().getPortletSet().getPortletByName(
529                                                                                            "iGeoPortal:ScaleChooserPortlet" );
530                ScaleChooserPortletPerform swp = new ScaleChooserPortletPerform( data.getRequest(), port,
531                                                                                 data.getServletContext() );
532                swp.doChangeScale();
533            } catch ( Exception e ) {
534                LOG.logError( e.getMessage(), e );
535                throw new PortalException( e.getMessage() );
536            }
537        }
538    }