teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
teichmann@5861: * Software engineering by Intevation GmbH
teichmann@5861: *
teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3)
teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the
teichmann@5993: * documentation coming with Dive4Elements River for details.
teichmann@5861: */
teichmann@5861:
teichmann@5835: package org.dive4elements.river.client.server;
raimund@2494:
teichmann@5835: import org.dive4elements.artifacts.common.utils.XMLUtils;
teichmann@5835: import org.dive4elements.artifacts.common.utils.XMLUtils.ElementCreator;
teichmann@5835: import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException;
teichmann@5835: import org.dive4elements.artifacts.httpclient.http.HttpClient;
teichmann@5835: import org.dive4elements.artifacts.httpclient.http.HttpClientImpl;
sascha@2497:
sascha@2497: import java.io.ByteArrayOutputStream;
christian@5008: import java.io.IOException;
sascha@2497: import java.io.InputStream;
christian@5008: import java.io.PrintWriter;
raimund@2494:
raimund@2494: import javax.servlet.http.HttpServlet;
raimund@2494: import javax.servlet.http.HttpServletRequest;
raimund@2494: import javax.servlet.http.HttpServletResponse;
raimund@2494:
sascha@2497: import org.apache.commons.codec.binary.Base64;
sascha@2497: import org.apache.commons.fileupload.FileItemIterator;
sascha@2497: import org.apache.commons.fileupload.FileItemStream;
sascha@2497: import org.apache.commons.fileupload.servlet.ServletFileUpload;
sascha@2497: import org.apache.log4j.Logger;
sascha@2497: import org.w3c.dom.Document;
sascha@2497: import org.w3c.dom.Element;
raimund@2494:
raimund@2494: public class FileUploadServiceImpl
raimund@2494: extends HttpServlet
raimund@2494: {
tom@8856: private static final Logger log = Logger.getLogger(
tom@8856: FileUploadServiceImpl.class);
raimund@2494:
raimund@2494: @Override
raimund@2494: protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
teichmann@8203: log.debug("handling post request.");
raimund@2494:
raimund@2494: String url = getServletContext().getInitParameter("server-url");
raimund@2494:
christian@4632: Document request = createFileXML(req);
raimund@2494:
raimund@2494: if (request == null) {
raimund@2494: return;
raimund@2494: }
raimund@2494: HttpClient client = new HttpClientImpl(url);
raimund@2494:
raimund@2494: try {
raimund@2494: Document result = client.callService(url, "fileupload", request);
raimund@2494:
christian@6105: resp.setContentType("text/html");
christian@6117:
christian@5008: PrintWriter respWriter = resp.getWriter();
tom@8856: respWriter.write(
tom@8856: "
");
christian@5008:
raimund@2494: if (result == null) {
teichmann@8203: log.warn("FileUpload service returned no result.");
christian@5008: respWriter.write("FileUpload service returned no result");
raimund@2494: }
christian@5008: else {
christian@5008: String status = result.getElementsByTagName("status")
christian@5008: .item(0).getTextContent();
christian@5008: respWriter.write(status);
christian@5008: }
christian@5008:
christian@5008: respWriter.write("
");
christian@5008: respWriter.flush();
raimund@2494:
raimund@2494: return;
raimund@2494: }
raimund@2494: catch (ConnectionException ce) {
teichmann@8203: log.error(ce, ce);
raimund@2494: }
christian@5008: catch (IOException e) {
teichmann@8203: log.error(e, e);
christian@5008: }
raimund@2494: }
raimund@2494:
raimund@2494:
raimund@2494: protected Document createFileXML(HttpServletRequest req) {
christian@6117: ServletFileUpload upload = new ServletFileUpload();
raimund@2494:
raimund@2494: try{
raimund@2494: FileItemIterator iter = upload.getItemIterator(req);
raimund@2494:
raimund@2494: while (iter.hasNext()) {
raimund@2494: FileItemStream item = iter.next();
raimund@2494: InputStream stream = item.openStream();
raimund@2494:
raimund@2494: // Process the input stream
raimund@2494: ByteArrayOutputStream out = new ByteArrayOutputStream();
christian@6117: int len, cnt = 0;
raimund@2494: byte[] buffer = new byte[stream.available()];
raimund@2494: while ((len = stream.read(buffer, 0, buffer.length)) != -1) {
raimund@2494: out.write(buffer, 0, len);
christian@6117: cnt += len;
raimund@2494: }
raimund@2494:
christian@6118: buffer = Base64.encodeBase64(out.toByteArray());
christian@2954: String b64File = new String(buffer);
teichmann@8203: log.debug("FileUploadServiceImpl.createFileXML(): " + cnt
christian@6118: + "/" + b64File.length()
christian@6118: + " bytes (orig/base64) file to be uploaded");
raimund@2494:
raimund@2494: Document fileDoc = XMLUtils.newDocument();
raimund@2494:
raimund@2494: ElementCreator ec = new ElementCreator(fileDoc, null, null);
raimund@2494: Element root = ec.create("upload");
raimund@2494: Element id = ec.create("artifact-uuid");
raimund@2494: id.setTextContent(req.getParameter("uuid"));
raimund@2494:
raimund@2494: Element data = ec.create("data");
raimund@2494: data.setTextContent(b64File);
raimund@2494:
raimund@2494: fileDoc.appendChild(root);
raimund@2494: root.appendChild(id);
raimund@2494: root.appendChild(data);
raimund@2494:
raimund@2494: return fileDoc;
raimund@2494: }
raimund@2494: }
raimund@2494: catch(Exception e){
teichmann@8203: log.debug("Failed to create xml document containing the file.");
teichmann@8203: log.debug(e, e);
raimund@2494: }
raimund@2494: return null;
raimund@2494: }
raimund@2494: }