org.geoserver.qos.web.BaseLimitedConstraintsPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.qos.web.BaseLimitedConstraintsPanel.java

Source

/*
 * (c) 2018 Open Source Geospatial Foundation - all rights reserved
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.qos.web;

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.ListMultipleChoice;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.geoserver.catalog.CatalogBuilder;
import org.geoserver.catalog.LayerGroupInfo;
import org.geoserver.qos.QosData;
import org.geoserver.qos.xml.AreaConstraint;
import org.geoserver.qos.xml.LimitedAreaRequestConstraints;
import org.geoserver.web.GeoServerApplication;
import org.geoserver.web.wicket.EnvelopePanel;
import org.geoserver.web.wicket.GeoServerAjaxFormLink;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.locationtech.jts.geom.Envelope;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

public abstract class BaseLimitedConstraintsPanel<T extends LimitedAreaRequestConstraints> extends Panel {

    protected SerializableConsumer<AjaxTargetAndModel<T>> onDelete;
    protected IModel<T> mainModel;
    protected WebMarkupContainer mainDiv;
    protected ModalWindow selectLayerModal;
    protected WebMarkupContainer layersDiv;
    protected WebMarkupContainer innerConstraintsDiv;
    protected EnvelopePanel envelopePanel;
    protected IModel<ReferencedEnvelope> envelopeModel;
    protected LayersListBuilder<T> layersBuilder;

    public BaseLimitedConstraintsPanel(String id, IModel<T> model, LayersListBuilder<T> layersBuilder) {
        super(id, model);
        mainModel = model;
        if (mainModel.getObject().getLayerNames() == null)
            mainModel.getObject().setLayerNames(new ArrayList<String>());
        this.layersBuilder = layersBuilder;
        initAllComponents();
    }

    @Override
    protected void onInitialize() {
        super.onInitialize();
    }

    protected void initAllComponents() {
        selectLayerModal = new ModalWindow("selectLayerModal");
        add(selectLayerModal);

        mainDiv = new WebMarkupContainer("mainDiv");
        mainDiv.setOutputMarkupId(true);
        add(mainDiv);

        innerConstraintsDiv = new WebMarkupContainer("innerConstraintsDiv") {
            @Override
            protected void onConfigure() {
                super.onConfigure();
                if (CollectionUtils.isNotEmpty(getSelectedLayers())) {
                    this.setVisible(true);
                } else {
                    this.setVisible(false);
                }
            }
        };
        innerConstraintsDiv.setOutputMarkupId(true);
        innerConstraintsDiv.setOutputMarkupPlaceholderTag(true);
        mainDiv.add(innerConstraintsDiv);

        initLayersComponents();
        initFormatsComponents();
        initBoundsComponent();
    }

    private void initBoundsComponent() {
        envelopeModel = new Model<ReferencedEnvelope>() {
            @Override
            public ReferencedEnvelope getObject() {
                if (mainModel.getObject().getAreaConstraint() == null) {
                    mainModel.getObject().setAreaConstraint(new AreaConstraint());
                }
                AreaConstraint ac = mainModel.getObject().getAreaConstraint();
                // if no complete values present, return null
                // if (ac == null || mainModel.getObject().getCrs() == null) return null;
                Envelope env;
                if (ac.getMinX() == null || ac.getMaxX() == null || ac.getMinY() == null || ac.getMaxY() == null) {
                    env = new Envelope();
                } else {
                    env = new Envelope(ac.getMinX(), ac.getMaxX(), ac.getMinY(), ac.getMaxY());
                }
                CoordinateReferenceSystem crs = null;
                if (StringUtils.isNotEmpty(mainModel.getObject().getCrs())) {
                    try {
                        crs = CRS.decode(mainModel.getObject().getCrs());
                    } catch (FactoryException e) {
                        throw new RuntimeException(e);
                    }
                }
                return ReferencedEnvelope.create(env, crs);
            }

            @Override
            public void setObject(ReferencedEnvelope env) {
                if (env == null) {
                    mainModel.getObject().setAreaConstraint(null);
                    mainModel.getObject().setCrs(null);
                }
                mainModel.getObject().setAreaConstraint(
                        new AreaConstraint(env.getMinX(), env.getMinY(), env.getMaxX(), env.getMaxY()));
                try {
                    mainModel.getObject().setCrs(CRS.lookupIdentifier(env.getCoordinateReferenceSystem(), true));
                } catch (FactoryException e) {
                    throw new RuntimeException(e);
                }
            }
        };
        envelopePanel = new EnvelopePanel("bounds", envelopeModel);
        envelopePanel.setRequired(true);
        envelopePanel.setCRSFieldVisible(true);
        envelopePanel.setCrsRequired(true);
        envelopePanel.setOutputMarkupId(true);
        innerConstraintsDiv.add(envelopePanel);

        final GeoServerAjaxFormLink generateBoundsLink = new GeoServerAjaxFormLink("generateBounds") {
            @Override
            protected void onAfterSubmit(AjaxRequestTarget target, Form<?> form) {
                super.onAfterSubmit(target, form);
                if (CollectionUtils.isEmpty(getSelectedLayers()))
                    return;
                GeoServerApplication gsa = (GeoServerApplication) getApplication();
                LayerGroupInfo lg = gsa.getCatalog().getFactory().createLayerGroup();
                getSelectedLayers().forEach(l -> {
                    lg.getLayers().add(gsa.getCatalog().getLayerByName(l));
                });
                try {
                    CoordinateReferenceSystem crs = envelopePanel.getCoordinateReferenceSystem();
                    // CRS.decode(envelopePanel.getCoordinateReferenceSystem());
                    if (crs != null) {
                        new CatalogBuilder(gsa.getCatalog()).calculateLayerGroupBounds(lg, crs);
                    } else {
                        // calculate from scratch
                        new CatalogBuilder(gsa.getCatalog()).calculateLayerGroupBounds(lg);
                    }
                    ReferencedEnvelope renv = lg.getBounds();
                    envelopePanel.setModelObject(renv);
                } catch (Exception e) {
                    throw new WicketRuntimeException(e);
                }
                target.add(mainDiv);
            }

            @Override
            protected void onClick(AjaxRequestTarget target, Form<?> form) {
            }
        };
        innerConstraintsDiv.add(generateBoundsLink);

        final GeoServerAjaxFormLink generateBoundsFromCRSLink = new GeoServerAjaxFormLink("generateBoundsFromCRS") {
            @Override
            protected void onAfterSubmit(AjaxRequestTarget target, Form<?> form) {
                super.onAfterSubmit(target, form);
                try {
                    CoordinateReferenceSystem crs = envelopePanel.getCoordinateReferenceSystem();
                    if (crs == null)
                        return;
                    ReferencedEnvelope refEnv = new ReferencedEnvelope(CRS.getEnvelope(crs));
                    envelopePanel.setModelObject(refEnv);
                    envelopePanel.modelChanged();
                    target.add(envelopePanel);
                } catch (Exception e) {
                    throw new WicketRuntimeException(e);
                }
            }

            @Override
            protected void onClick(AjaxRequestTarget target, Form<?> form) {
            }
        };
        innerConstraintsDiv.add(generateBoundsFromCRSLink);
    }

    public void setOnDelete(SerializableConsumer<AjaxTargetAndModel<T>> onDelete) {
        this.onDelete = onDelete;
    }

    private void initFormatsComponents() {
        final WebMarkupContainer formatsDiv = new WebMarkupContainer("formatsDiv");
        formatsDiv.setOutputMarkupId(true);
        innerConstraintsDiv.add(formatsDiv);

        // multi select
        final ListMultipleChoice<String> formatsChoice = new ListMultipleChoice<>("formatsChoice",
                new PropertyModel<>(mainModel, "outputFormat"), getOutputFormats());
        formatsDiv.add(formatsChoice);
    }

    protected List<String> getOutputFormats() {
        return QosData.instance().getWmsOutputFormats();
    }

    protected IModel<T> getMainModel() {
        return mainModel;
    }

    public void setMainModel(IModel<T> mainModel) {
        this.mainModel = mainModel;
    }

    protected WebMarkupContainer getMainDiv() {
        return mainDiv;
    }

    protected void initLayersComponents() {
        layersDiv = layersBuilder.build(mainDiv, selectLayerModal, mainModel);
    }

    protected abstract List<String> getSelectedLayers();
}