Java tutorial
/* * Copyright (c) 2011 Matthew Doll <mdoll at homenet.me>. * * This file is part of HomeNet. * * HomeNet is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HomeNet 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HomeNet. If not, see <http://www.gnu.org/licenses/>. */ package homenet; import static homenet.Packet.*; import java.util.*; import java.text.SimpleDateFormat; import org.apache.commons.codec.binary.Base64; /** * * @author mdoll */ //http://www.dynamicobjects.com/d2r/archives/003057.html public class PortXmlrpc extends Port { XmlrpcClient _client; int _node; long _timer; final int retryDelay = 30; //in seconds public PortXmlrpc(Stack homeNet, XmlrpcClient c, int n) { super(homeNet); _client = c; _node = n; } public PortXmlrpc(Stack homeNet, XmlrpcClient c) { super(homeNet); _client = c; _node = 0; } @Override public void init(String id) { System.out.println("Init Port: " + id); _id = id; started = true; } @Override public void send(Packet packet) { _sending = true; if ((_node == 0) || (_node == packet.getToNode())) { for (PortListener l : _homeNet._portListeners) { l.portSendingStart(_id); } Hashtable<String, String> xmlpacket = new Hashtable<String, String>(); System.out.println(new String(Base64.encodeBase64(packet.getData()))); String packetBase64 = new String(Base64.encodeBase64(packet.getData())); xmlpacket.put("apikey", _client.apikey); xmlpacket.put("timestamp", getDateAsISO8601String(packet.getTimestamp())); xmlpacket.put("packet", packetBase64); //System.out.println("DAte: "+packet.getTimestamp().toString()); Boolean reply = false; try { reply = (Boolean) _client.execute("homenet.packet.submit", xmlpacket); //reply = (String)homeNetXmlrpcClient.execute("HomeNet.ping", "test test3242342"); } catch (Exception e) { //@todo there are probably some specfic exception we need to filter out to kill bad packets System.out.println("XMLRPC Error: " + e); packet.setStatus(STATUS_READY); System.err.println("Possible network error. Will retry in " + retryDelay + " seconds"); Thread timer = new Thread() { public void run() { try { Thread.sleep(retryDelay * 1000); } catch (Exception e) { } _sending = false; } }; timer.start(); for (PortListener l : _homeNet._portListeners) { l.portSendingEnd(_id); } return; } if (reply == true) { System.out.println("Packet Successfuly sent to HomeNet.me"); } else { System.out.println("Fatal Error"); } } else { System.out.println("Packet Skipped"); } // debugPacket(packet); packet.setStatus(STATUS_SENT); _sending = false; for (PortListener l : _homeNet._portListeners) { l.portSendingEnd(_id); } } public void stop() { } // public void receive(Packet packet) { for (PortListener l : _homeNet._portListeners) { l.portReceivingStart(_id); } //Packet receivingPacket = _homeNet._getNewPacket(); //receivingPacket = packet; System.out.println("Receiving XMLRPC: "); packet.setFromPort(_id); packet.received = new Date(); packet.setStatus(STATUS_RECEIVED); _homeNet.addPacket(packet); System.out.println("added XMLRPC packet to stack"); _receiving = false; for (PortListener l : _homeNet._portListeners) { l.portReceivingEnd(_id); } } // @Override public void receive() { } public static SimpleDateFormat ISO8601FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); public static SimpleDateFormat RFC822DATEFORMAT = new SimpleDateFormat("EEE', 'dd' 'MMM' 'yyyy' 'HH:mm:ss' 'Z", Locale.US); public static SimpleDateFormat msgDateTimeFormat = new SimpleDateFormat("HH:mm:ss", Locale.US); public static String getDateAsRFC822String(Date date) { return RFC822DATEFORMAT.format(date); } public static String getmsgDateTimeString(Date date) { return msgDateTimeFormat.format(date); } public static String getDateAsISO8601String(Date date) { String result = ISO8601FORMAT.format(date); //convert YYYYMMDDTHH:mm:ss+HH00 into YYYYMMDDTHH:mm:ss+HH:00 //- note the added colon for the Timezone result = result.substring(0, result.length() - 2) + ":" + result.substring(result.length() - 2); return result; } }