import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.DocumentType; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class Client 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 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 Client(); } public Client() { 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("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 { builder = new SAXBuilder(true); } catch (Exception e) { dispose(); System.exit(1); } */ } public void receive(String message) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); //Document document = builder.parse(message); Document document = builder.parse(new InputSource(new ByteArrayInputStream(message.getBytes("utf-8")))); prettyPrint("\n======================================\nINPUT: \n======================================", document); String name = document.getElementsByTagName("name").item(0).getTextContent(); String email = document.getElementsByTagName("email").item(0).getTextContent(); String content = document.getElementsByTagName("content").item(0).getTextContent(); textArea.append(name + " (" + email + "): " + content + "\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)); */ chatClient.send(documentToString(document)); //System.out.println(documentToString(document)); } private Document makeMessage(String nameStr, String emailStr, String messageStr) { Document document = null; try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.newDocument(); //DocumentType documentType = builder.createDocumentType("", "", ""); //document = builder.createDocument("", "", documentType); Element rootElement = document.createElement("message"); document.appendChild(rootElement); Element fromElement = document.createElement("from"); rootElement.appendChild(fromElement); Element nameElement = document.createElement("name"); nameElement.setTextContent(nameStr); fromElement.appendChild(nameElement); Element emailElement = document.createElement("email"); emailElement.setTextContent(emailStr); fromElement.appendChild(emailElement); Element contentElement = document.createElement("content"); contentElement.setTextContent(messageStr); rootElement.appendChild(contentElement); /* DocType docType = new DocType("message", "foo", "http://people.dsv.su.se/pierre/courses/05_ass/ip1/2/2.1.3/message.dtd"); return new Document(message, docType); */ } catch (Exception e) { textArea.append("KUNDE INTE KONSTRUERA MEDDELANDE: " + messageStr + " FEL: " + e.toString() + "\n"); } return document; } private void prettyPrint(String message, Document document) { /* XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat()); System.out.println(message); System.out.println(outputter.outputString(document)); */ } private String documentToString(Document document) { String output = null; try { TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); //transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); StringWriter writer = new StringWriter(); transformer.transform(new DOMSource(document), new StreamResult(writer)); output = writer.getBuffer().toString().replaceAll("\n|\r", ""); } catch (Exception e) { textArea.append("KUNDE INTE KONSTRUERA STRING FROM XML" + " FEL: " + e.toString() + "\n"); } //System.out.println(output); return output; } 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 message = textFieldMessage.getText(); sendMessage(makeMessage(name, email, message)); textFieldMessage.setText(""); } } }