package org.geotoolkit.wps.converters.inputs.complex; import net.iharder.Base64; import org.geotoolkit.nio.IOUtilities; import org.apache.sis.util.UnconvertibleObjectException; import org.geotoolkit.wps.io.WPSEncoding; import org.geotoolkit.wps.xml.ComplexDataType; import java.io.ByteArrayInputStream; import java.io.File; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.UUID; /** * Save the content of a WPS complex input into local file. * * @author Alexis Manin (Geomatys) */ public class ComplexToFileConverter extends AbstractComplexInputConverter<File> { private static ComplexToFileConverter INSTANCE; private ComplexToFileConverter() { } public static synchronized ComplexToFileConverter getInstance() { if (INSTANCE == null) { INSTANCE = new ComplexToFileConverter(); } return INSTANCE; } @Override public Class<File> getTargetClass() { return File.class; } @Override public File convert(ComplexDataType source, Map<String, Object> params) throws UnconvertibleObjectException { if(source == null || source.getContent() == null) { throw new UnconvertibleObjectException("Mandatory parameter is missing."); } Path result = null; try { //Create a temp file final String fileName = UUID.randomUUID().toString(); result = Files.createTempFile(fileName, ".tmp"); final List<Object> data = source.getContent(); if (data.size() < 1) { throw new UnconvertibleObjectException("There's no available data in this complex content."); } String rawData = (String) data.get(0); if (params != null && params.get(ENCODING).equals(WPSEncoding.BASE64.getValue())) { final byte[] byteData = Base64.decode(rawData); if (byteData != null && byteData.length > 0) { try (final ByteArrayInputStream is = new ByteArrayInputStream(byteData)) { IOUtilities.writeStream(is, result); } } } else { if(rawData.startsWith("<![CDATA[") && rawData.endsWith("]]>")) { rawData = rawData.substring(9, rawData.length()-3); } IOUtilities.writeString(rawData, result); } } catch (Exception ex) { throw new UnconvertibleObjectException(ex); } return result.toFile(); } }