teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5863: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5863: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.artifacts.services; raimund@2639: teichmann@5831: import org.dive4elements.artifacts.CallMeta; teichmann@5831: import org.dive4elements.artifacts.GlobalContext; teichmann@5831: import org.dive4elements.artifacts.common.ArtifactNamespaceContext; teichmann@5831: import org.dive4elements.artifacts.common.utils.FileTools; teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils; teichmann@5831: import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator; teichmann@5865: import org.dive4elements.river.utils.RiverUtils; christian@4656: raimund@2639: import java.io.File; raimund@2639: import java.io.FileOutputStream; raimund@2639: import java.io.IOException; raimund@2639: christian@4656: import org.apache.commons.codec.binary.Base64; raimund@2639: import org.apache.log4j.Logger; raimund@2639: import org.w3c.dom.Document; raimund@2639: import org.w3c.dom.Element; raimund@2639: raimund@2639: /** christian@5009: * Service that receives XML-packed Shapefile bundles from the client. raimund@2639: * @author Raimund Renkert raimund@2639: */ teichmann@5868: public class FileUploadService extends D4EService { raimund@2639: raimund@2639: /** The logger used in this service.*/ raimund@2639: private static Logger logger = Logger.getLogger(FileUploadService.class); raimund@2639: raimund@2639: /** XPath that points to the artifact uuid.*/ raimund@2639: public static final String XPATH_ARTIFACT_UUID = raimund@2639: "/upload/artifact-uuid/text()"; raimund@2639: raimund@2639: /** XPath that points to the base64 encoded data.*/ raimund@2639: public static final String XPATH_DATA = "/upload/data/text()"; raimund@2639: raimund@2639: public FileUploadService() { raimund@2639: } raimund@2639: raimund@2639: @Override raimund@2639: protected Document doProcess( raimund@2639: Document data, raimund@2639: GlobalContext context, raimund@2639: CallMeta callMeta raimund@2639: ) { raimund@2639: logger.debug("FileUploadService.process"); raimund@2639: christian@5009: Document doc = XMLUtils.newDocument(); christian@5009: ElementCreator ec = new ElementCreator(doc, null, null); christian@5009: Element resp = ec.create("response"); christian@5009: Element status = ec.create("status"); christian@5009: resp.appendChild(status); christian@5009: doc.appendChild(resp); christian@5009: raimund@2639: String uuid = extractUuid(data); raimund@2639: raimund@2639: byte[] fileData = extractData(data); raimund@2639: if (fileData != null) { raimund@2639: try { teichmann@5865: String shapePath = RiverUtils.getXPathString( teichmann@5865: RiverUtils.XPATH_FLOODMAP_SHAPEFILE_DIR); raimund@2639: raimund@2639: File artifactDir = FileTools.getDirectory(shapePath, uuid); raimund@2639: FileOutputStream fos = sascha@2641: new FileOutputStream( sascha@2641: new File(artifactDir, "user-rgd.zip")); sascha@2641: try { sascha@2641: fos.write(fileData); christian@5009: christian@5009: // Write operation successful christian@5009: status.setTextContent("Upload erfolgreich!"); // TODO: i18n sascha@2641: } sascha@2641: finally { sascha@2641: fos.close(); sascha@2641: } raimund@2639: } raimund@2639: catch (IOException ioe) { raimund@2639: logger.warn(ioe, ioe); christian@5009: status.setTextContent("Upload fehlgeschlagen!"); raimund@2639: } raimund@2639: } raimund@2639: else { sascha@2640: logger.debug("No data in uploaded xml."); christian@5009: status.setTextContent("Upload fehlgeschlagen!"); raimund@2639: } raimund@2639: raimund@2639: return doc; raimund@2639: } raimund@2639: christian@5009: /** christian@5009: * Extracts the UUID from the XML document. christian@5009: * @param data christian@5009: * @return christian@5009: */ raimund@2639: protected String extractUuid(Document data) { raimund@2639: return XMLUtils.xpathString( raimund@2639: data, XPATH_ARTIFACT_UUID, ArtifactNamespaceContext.INSTANCE); raimund@2639: } raimund@2639: christian@5009: /** christian@5009: * Extracts the base64 encoded ZIP file from the XML document. christian@5009: * @param data christian@5009: * @return christian@5009: */ raimund@2639: protected byte[] extractData(Document data) { raimund@2639: String b64Data = XMLUtils.xpathString( raimund@2639: data, XPATH_DATA, ArtifactNamespaceContext.INSTANCE); raimund@2639: sascha@3084: if (b64Data != null && b64Data.length() > 0) { raimund@2639: byte[] fileData = Base64.decodeBase64(b64Data); raimund@2639: return fileData; raimund@2639: } raimund@2639: return null; raimund@2639: } raimund@2639: } sascha@3083: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :