/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.widget.layer.client.presenter; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; import org.geomajas.geometry.Bbox; import org.geomajas.geometry.Coordinate; import org.geomajas.gwt.client.map.layer.ClientWmsLayer; import org.geomajas.gwt.client.map.layer.configuration.ClientWmsLayerInfo; import org.geomajas.gwt.client.widget.MapWidget; import org.geomajas.gwt2.client.map.layer.tile.TileConfiguration; import org.geomajas.gwt2.plugin.wms.client.WmsClient; import org.geomajas.gwt2.plugin.wms.client.capabilities.WmsGetCapabilitiesInfo; import org.geomajas.gwt2.plugin.wms.client.capabilities.WmsLayerInfo; import org.geomajas.gwt2.plugin.wms.client.layer.WmsLayerConfiguration; import org.geomajas.gwt2.plugin.wms.client.service.WmsService; import org.geomajas.widget.layer.client.Layer; import com.google.gwt.core.client.Callback; /** * Default implementation of {@link RemovableLayerListPresenter}. * * @author Jan Venstermans * */ public class CreateClientWmsPresenterImpl implements CreateClientWmsPresenter, CreateClientWmsPresenter.ControllersButtonHandler, CreateClientWmsPresenter.GetCapabilitiesHandler, CreateClientWmsPresenter.SelectLayerHandler, CreateClientWmsPresenter.EditLayerSettingsHandler { private static Logger logger = Logger.getLogger(CreateClientWmsPresenterImpl.class.getName()); private ControllerButtonsView controllerButtonsWindow; private MapWidget mapWidget; /* wizard panels */ private List<WizardStepView> wizardSteps = new ArrayList<WizardStepView>(); private GetCapabilitiesView getCapabilitiesView; private SelectLayerView selectLayerView; private EditLayerSettingsView editLayerSettingsView; private WizardStepView currentStep; /* selected layer info */ private WmsSelectedLayerInfo wmsSelectedLayerInfo; private List<WmsLayerInfo> wmsLayerInfos = new ArrayList<WmsLayerInfo>(); public CreateClientWmsPresenterImpl(MapWidget mapWidget) { this.mapWidget = mapWidget; this.wmsSelectedLayerInfo = new WmsSelectedLayerInfo(); controllerButtonsWindow = Layer.getViewFactory().createControllerButtonsView(); controllerButtonsWindow.setControllersButtonHandler(this); // set all buttons visible controllerButtonsWindow.setNextButtonVisible(true); controllerButtonsWindow.setPreviousButtonVisible(true); controllerButtonsWindow.setCancelButtonVisible(true); controllerButtonsWindow.setSaveButtonVisible(true); // set next previous and save button disabled controllerButtonsWindow.setNextButtonEnabled(false); controllerButtonsWindow.setPreviousButtonEnabled(false); controllerButtonsWindow.setCancelButtonEnabled(true); controllerButtonsWindow.setSaveButtonEnabled(false); // steps getCapabilitiesView = Layer.getViewFactory().createGetCapabilitiesView(); getCapabilitiesView.setGetCapabilitiesHandler(this); wizardSteps.add(getCapabilitiesView); selectLayerView = Layer.getViewFactory().createSelectLayerView(); selectLayerView.setSelectLayerFromCapabilitiesHandler(this); wizardSteps.add(selectLayerView); editLayerSettingsView = Layer.getViewFactory().createEditLayerSettingsView(); editLayerSettingsView.setEditLayerSettingsHandler(this); wizardSteps.add(editLayerSettingsView); loadWizardStepsInWindow(); WmsClient.getInstance().getWmsService().setWmsUrlTransformer(new WmsService.WmsUrlTransformer() { @Override public String transform(WmsService.WmsRequest request, String url) { switch (request) { case GETCAPABILITIES: case GETFEATUREINFO: return "d/proxy?url=" + url; default: return url; } } }); } private void loadWizardStepsInWindow() { for (WizardStepView view : wizardSteps) { view.getWidget().setVisible(false); controllerButtonsWindow.getPanelContainer().addChild(view.getWidget()); } } @Override public void createClientWmsLayer() { showStep(0); controllerButtonsWindow.show(); } public void setWmsLayerInfos(List<WmsLayerInfo> wmsLayerInfoList) { // do filter out wms layers with crs of map => info of layers is not complete on GetCapabilities this.wmsLayerInfos = new ArrayList<WmsLayerInfo>(); for (WmsLayerInfo wmsLayerInfo : wmsLayerInfoList) { wmsLayerInfos.add(wmsLayerInfo); } selectLayerView.setWmsLayersData(wmsLayerInfos); } /* Handler methods */ /* CreateClientWmsPresenter.ControllersButtonHandler */ @Override public void onSave() { onNext(); } @Override public void onCancel() { logger.info("Client WMS wizard finished without creating a ClientWmsLayerInfo object."); hideAndCleanWindow(); } @Override public void onNext() { if (currentStep.isValid()) { currentStep.sendDataToHandler(); } else { setWarningLabelText(currentStep.getInvalidMessage(), true); } } @Override public void onPrevious() { goToPreviousStep(); } /* CreateClientWmsPresenter.GetCapabilitiesHandler */ @Override public void onFinisStepGetCapabilities(String url, String userName, String password) { if (checkFullWmsUrl(url)) { WmsClient.getInstance().getWmsService().getCapabilities(wmsSelectedLayerInfo.getBaseWmsUrl(), wmsSelectedLayerInfo.getWmsVersion(), new Callback<WmsGetCapabilitiesInfo, String>() { @Override public void onFailure(String s) { } @Override public void onSuccess(WmsGetCapabilitiesInfo wmsGetCapabilitiesInfo) { controllerButtonsWindow.setWarningLabelText(null, false); if (currentStep instanceof GetCapabilitiesView) { setWmsLayerInfos(wmsGetCapabilitiesInfo.getLayers()); goToNextStep(); } } }); } else { setWarningLabelText(currentStep.getInvalidMessage(), true); } } /* CreateClientWmsPresenter.SelectLayerHandler */ @Override public void onFinishStepSelectLayer(WmsLayerInfo layerInfo) { wmsSelectedLayerInfo.setWmsLayerInfo(layerInfo); goToNextStep(); } /* CreateClientWmsPresenter.EditLayerSettingsHandler */ @Override public void onFinishStepSetLayerName(String layerName) { wmsSelectedLayerInfo.setName(layerName); goToNextStep(); } /* WizardStepHandler */ @Override public void setWarningLabelText(String text, boolean error) { controllerButtonsWindow.setWarningLabelText(text, error); } /** * Factory method for {@link ClientWmsLayerInfo} from * {@link org.geomajas.widget.layer.client.presenter.WmsSelectedLayerInfo} and {@link MapWidget}. * Could be a static method in a util class. * * @param wmsSelectedLayerInfo * @param mapWidget * @return */ public ClientWmsLayerInfo createClientWmsLayerInfo(WmsSelectedLayerInfo wmsSelectedLayerInfo, MapWidget mapWidget) { WmsLayerConfiguration wmsConfig = new WmsLayerConfiguration(); wmsConfig.setFormat("image/png"); wmsConfig.setLayers(wmsSelectedLayerInfo.getWmsLayerInfo().getName()); wmsConfig.setVersion(wmsSelectedLayerInfo.getWmsVersion()); wmsConfig.setBaseUrl(wmsSelectedLayerInfo.getBaseWmsUrl()); wmsConfig.setTransparent(true); wmsConfig.setMaximumResolution(Double.MAX_VALUE); wmsConfig.setMinimumResolution(1 / mapWidget.getMapModel().getMapInfo().getMaximumScale()); wmsConfig.setCrs(mapWidget.getMapModel().getCrs()); Bbox bounds = wmsSelectedLayerInfo.getWmsLayerInfo().getBoundingBox(mapWidget.getMapModel().getCrs()); if (bounds == null) { bounds = mapWidget.getMapModel().getMapInfo().getInitialBounds(); } TileConfiguration tileConfig = new TileConfiguration(256, 256, new Coordinate(bounds.getX(), bounds.getY()), mapWidget.getMapModel().getMapView().getResolutions()); ClientWmsLayer wmsLayer = new ClientWmsLayer(wmsSelectedLayerInfo.getName(), mapWidget.getMapModel().getCrs(), wmsConfig, tileConfig, wmsSelectedLayerInfo.getWmsLayerInfo()); ClientWmsLayerInfo wmsLayerInfo = new ClientWmsLayerInfo(wmsLayer); return wmsLayerInfo; } /* private methods */ private void showStep(int index) { if (index >= 0 && index < wizardSteps.size()) { currentStep = wizardSteps.get(index); // only show current step for (WizardStepView view : wizardSteps) { view.getWidget().setVisible(currentStep == view); } controllerButtonsWindow.setSubTitle(currentStep.getTitle()); controllerButtonsWindow.setPreviousButtonEnabled(index > 0); controllerButtonsWindow.setNextButtonEnabled(index + 1 < wizardSteps.size()); controllerButtonsWindow.setWarningLabelText(null, false); //only allow save on last step controllerButtonsWindow.setSaveButtonEnabled(index + 1 == wizardSteps.size()); logger.info("Client WMS layer wizard, current step " + (currentStep != null ? currentStep.getClass().toString() : "none")); } else { hideAndCleanWindow(); } } private void goToNextStep() { int index = wizardSteps.indexOf(currentStep) + 1; if (index == wizardSteps.size()) { finishWizard(); } else { showStep(index); } } private void goToPreviousStep() { showStep(wizardSteps.indexOf(currentStep) - 1); } private void finishWizard() { ClientWmsLayerInfo wmsLayerInfo = createClientWmsLayerInfo(wmsSelectedLayerInfo, mapWidget); logger.info("Client WMS wizard finished successfully, " + "created ClientWmsLayerInfo: " + wmsLayerInfo.toString()); currentStep = null; hideAndCleanWindow(); mapWidget.getMapModel().addLayer(wmsLayerInfo); logger.info("added layer to MapModel: " + wmsLayerInfo.toString()); } private void hideAndCleanWindow() { for (WizardStepView stepView : wizardSteps) { stepView.clear(); } controllerButtonsWindow.hide(); } private boolean checkFullWmsUrl(String url) { if (url != null && url.contains("?")) { String baseUrl = url.substring(0, url.indexOf("?")); String parameterPart = url.substring(url.indexOf("?") + 1).toLowerCase(); if (!baseUrl.isEmpty() && parameterPart.contains("service=wms") && parameterPart.contains("request=getcapabilities") && parameterPart.contains("version=")) { WmsService.WmsVersion version = null; if (parameterPart.contains("version=1.1.1")) { version = WmsService.WmsVersion.V1_1_1; } else if (parameterPart.contains("version=1.3.0")) { version = WmsService.WmsVersion.V1_3_0; } if (version != null) { wmsSelectedLayerInfo.setBaseWmsUrl(baseUrl); wmsSelectedLayerInfo.setWmsVersion(version); return true; } } } return false; } }