/* * Created on 2005-apr-04 */ //import org.jdom.*; import org.jdom.Element; import org.jdom.Document; import org.jdom.DocType; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; import org.jdom.input.SAXBuilder; import java.io.StringReader; import java.io.PrintStream; import java.io.File; /** * Chat-klient som använder ett XML-baserat protokoll * enligt DTD-filen message.dtd * för meddelandena. Skapar en instans av XMLChatClientGUI för interaktion * med användaren. *

Det headerelement som skickas med meddelande kan prefabriceras i filen * header.xml

*

Startas med komandot java XMLChatClient

*

Är beroende av klasserna Chatter och ChatClient

* * @author Henrik Johansson */ public class XMLChatClient implements Chatter { static final int SEND = 0; static final int RECEIVE = 1; private ChatClient chatClient; private XMLChatClientGUI gui; private Element header; /** * konstruktor, skapar det grafiska användargränssnittet samt ansluter till * chatt-server. * * @param host * @param port */ public XMLChatClient(String host, int port) { System.out.println(host+":"+port); chatClient = new ChatClient(this); chatClient.connect(host, port); gui = new XMLChatClientGUI(this); gui.setVisible(true); } /** * Skapar ett headerelement. Om det existerar ett xml-dokument med namnet * header.xml och som pekar på header.dtd, används detta dokuments rotelement * som header. I annat fall skapas ett nytt header-element för en anonym * användare. * * @return nya headerelementet. */ private Element getHeader() { if(header == null) { File file = new File("header.xml"); if(file.exists()) { try { SAXBuilder builder = new SAXBuilder(true); Document document = builder.build(file); header = document.getRootElement(); return (Element) header.clone(); } catch(Exception e) { System.err.println("ERROR: kunde inte skapa header från header.xml"); e.printStackTrace(); } } header = new Element("header"); Element protocol = new Element("protocol"); protocol.addContent(new Element("type")); protocol.addContent(new Element("version")); protocol.addContent(new Element("command")); Element id = new Element("id"); id.addContent(new Element("name").setText("anonymous")); id.addContent(new Element("email").setText("nomail")); id.addContent(new Element("homepage")); id.addContent(new Element("host")); header.addContent(protocol); header.addContent(id); } return (Element) header.clone(); } /** * skapar ett meddelandedokument och skickar detta till servern som denna * klient är ansluten till. * * @param message meddelandet som skall skickas till servern. */ public void send(String message) { Element root = new Element("message"); DocType dtd = new DocType("message", "http://atlas.dsv.su.se/~pierre/i/05_ass/ip4/a_1_3_3/message.dtd"); Document document = new Document(root, dtd); root.addContent(getHeader()); root.addContent(new Element("body").setText(message)); Format format = Format.getCompactFormat(); format.setLineSeparator(""); XMLOutputter xmlOutputter = new XMLOutputter(format); chatClient.send(xmlOutputter.outputString(document)); printDocument(System.out, document, XMLChatClient.SEND); } /** * Implementerar receive i Chatter. Försöker skapa * ett xml-dokument av det mottagna meddelandet. Om detta lyckas plockas * avändarens namn, email samt meddelande ut ur dokumentet och skickas till * användargränssnittet för att visas upp. I annat fall visas ett felmeddelande. * * @param message mottagna meddelandet från servern. * @see Chatter#receive(java.lang.String) */ public void receive(String message) { try { SAXBuilder builder = new SAXBuilder(true); Document document = builder.build(new StringReader(message)); String body = document.getRootElement().getChildText("body"); String name = document.getRootElement().getChild("header").getChild("id").getChildText("name"); String email = document.getRootElement().getChild("header").getChild("id").getChildText("email"); String msg = name + " (" + email + "): " + body; gui.addMessage(msg); printDocument(System.out, document, XMLChatClient.RECEIVE); } catch(Exception e) { String msg = "KUNDE INTE PARSA ETT MEDDELANDE: " + message; gui.addMessage(msg); System.err.println(msg); } } /** * Gör en snygg utskrift av ett dokument till en PrintStream. * * @param out Strömmen där dokumentet skall skrivas ut. * @param document som akall skkrivas ut. * @param type är detta ett meddelande som skall skickas eller har * tagits emot, SEND eller RECEIVE */ private void printDocument(PrintStream out, Document document, int type) { try { System.out.println(type == XMLChatClient.SEND ? "sent message: " : "received message: "); XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); outputter.output(document, out); } catch(Exception e) { e.printStackTrace(); } } public static void main(String[] args) { if(args.length != 2) { System.err.println("usage: XMLChatClient "); System.exit(1); }try { XMLChatClient cc = new XMLChatClient(args[0], Integer.parseInt(args[1])); } catch(Exception e) { System.err.println("usage: XMLChatClient "); System.exit(2); } } }