/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2010, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.xml.parameter; import java.lang.reflect.Array; import javax.xml.stream.XMLStreamException; import org.apache.sis.util.ObjectConverters; import org.geotoolkit.xml.StaxStreamWriter; import org.opengis.parameter.GeneralParameterValue; import org.opengis.parameter.ParameterValue; import org.opengis.parameter.ParameterValueGroup; import java.nio.file.Path; import static org.geotoolkit.xml.parameter.ParameterConstants.*; /** * <p>This class provides a GeneralParameterValue writing method.</p> * * @author Samuel Andrés * @module */ public class ParameterValueWriter extends StaxStreamWriter { /** * <p>This method writes an XML document containing a GeneralParameterValue</p> * Do not write the start/end, use when encapsulated in another writer. * * @param generalParameterValue */ public void writeForInsertion(final GeneralParameterValue generalParameterValue) throws XMLStreamException { this.writeGeneralParameterValue(generalParameterValue); } /** * <p>This method writes an XML document containing a GeneralParameterValue</p> * * @param generalParameterValue */ public void write(final GeneralParameterValue generalParameterValue) throws XMLStreamException { writer.writeStartDocument("UTF-8", "1.0"); writer.setDefaultNamespace(URI_PARAMETER); this.writeForInsertion(generalParameterValue); writer.writeEndDocument(); writer.flush(); } /** * <p>This method writes a GenaralParameterValue.</p> * * @param generalParameterValue * @throws XMLStreamException */ private void writeGeneralParameterValue( final GeneralParameterValue generalParameterValue) throws XMLStreamException { writer.writeStartElement(URI_PARAMETER, generalParameterValue.getDescriptor().getName().getCode().replace(' ', '_')); if (generalParameterValue instanceof ParameterValueGroup) { this.writeParameterValueGroup((ParameterValueGroup) generalParameterValue); } else { ParameterValue param = (ParameterValue) generalParameterValue; final Class valueClass = param.getDescriptor().getValueClass(); if (valueClass.isArray()) { final Object values = param.getValue(); final int size = Array.getLength(values); for (int i = 0; i < size; i++) { writer.writeStartElement(URI_PARAMETER, ENTRY_PARAMETER); this.writeParameterValue(Array.get(values, i)); writer.writeEndElement(); } } else { this.writeParameterValue(param.getValue()); } } writer.writeEndElement(); } /** * <p>This method writes a ParameterValue.</p> * * @param parameter * @throws XMLStreamException */ private void writeParameterValue(final Object value) throws XMLStreamException { if(value != null){ //HACK for Path support // we don't use ObjectConverters to convert Path into a String because // there is an already existing converter that doesn't return full path // with protocol (URI scheme) if (value instanceof Path) { Path path = (Path) value; writer.writeCharacters(path.toAbsolutePath().toUri().toString()); } else { writer.writeCharacters(ObjectConverters.convert(value, String.class)); } } } /** * <p>This method writes a ParameterValueGroup.</p> * * @param parameterGroup * @throws XMLStreamException */ private void writeParameterValueGroup(final ParameterValueGroup parameterGroup) throws XMLStreamException { for (GeneralParameterValue value : parameterGroup.values()) { this.writeGeneralParameterValue(value); } } }