/* (c) 2015-2016 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.web.netcdf.layer; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Set; import java.util.TreeSet; import javax.measure.unit.NonSI; import javax.measure.unit.SI; import javax.measure.unit.Unit; import javax.measure.unit.UnitFormat; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.util.string.Strings; import org.apache.wicket.util.visit.IVisitor; import org.geoserver.catalog.CoverageDimensionInfo; import org.geoserver.catalog.CoverageInfo; import org.geoserver.platform.GeoServerExtensions; import org.geoserver.web.netcdf.NetCDFPanel; import org.geotools.coverage.io.netcdf.cf.Entry; import org.geotools.coverage.io.netcdf.cf.NetCDFCFParser; /** * Extension of the {@link NetCDFPanel} adding support for setting the Layer name and Unit of Measure * */ public class NetCDFOutSettingsEditor extends NetCDFPanel<NetCDFLayerSettingsContainer> { private static final NonSI NON_SI_INSTANCE = NonSI.getInstance(); private static final SI SI_INSTANCE = SI.getInstance(); private static final List<Unit<?>> UNITS; static { UNITS = new ArrayList<Unit<?>>(); UNITS.addAll(SI_INSTANCE.getUnits()); UNITS.addAll(NON_SI_INSTANCE.getUnits()); } /** serialVersionUID */ private static final long serialVersionUID = 1L; private final TextField<String> standardName; private final TextField<String> uom; public NetCDFOutSettingsEditor(String id, IModel<NetCDFLayerSettingsContainer> netcdfModel, IModel<CoverageInfo> cinfo) { super(id, netcdfModel); // Add panel for Standard name definition standardName = new TextField<String>("standardName", new PropertyModel(netcdfModel, "layerName")); // Add panel for UOM definition uom = new AutoCompleteTextField<String>("uom", new PropertyModel(netcdfModel, "layerUOM")) { @Override protected Iterator<String> getChoices(String input) { if (Strings.isEmpty(input)) { List<String> emptyList = Collections.emptyList(); return emptyList.iterator(); } List<String> unitNames = new ArrayList<String>(); UnitFormat format = UnitFormat.getInstance(Locale.ENGLISH); for (Unit<?> unit : UNITS) { unitNames.add(format.format(unit)); } List<String> choices = new ArrayList<String>(); for (String name : unitNames) { if (name.toLowerCase().startsWith(input.toLowerCase())) { choices.add(name); } } return choices.iterator(); } }; // Setting the default value if not defined String startUOM = uom.getModelObject(); if ((startUOM == null || startUOM.isEmpty()) && cinfo != null) { // Add the new value from the CoverageBand Details List<CoverageDimensionInfo> infos = cinfo.getObject().getDimensions(); if (infos != null && infos.size() > 0) { CoverageDimensionInfo info = infos.get(0); uom.setModelObject(info.getUnit()); } } container.add(standardName); container.add(uom); // Getting the available standard names NetCDFParserBean bean = GeoServerExtensions.bean(NetCDFParserBean.class); Set<String> names = new TreeSet<String>(); if (bean != null && bean.getParser() != null) { NetCDFCFParser parser = bean.getParser(); names.addAll(parser.getEntryIds()); } final RepeatingView availableNames = new RepeatingView("availableNames"); for (String key : names) { availableNames.add(new Label(availableNames.newChildId(), key)); } container.add(availableNames); // Add Behaviour related to standard name choice standardName.add(new AjaxFormComponentUpdatingBehavior("Change") { @Override protected void onUpdate(AjaxRequestTarget target) { String name = standardName.getModelObject(); if (name != null && !name.isEmpty()) { NetCDFParserBean bean = GeoServerExtensions.bean(NetCDFParserBean.class); if (bean != null && bean.getParser() != null) { NetCDFCFParser parser = bean.getParser(); Entry e = null; if (parser.hasEntryId(name)) { e = parser.getEntry(name); } else if (parser.hasAliasId(name)) { e = parser.getEntryFromAlias(name); } if (e != null) { uom.setModelObject(e.getCanonicalUnits()); target.add(container); } } } } }); } @Override public void convertInput() { IVisitor<Component, Object> formComponentVisitor = (component, visit) -> { if (component instanceof FormComponent) { FormComponent<?> formComponent = (FormComponent<?>) component; formComponent.processInput(); } }; globalAttributes.visitChildren(formComponentVisitor); variableAttributes.visitChildren(formComponentVisitor); extraVariables.visitChildren(formComponentVisitor); compressionLevel.processInput(); dataPacking.processInput(); shuffle.processInput(); copyAttributes.processInput(); standardName.processInput(); uom.processInput(); NetCDFLayerSettingsContainer convertedInput = new NetCDFLayerSettingsContainer(); convertedInput.setCompressionLevel(compressionLevel.getModelObject()); convertedInput.setGlobalAttributes(globalAttributes.getModelObject()); convertedInput.setVariableAttributes(variableAttributes.getModelObject()); convertedInput.setExtraVariables(extraVariables.getModelObject()); convertedInput.setDataPacking(dataPacking.getModelObject()); convertedInput.setShuffle(shuffle.getModelObject()); convertedInput.setCopyAttributes(copyAttributes.getModelObject()); convertedInput.setLayerName(standardName.getModelObject()); convertedInput.setLayerUOM(uom.getModelObject()); setConvertedInput(convertedInput); } }