sascha@4095: package de.intevation.aft;
sascha@4095: 
sascha@4095: import de.intevation.utils.XML;
sascha@4095: 
sascha@4095: import java.io.IOException;
sascha@4095: import java.io.InputStream;
sascha@4095: import java.io.OutputStream;
sascha@4095: 
teichmann@4772: import java.net.HttpURLConnection;
sascha@4095: import java.net.URL;
sascha@4095: import java.net.URLConnection;
teichmann@4772: 
teichmann@4772: import org.apache.log4j.Logger;
sascha@4095: 
sascha@4095: import org.w3c.dom.Document;
sascha@4095: import org.w3c.dom.Node;
sascha@4095: import org.w3c.dom.NodeList;
sascha@4095: 
sascha@4095: public class Notification
sascha@4095: {
sascha@4095:     private static Logger log = Logger.getLogger(Notification.class);
sascha@4095: 
sascha@4095:     protected Document message;
sascha@4095: 
sascha@4095:     public Notification() {
sascha@4095:     }
sascha@4095: 
sascha@4095:     public Notification(Document message) {
sascha@4095:         this.message = message;
sascha@4095:     }
sascha@4095: 
sascha@4095:     public Notification(Node message) {
sascha@4095:         this(wrap(message));
sascha@4095:     }
sascha@4095: 
sascha@4095:     public static Document wrap(Node node) {
sascha@4095:         Document document = XML.newDocument();
sascha@4095: 
sascha@4095:         // Send first element as message.
sascha@4095:         // Fall back to root node.
sascha@4095:         Node toImport = node;
sascha@4095: 
sascha@4095:         NodeList children = node.getChildNodes();
sascha@4095:         for (int i = 0, N = children.getLength(); i < N; ++i) {
sascha@4095:             Node child = children.item(i);
sascha@4095:             if (child.getNodeType() == Node.ELEMENT_NODE) {
sascha@4095:                 toImport = child;
sascha@4095:                 break;
sascha@4095:             }
sascha@4095:         }
sascha@4095: 
sascha@4095:         toImport = document.importNode(toImport, true);
sascha@4095:         document.appendChild(toImport);
sascha@4095:         document.normalizeDocument();
sascha@4095:         return document;
sascha@4095:     }
sascha@4095: 
sascha@4095:     public Document sendPOST(URL url) {
sascha@4095: 
sascha@4095:         OutputStream out    = null;
sascha@4095:         InputStream  in     = null;
sascha@4095:         Document     result = null;
sascha@4095: 
sascha@4095:         try {
sascha@4095:             URLConnection ucon = url.openConnection();
sascha@4095: 
sascha@4095:             if (!(ucon instanceof HttpURLConnection)) {
sascha@4110:                 log.warn("NOTIFY: '" + url + "' is not an HTTP(S) connection.");
sascha@4095:                 return null;
sascha@4095:             }
sascha@4095: 
sascha@4095:             HttpURLConnection con = (HttpURLConnection)ucon;
sascha@4095: 
sascha@4095:             con.setRequestMethod("POST");
sascha@4095:             con.setDoInput(true);
sascha@4095:             con.setDoOutput(true);
sascha@4095:             con.setUseCaches(false);
sascha@4095:             con.setRequestProperty("Content-Type", "text/xml");
sascha@4095: 
sascha@4095:             out = con.getOutputStream();
sascha@4095:             XML.toStream(message, out);
sascha@4095:             out.flush();
sascha@4095:             in = con.getInputStream();
sascha@4095:             result = XML.parseDocument(in);
sascha@4095:         }
sascha@4095:         catch (IOException ioe) {
sascha@4110:             log.error("NOTIFY: Sending message to '" + url + "' failed.", ioe);
sascha@4095:         }
sascha@4095:         finally {
sascha@4095:             if (out != null) {
sascha@4095:                 try { out.close(); } catch (IOException ioe) {}
sascha@4095:             }
sascha@4095:             if (in != null) {
sascha@4095:                 try { in.close(); } catch (IOException ioe) {}
sascha@4095:             }
sascha@4095:         }
sascha@4095: 
sascha@4095:         return result;
sascha@4095:     }
sascha@4095: }
sascha@4095: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :