/* (c) 2014 - 2016 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.inspire.web; import static org.geoserver.inspire.InspireMetadata.CREATE_EXTENDED_CAPABILITIES; import static org.geoserver.inspire.InspireMetadata.LANGUAGE; import static org.geoserver.inspire.InspireMetadata.SERVICE_METADATA_TYPE; import static org.geoserver.inspire.InspireMetadata.SERVICE_METADATA_URL; import static org.geoserver.inspire.InspireMetadata.SPATIAL_DATASET_IDENTIFIER_TYPE; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.validation.FormComponentFeedbackBorder; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.ResourceModel; import org.geoserver.catalog.MetadataMap; import org.geoserver.config.ServiceInfo; import org.geoserver.inspire.UniqueResourceIdentifiers; import org.geoserver.wcs.WCSInfo; import org.geoserver.web.services.AdminPagePanel; import org.geoserver.web.util.MapModel; import org.geoserver.web.util.MetadataMapModel; import org.geoserver.wfs.WFSInfo; /** * Panel for the service admin page to set the service INSPIRE extension * preferences. */ public class InspireAdminPanel extends AdminPagePanel { private static final long serialVersionUID = -7670555379263411393L; @SuppressWarnings({"unchecked", "rawtypes"}) public InspireAdminPanel(final String id, final IModel<ServiceInfo> model) { super(id, model); MetadataMap serviceMetadata = model.getObject().getMetadata(); String metadataURL = (String) serviceMetadata.get(SERVICE_METADATA_URL.key); String mediaType = (String) serviceMetadata.get(SERVICE_METADATA_TYPE.key); String language = (String) serviceMetadata.get(LANGUAGE.key); boolean isDownloadService = model.getObject() instanceof WFSInfo || model.getObject() instanceof WCSInfo; UniqueResourceIdentifiers ids = null; if (isDownloadService) { ids = (UniqueResourceIdentifiers) serviceMetadata.get(SPATIAL_DATASET_IDENTIFIER_TYPE.key, UniqueResourceIdentifiers.class); } if (!serviceMetadata.containsKey(CREATE_EXTENDED_CAPABILITIES.key)) { if (metadataURL == null || isDownloadService && (ids == null || ids.isEmpty())) { serviceMetadata.put(CREATE_EXTENDED_CAPABILITIES.key, false); } else { serviceMetadata.put(CREATE_EXTENDED_CAPABILITIES.key, true); } } PropertyModel<MetadataMap> metadata = new PropertyModel<MetadataMap>(model, "metadata"); final CheckBox createInspireExtendedCapabilities = new CheckBox("createExtendedCapabilities", new MetadataMapModel(metadata, CREATE_EXTENDED_CAPABILITIES.key, Boolean.class)); add(createInspireExtendedCapabilities); final WebMarkupContainer container = new WebMarkupContainer("container"); container.setOutputMarkupId(true); add(container); final WebMarkupContainer configs = new WebMarkupContainer("configs"); configs.setOutputMarkupId(true); configs.setVisible(createInspireExtendedCapabilities.getModelObject()); container.add(configs); createInspireExtendedCapabilities.add(new OnChangeAjaxBehavior() { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { configs.setVisible(createInspireExtendedCapabilities.getModelObject()); target.add(container); } }); if (!model.getObject().getMetadata().containsKey(LANGUAGE.key)) { model.getObject().getMetadata().put(LANGUAGE.key, "eng"); } configs.add(new LanguageDropDownChoice("language", new MapModel(metadata, LANGUAGE.key))); TextField metadataUrlField = new TextField("metadataURL", new MapModel(metadata, SERVICE_METADATA_URL.key)); metadataUrlField.setRequired(true); FormComponentFeedbackBorder metadataURLBorder = new FormComponentFeedbackBorder( "border"); metadataURLBorder.add(metadataUrlField); configs.add(metadataURLBorder); metadataUrlField.add(new AttributeModifier("title", new ResourceModel( "InspireAdminPanel.metadataURL.title"))); final Map<String, String> mdUrlTypes = new HashMap<String, String>(); mdUrlTypes.put("application/vnd.ogc.csw.GetRecordByIdResponse_xml", "CSW GetRecordById Response"); mdUrlTypes.put("application/vnd.iso.19139+xml", "ISO 19139 ServiceMetadata record"); IModel<String> urlTypeModel = new MapModel(metadata, SERVICE_METADATA_TYPE.key); IChoiceRenderer<String> urlTypeChoiceRenderer = new ChoiceRenderer<String>() { private static final long serialVersionUID = 1L; @Override public Object getDisplayValue(final String key) { final String resourceKey = "InspireAdminPanel.metadataURLType." + key;// as found in // GeoServerApplication.properties final String defaultValue = key; final String displayValue = new ResourceModel(resourceKey, defaultValue) .getObject(); return displayValue; } @Override public String getIdValue(final String key, int index) { return key; } }; List<String> urlTypeChoices = new ArrayList<String>(mdUrlTypes.keySet()); DropDownChoice<String> serviceMetadataRecordType = new DropDownChoice<String>( "metadataURLType", urlTypeModel, urlTypeChoices, urlTypeChoiceRenderer); serviceMetadataRecordType.setNullValid(true); configs.add(serviceMetadataRecordType); // this is download service specific, will appear only if the service is // WFS or WCS WebMarkupContainer identifiersContainer = new WebMarkupContainer( "datasetIdentifiersContainer"); identifiersContainer.setVisible(isDownloadService); configs.add(identifiersContainer); IModel<UniqueResourceIdentifiers> sdiModel = new MetadataMapModel(metadata, SPATIAL_DATASET_IDENTIFIER_TYPE.key, UniqueResourceIdentifiers.class); UniqueResourceIdentifiersEditor identifiersEditor = new UniqueResourceIdentifiersEditor( "spatialDatasetIdentifiers", sdiModel); identifiersContainer.add(identifiersEditor); } }