All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.vfny.geoserver.action.wms.WMSContentAction Maven / Gradle / Ivy

The newest version!
/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org.  All rights reserved.
 * This code is licensed under the GPL 2.0 license, availible at the root
 * application directory.
 */
package org.vfny.geoserver.action.wms;

import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Locale;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.util.MessageResources;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.styling.Style;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.NoSuchAuthorityCodeException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.TransformException;
import org.vfny.geoserver.action.ConfigAction;
import org.vfny.geoserver.action.HTMLEncoder;
import org.vfny.geoserver.config.WMSConfig;
import org.vfny.geoserver.form.wms.WMSContentForm;
import org.vfny.geoserver.global.CoverageInfo;
import org.vfny.geoserver.global.Data;
import org.vfny.geoserver.global.FeatureTypeInfo;
import org.vfny.geoserver.global.MapLayerInfo;
import org.vfny.geoserver.global.UserContainer;


/**
 * DOCUMENT ME!
 *
 * @author rgould To change the template for this generated type comment go to
 *         Window>Preferences>Java>Code Generation>Code and Comments
 */
public final class WMSContentAction extends ConfigAction {
    public ActionForward execute(ActionMapping mapping, ActionForm form, UserContainer user,
        HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
        WMSContentForm contentForm = (WMSContentForm) form;

        Locale locale = (Locale) request.getLocale();
        MessageResources messages = getResources(request);
        final String SUBMIT = HTMLEncoder.decode(messages.getMessage(locale, "label.submit"));
        final String GENERATE_BBOX = HTMLEncoder.decode(messages.getMessage(locale,
                    "config.data.calculateBoundingBox.label"));
        final String ADD_NEW_LAYERGROUP = "Add New Layer-Group";
        final String REMOVE_LAYERGROUP = "Remove";

        String action = contentForm.getAction();
        
        boolean enabled = contentForm.isEnabled();

        if (contentForm.isEnabledChecked() == false) {
            enabled = false;
        }

        String onlineResource = contentForm.getOnlineResource();

        WMSConfig config = getWMSConfig();

        config.setEnabled(enabled);
        config.setOnlineResource(new URL(onlineResource));

        if (SUBMIT.equals(action)) {
            return executeSubmit(mapping, action, contentForm, config, request, response);
        } else if (ADD_NEW_LAYERGROUP.equals(action)) {
            return executeAddNewLayerGroup(mapping, action, contentForm, config, request, response);
        } else if (action.startsWith(REMOVE_LAYERGROUP)) {
            return executeRemoveLayerGroup(mapping, action, contentForm, config, request, response);
        } else if (action.startsWith(GENERATE_BBOX)) {
            return executeGenerateBBOX(mapping, action, contentForm, config, request, response);
        }

        return mapping.findForward("config.wms.content");
    }

    private ActionForward executeGenerateBBOX(ActionMapping mapping, String action,
        WMSContentForm contentForm, WMSConfig config, HttpServletRequest request,
        HttpServletResponse response) {
        HashMap layerMap = new HashMap();
        HashMap styleMap = new HashMap();
        HashMap envelopeMap = new HashMap();

        int selectedLayerIndex = contentForm.getSelectedLayer();

        int bmi;
        Iterator it;

        for (bmi = 0, it = contentForm.getBaseMapTitles().iterator(); it.hasNext(); bmi++) {
            String baseMapTitle = (String) it.next();

            String baseMapLayers = (String) contentForm.getBaseMapLayers().get(bmi);
            String baseMapStyles = (String) contentForm.getBaseMapStyles().get(bmi);
            GeneralEnvelope envelope = (GeneralEnvelope) contentForm.getBaseMapEnvelopes().get(bmi);

            /*
             * System.out.println("******************* contentAction: title=" +
             * baseMapTitle + ", layers=" + baseMapLayers + ", styles=" +
             * baseMapStyles);
             */
            layerMap.put(baseMapTitle, baseMapLayers);
            styleMap.put(baseMapTitle, baseMapStyles);
            envelopeMap.put(baseMapTitle, envelope);

            if (selectedLayerIndex == bmi) {
                String srsName = contentForm.getSrsNameActual( selectedLayerIndex );
                CoordinateReferenceSystem crs = null;
                try {
                    crs = CRS.decode( srsName );
                } 
                catch (Exception e1) {
                    e1.printStackTrace();
                    // TODO Add Action Errors
                    return mapping.findForward("config.wms.content");
                }
                
                Data catalog = (Data) getServlet().getServletContext()
                                          .getAttribute(Data.WEB_CONTAINER_KEY);
                GeneralEnvelope selectedEnvelope = null;
                String[] layerNames = baseMapLayers.split(",");

                for (int i = 0; i < layerNames.length; i++) {
                    String layerName = layerNames[i].trim();

                    Integer layerType = (Integer) catalog.getLayerType(layerName);
                    ReferencedEnvelope layerEnvelope = null;
                    if (layerType != null) {
                        if (layerType.intValue() == MapLayerInfo.TYPE_VECTOR) {
                            FeatureTypeInfo ftype = catalog.getFeatureTypeInfo(layerName);
                            ftype = ((ftype != null) ? ftype
                                                     : catalog.getFeatureTypeInfo(layerName
                                    .substring(layerName.indexOf(":") + 1, layerName.length())));

                            try {
                                if (ftype.getBoundingBox() instanceof ReferencedEnvelope
                                        && !ftype.getBoundingBox().isNull()) {
                                    layerEnvelope = (ReferencedEnvelope) ftype.getBoundingBox();
                                } else {
                                    // TODO Add Action Errors
                                    return mapping.findForward("config.wms.content");
                                }
                            } catch (IOException e) {
                                // TODO Add Action Errors
                                return mapping.findForward("config.wms.content");
                            }
                        } 
                        else if (layerType.intValue() == MapLayerInfo.TYPE_RASTER) {
                            CoverageInfo cv = catalog.getCoverageInfo(layerName);
                            cv = ((cv != null) ? cv
                                               : catalog.getCoverageInfo(layerName.substring(layerName
                                        .indexOf(":") + 1, layerName.length())));

                            layerEnvelope = new ReferencedEnvelope(cv.getEnvelope());
                        }
                        
                        
                        if ( !CRS.equalsIgnoreMetadata(crs, layerEnvelope.getCoordinateReferenceSystem())) {
                            try {
                                layerEnvelope = layerEnvelope.transform(crs, true);
                            } catch (Exception e) {
                                //TODO Add Action Errors    
                                e.printStackTrace();
                                return mapping.findForward("config.wms.content");
                            } 
                        }
                            
                        if ( selectedEnvelope == null ) {
                            selectedEnvelope = new GeneralEnvelope(new double[] {
                                  layerEnvelope.getMinX(), layerEnvelope.getMinY()
                            }, new double[] { layerEnvelope.getMaxX(), layerEnvelope.getMaxY() });
                            selectedEnvelope.setCoordinateReferenceSystem(layerEnvelope.getCoordinateReferenceSystem());
                        }
                        else {
                            ReferencedEnvelope newEnvelope = new ReferencedEnvelope(crs);
                            newEnvelope.init(selectedEnvelope.getLowerCorner().getOrdinate(0),
                              selectedEnvelope.getUpperCorner().getOrdinate(0),
                              selectedEnvelope.getLowerCorner().getOrdinate(1),
                              selectedEnvelope.getUpperCorner().getOrdinate(1));

                            newEnvelope.expandToInclude(layerEnvelope);

                            selectedEnvelope = new GeneralEnvelope(new double[] {
                                      newEnvelope.getMinX(), newEnvelope.getMinY()
                                  },
                                  new double[] { newEnvelope.getMaxX(), newEnvelope.getMaxY() });
                            selectedEnvelope.setCoordinateReferenceSystem(crs);
                        }
                        
                        
                    }
                    
                    if (selectedEnvelope != null) {
                      envelope.setCoordinateReferenceSystem(selectedEnvelope
                          .getCoordinateReferenceSystem());
                      envelope.setEnvelope(selectedEnvelope);
                      envelopeMap.put(baseMapTitle, envelope);
                      contentForm.setBaseMapEnvelope(selectedLayerIndex, envelope);
                    }
                    
                }
            }
        }

        if (selectedLayerIndex < 0) {
            return mapping.findForward("config.wms.content");
        }

        /*config.setBaseMapLayers(layerMap);
        config.setBaseMapStyles(styleMap);
        config.setBaseMapEnvelopes(envelopeMap);*/
        return mapping.findForward("config.wms.content");
    }

    private ActionForward executeRemoveLayerGroup(ActionMapping mapping, String action,
        WMSContentForm contentForm, WMSConfig config, HttpServletRequest request,
        HttpServletResponse response) {
        HashMap layerMap = new HashMap();
        HashMap styleMap = new HashMap();
        HashMap envelopeMap = new HashMap();

        int removedLayerIndex = contentForm.getSelectedLayer();

        if (removedLayerIndex < 0) {
            return mapping.findForward("config.wms.content");
        }

        contentForm.getBaseMapTitles().remove(removedLayerIndex);
        contentForm.getBaseMapLayers().remove(removedLayerIndex);
        contentForm.getBaseMapStyles().remove(removedLayerIndex);
        contentForm.getBaseMapEnvelopes().remove(removedLayerIndex);
        contentForm.getMinCPs().remove(new Integer(removedLayerIndex));
        contentForm.getMaxCPs().remove(new Integer(removedLayerIndex));

        int bmi = 0;
        for (Iterator it = contentForm.getBaseMapTitles().iterator(); it.hasNext();) {
			String baseMapTitle = (String) it.next();

			String baseMapLayers = (String) contentForm.getBaseMapLayers().get(bmi);
			String baseMapStyles = (String) contentForm.getBaseMapStyles().get(bmi);
			GeneralEnvelope envelope = (GeneralEnvelope) contentForm.getBaseMapEnvelopes().get(bmi);

			/*
			 * System.out.println("******************* contentAction: title=" +
			 * baseMapTitle + ", layers=" + baseMapLayers + ", styles=" +
			 * baseMapStyles);
			 */
			layerMap.put(baseMapTitle, baseMapLayers);
			styleMap.put(baseMapTitle, baseMapStyles);
			envelopeMap.put(baseMapTitle, envelope);

			bmi++;
		}

        config.setBaseMapLayers(layerMap);
        config.setBaseMapStyles(styleMap);
        config.setBaseMapEnvelopes(envelopeMap);

        return mapping.findForward("config.wms.content");
    }

    private ActionForward executeAddNewLayerGroup(ActionMapping mapping, String action,
        WMSContentForm contentForm, WMSConfig config, HttpServletRequest request,
        HttpServletResponse response) throws ServletException {
        HashMap layerMap = new HashMap();
        HashMap styleMap = new HashMap();
        HashMap envelopeMap = new HashMap();

        int bmi;
        Iterator it;

        for (bmi = 0, it = contentForm.getBaseMapTitles().iterator(); it.hasNext(); bmi++) {
            String baseMapTitle = (String) it.next();
            String baseMapLayers = (String) contentForm.getBaseMapLayers().get(bmi);
            String baseMapStyles = (String) contentForm.getBaseMapStyles().get(bmi);

            GeneralEnvelope envelope = (GeneralEnvelope) contentForm.getBaseMapEnvelopes().get(bmi);

            /*
                         * System.out.println("******************* contentAction: title=" +
                         * baseMapTitle + ", layers=" + baseMapLayers + ", styles=" +
                         * baseMapStyles);
                         */
            layerMap.put(baseMapTitle, baseMapLayers);
            styleMap.put(baseMapTitle, baseMapStyles);
            envelopeMap.put(baseMapTitle, envelope);
        }

        String name = "";
        int num = 2;

        while ((config.getBaseMapLayers() != null) && (config.getBaseMapLayers().get(name) != null)) {
            name = "";
            num++;
        }

        GeneralEnvelope defaultEnvelope = new GeneralEnvelope(new double[] { -180.0, -90.0 },
                new double[] { 180.0, 90.0 });

        try {
            defaultEnvelope.setCoordinateReferenceSystem(CRS.decode("EPSG:4326"));
        } catch (NoSuchAuthorityCodeException e) {
            throw new ServletException(e);
        } catch (FactoryException e) {
            throw new ServletException(e);
        }

        layerMap.put(name, "");
        styleMap.put(name, "");
        envelopeMap.put(name, defaultEnvelope);

        contentForm.getBaseMapTitles().add(name);
        contentForm.getBaseMapLayers().add("");
        contentForm.getBaseMapStyles().add("");
        contentForm.getBaseMapEnvelopes().add(defaultEnvelope);

        config.setBaseMapLayers(layerMap);
        config.setBaseMapStyles(styleMap);
        config.setBaseMapEnvelopes(envelopeMap);

        return mapping.findForward("config.wms.content");
    }

    private ActionForward executeSubmit(ActionMapping mapping, String action,
            WMSContentForm contentForm, WMSConfig config, HttpServletRequest request,
            HttpServletResponse response) {
            HashMap layerMap = new HashMap();
            HashMap styleMap = new HashMap();
            HashMap envelopeMap = new HashMap();
            Set capabilitiesCrsList =  contentForm.getCapabilitiesCrsList();

            int bmi;
            Iterator it;

            for (bmi = 0, it = contentForm.getBaseMapTitles().iterator(); it.hasNext(); bmi++) {
                String baseMapTitle = (String) it.next();
                String baseMapLayers = (String) contentForm.getBaseMapLayers().get(bmi);
                String baseMapStyles = (String) contentForm.getBaseMapStyles().get(bmi);
                GeneralEnvelope envelope = (GeneralEnvelope) contentForm.getBaseMapEnvelopes().get(bmi);

                /*System.out.println("******************* contentAction: title=" + baseMapTitle + ", layers="
                + baseMapLayers + ", styles=" + baseMapStyles);*/
                Data catalog = (Data) getServlet().getServletContext()
                                          .getAttribute(Data.WEB_CONTAINER_KEY);

                GeneralEnvelope selectedEnvelope = null;
                String[] layerNames = baseMapLayers.split(",");
                String[] styles = baseMapStyles.split("\\s*,\\s*");

                for (int i = 0; i < layerNames.length; i++) {
                    String layerName = layerNames[i].trim();

                    Integer layerType = (Integer) catalog.getLayerType(layerName);

                    if (layerType == null) {
                        ActionErrors errors = new ActionErrors();
                        errors.add(ActionErrors.GLOBAL_ERROR,
                            new ActionError("errors.invalid", "Layer " + layerName));
                        saveErrors(request, errors);

                        return mapping.findForward("config.wms.content");
                    }
                }

                for (int i = 0; i < styles.length; i++) {
                    String styleName = styles[i].trim();

                    Style style = catalog.getStyle(styleName);

                    if ((style == null) && !"".equals(styleName)) {
                        ActionErrors errors = new ActionErrors();
                        errors.add(ActionErrors.GLOBAL_ERROR,
                            new ActionError("error.styleId.notFound", styleName));
                        saveErrors(request, errors);

                        return mapping.findForward("config.wms.content");
                    }
                }

                layerMap.put(baseMapTitle, baseMapLayers);
                styleMap.put(baseMapTitle, baseMapStyles);
                envelopeMap.put(baseMapTitle, envelope);
            }

            config.setBaseMapLayers(layerMap);
            config.setBaseMapStyles(styleMap);
            config.setBaseMapEnvelopes(envelopeMap);
            config.setCapabilitiesCrs(capabilitiesCrsList);

            getApplicationState().notifyConfigChanged();

            return mapping.findForward("config");
        }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy