/* (c) 2014 - 2015 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.web.data.resource; import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.RefreshingView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.geoserver.catalog.CoverageInfo; import org.geoserver.catalog.DimensionInfo; import org.geoserver.catalog.DimensionPresentation; import org.geoserver.catalog.LayerInfo; import org.geoserver.catalog.MetadataMap; import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.impl.DimensionInfoImpl; import org.geoserver.catalog.util.ReaderDimensionsAccessor; import org.geoserver.web.publish.PublishedEditTabPanel; import org.geoserver.web.util.MetadataMapModel; import org.geoserver.web.wicket.ParamResourceModel; import org.geotools.coverage.grid.io.GridCoverage2DReader; import org.geotools.util.logging.Logging; /** * Plugs into the layer page a time/elevation selector for vector data * * @author Alessio */ public class ResourceDimensionsTabPanelInfo extends PublishedEditTabPanel<LayerInfo> { private static final long serialVersionUID = 4702596541385329270L; static final Logger LOGGER = Logging.getLogger(ResourceDimensionsTabPanelInfo.class); @SuppressWarnings("unchecked") public ResourceDimensionsTabPanelInfo(String id, IModel<LayerInfo> model) { super(id, model); final LayerInfo layer = model.getObject(); final ResourceInfo resource = layer.getResource(); final PropertyModel<MetadataMap> metadata = new PropertyModel<MetadataMap>(model, "resource.metadata"); // time IModel time = new MetadataMapModel(metadata, ResourceInfo.TIME, DimensionInfo.class); if (time.getObject() == null) { time.setObject(new DimensionInfoImpl()); } add(new DimensionEditor("time", time, resource, Date.class)); // elevation IModel elevation = new MetadataMapModel(metadata, ResourceInfo.ELEVATION, DimensionInfo.class); if (elevation.getObject() == null) { elevation.setObject(new DimensionInfoImpl()); } add(new DimensionEditor("elevation", elevation, resource, Number.class)); // handle raster data custom dimensions final List<RasterDimensionModel> customDimensionModels = new ArrayList<RasterDimensionModel>(); if (resource instanceof CoverageInfo) { CoverageInfo ci = (CoverageInfo) resource; try { GridCoverage2DReader reader = (GridCoverage2DReader) ci .getGridCoverageReader(null, null); ReaderDimensionsAccessor ra = new ReaderDimensionsAccessor(reader); for (String domain : ra.getCustomDomains()) { boolean hasRange = ra.hasRange(domain); boolean hasResolution = ra.hasResolution(domain); RasterDimensionModel mm = new RasterDimensionModel(metadata, domain, DimensionInfo.class, hasRange, hasResolution); if (mm.getObject() == null) { mm.setObject(new DimensionInfoImpl()); } customDimensionModels.add(mm); } } catch (IOException e) { LOGGER.log(Level.SEVERE, "Failed to access coverage reader custom dimensions", e); } } RefreshingView customDimensionsEditor = new RefreshingView("customDimensions") { @Override protected Iterator getItemModels() { return customDimensionModels.iterator(); } @Override protected void populateItem(Item item) { RasterDimensionModel model = (RasterDimensionModel) item.getModel(); ParamResourceModel customDimension = new ParamResourceModel("customDimension", ResourceDimensionsTabPanelInfo.this); item.add(new Label("dimensionName", customDimension.getString() + ": " + model.getExpression())); DimensionEditor editor = new DimensionEditor("dimension", model, resource, String.class); editor.disablePresentationMode(DimensionPresentation.CONTINUOUS_INTERVAL); if(!model.hasRange && !model.hasResolution) { editor.disablePresentationMode(DimensionPresentation.DISCRETE_INTERVAL); } item.add(editor); } }; add(customDimensionsEditor); customDimensionsEditor.setVisible(customDimensionModels.size() > 0); } class RasterDimensionModel extends MetadataMapModel { private static final long serialVersionUID = 4734439907138483817L; boolean hasRange; boolean hasResolution; public RasterDimensionModel(IModel<?> model, String expression, Class<?> target, boolean hasRange, boolean hasResolution) { super(model, expression, target); } public Object getObject() { return ((MetadataMap) model.getObject()).get(ResourceInfo.CUSTOM_DIMENSION_PREFIX + expression, target); } public void setObject(Object object) { ((MetadataMap) model.getObject()).put(ResourceInfo.CUSTOM_DIMENSION_PREFIX + expression, (Serializable) object); } } }