import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import org.jdom2.*; import org.jdom2.input.*; import org.jdom2.output.*; public class XMLChatClient extends JFrame implements Chatter { ChatClient chatClient = null; SAXBuilder builder; private static String host = "atlas.dsv.su.se"; private static int port = 9494; private JTextField textFieldName = new JTextField("Pierre A. I. Wijkman"); private JTextField textFieldEmail = new JTextField("pierre@dsv.su.se"); private JTextField textFieldHomepage = new JTextField("http://people.dsv.su.se/~pierrre/"); private JTextField textFieldMessage = new JTextField("Hejsan!"); private JButton buttonSend = new JButton("Press me!"); private JTextArea textArea = new JTextArea(); public static void main(String args[]) { if(args.length != 0) { host = args[0]; if(args.length != 1) { port = Integer.parseInt(args[1]); } } new XMLChatClient(); } public XMLChatClient() { buttonSend.addActionListener(new L2()); getContentPane().add(BorderLayout.CENTER, new JScrollPane(textArea)); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(5,2)); panel.add(new JLabel("Name:")); panel.add(textFieldName); panel.add(new JLabel("E-mail:")); panel.add(textFieldEmail); panel.add(new JLabel("Homepage:")); panel.add(textFieldHomepage); panel.add(new JLabel("Message:")); panel.add(textFieldMessage); panel.add(new JLabel("Send:")); panel.add(buttonSend); getContentPane().add(BorderLayout.SOUTH, panel); setLocation(420, 0); setSize(640, 400); addWindowListener(new L1()); setVisible(true); chatClient = new ChatClient(this); chatClient.connect(host, port); try { // True betyder att den ska validera, inte bara kolla valformighet: builder = new SAXBuilder(true); } catch (Exception e) { dispose(); System.exit(1); } } public void receive(String message) { Document document = null; try { document = builder.build(new StringReader(message)); prettyPrint("\n======================================\nINPUT: \n======================================", document); String name = (document.getRootElement()).getChild("header").getChild("id").getChild("name").getText(); String email = (document.getRootElement()).getChild("header").getChild("id").getChild("email").getText(); String body = (document.getRootElement()).getChild("body").getText(); textArea.append(name + " (" + email + "): " + body + "\n"); textArea.setCaretPosition(textArea.getText().length()); } catch (Exception e) { textArea.append("KUNDE INTE PARSA MEDDELANDE: " + message + " FEL: " + e.toString() + "\n"); } } private void sendMessage(Document document) { prettyPrint("\n======================================\nOUTPUT: \n======================================", document); Format format = Format.getCompactFormat(); format.setLineSeparator(""); XMLOutputter outputter = new XMLOutputter(format); chatClient.send(outputter.outputString(document)); System.out.println(outputter.outputString(document)); } private Document makeMessage(String nameStr, String emailStr, String homepageStr, String messageStr) { // Har konstruerar vi ett meddelandet Element message = new Element("message"); Element header = new Element("header"); Element protocol = new Element("protocol"); Element type = new Element("type"); Element version = new Element("version"); Element command = new Element("command"); Element id = new Element("id"); Element name = new Element("name"); Element email = new Element("email"); Element homepage = new Element("homepage"); Element host = new Element("host"); Element body = new Element("body"); message.addContent(header); message.addContent(body); header.addContent(protocol); header.addContent(id); protocol.addContent(type); protocol.addContent(version); protocol.addContent(command); id.addContent(name); id.addContent(email); id.addContent(homepage); id.addContent(host); type.addContent("CTTP"); version.addContent("1.0"); command.addContent("MESS"); name.addContent(nameStr); email.addContent(emailStr); homepage.addContent(homepageStr); host.addContent("unknown"); body.addContent(messageStr); // DocType docType = new DocType("message", "message.dtd"); // Funkar! DocType docType = new DocType("message", "1//PW//Example//123", "https://people.dsv.su.se/~pierre/i/05_ass/ip1/2/2.1.3/message.dtd"); return new Document(message, docType); //return new Document(message); } private void prettyPrint(String message, Document document) { XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); System.out.println(message); System.out.println(outputter.outputString(document)); } class L1 extends WindowAdapter { public void windowClosing(WindowEvent we) { dispose(); } public void windowClosed(WindowEvent we) { System.exit(1); } } class L2 implements ActionListener { public void actionPerformed(ActionEvent ae) { String name = textFieldName.getText(); String email = textFieldEmail.getText(); String homepage = textFieldHomepage.getText(); String message = textFieldMessage.getText(); sendMessage(makeMessage(name, email, homepage, message)); textFieldMessage.setText(""); } } }