400 likes | 553 Views
95-733 Internet Technologies. JAXB Java API for XML Binding JavaMail . JAXB. The Java Architecture for XML Binding Notes taken from the JAXB User’s Guide from Sun Microsystems. JAXB. Like SAX and DOM in that the application developer does not have to parse the XML
E N D
95-733 Internet Technologies • JAXB Java API for XML Binding • JavaMail
JAXB • The Java Architecture for XML Binding • Notes taken from the JAXB User’s Guide from Sun Microsystems
JAXB • Like SAX and DOM in that the application developer does not have to parse the XML • Unlike SAX and DOM it is tied to a particular document schema • Fast like SAX • In memory representation like DOM but without all the general tree manipulation facilities
JAXB • An XML Document is an instance of a schema • A Java object is an instance of a class • JAXB reads a schema and produces a class • Currently, the only schema supported is the Document Type Definition (DTD)
JAXB • Augments the standard DTD by providing type conversion <!ELEMENT notional (#PCDATA)> : : <notional>100.00</notional> • With JAXB we can make sure that Java converts this to a BigDecimal automatically
The Binding Schema • JAXB requires that we use a DTD AND a “Binding Schema” • The Binding Schema is an XML document JAXB .java file(s) DTD Binding Schema javac javac .class files
The Binding Schema • The binding schema contains instructions on how to bind a schema to classes. • It might say that : • this attribute (in the XML document) should be treated as an int • this element’s content is a BigDecimal • this element’s content is a String • this element should be treated as a class • and so on …
Running JAXB C:\McCarthy\www\95-733\examples\jaxb>java -jar D:\jaxb\jaxb-1.0-ea\lib\jaxb-xjc-1.0-ea.jar -help Usage: xjc <schema> [ <binding-schema> ] [ -d <directory> ] [ -roots <element-list> ] Options: -d <directory> Specify the destination directory for the Java output -roots <element-list> Designate one or more root elements (comma separated) -version Print the compiler's version number and exit -help Print this message and exit
Book.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE book SYSTEM "book.dtd"> <book> <title>The Catcher in the Rye </title> <author>J.D. Salinger </author> <chapter>If you really want to hear about it... </chapter> </book>
Book.dtd <!ELEMENT book (title,author, chapter)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT chapter (#PCDATA)>
A minimal binding schema Book.xjc <xml-java-binding-schema> <element name = "book" type = "class" root = "true" /> </xml-java-binding-schema>
Run JAXB C:\McCarthy\www\95-733\examples\jaxb>java -jar D:\jaxb\jaxb-1.0-ea\lib\jaxb-xjc-1.0-ea.jar book0.dtd book.xjc .\Book.java C:\McCarthy\www\95-733\examples\jaxb>
Resulting Book.java file import java.io.IOException; import java.io.InputStream; import javax.xml.bind.ConversionException; import javax.xml.bind.Dispatcher; import javax.xml.bind.InvalidAttributeException; import javax.xml.bind.LocalValidationException; import javax.xml.bind.MarshallableRootElement; import javax.xml.bind.Marshaller; import javax.xml.bind.MissingContentException; import javax.xml.bind.RootElement; import javax.xml.bind.StructureValidationException; import javax.xml.bind.UnmarshalException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.Validator; import javax.xml.marshal.XMLScanner; import javax.xml.marshal.XMLWriter;
public class Book extends MarshallableRootElement implements RootElement { private String _Title; private String _Author; private String _Chapter; public String getTitle() { return _Title; } public void setTitle(String _Title) { this._Title = _Title; if (_Title == null) { invalidate(); } }
public String getAuthor() { return _Author; } public void setAuthor(String _Author) { this._Author = _Author; if (_Author == null) { invalidate(); } } public String getChapter() { return _Chapter; } public void setChapter(String _Chapter) { this._Chapter = _Chapter; if (_Chapter == null) { invalidate(); } }
public void validateThis() throws LocalValidationException { if (_Title == null) { throw new MissingContentException("title"); } if (_Author == null) { throw new MissingContentException("author"); } if (_Chapter == null) { throw new MissingContentException("chapter"); } } public void validate(Validator v) throws StructureValidationException { }
public void marshal(Marshaller m) throws IOException { XMLWriter w = m.writer(); w.start("book"); w.leaf("title", _Title.toString()); w.leaf("author", _Author.toString()); w.leaf("chapter", _Chapter.toString()); w.end("book"); } public void unmarshal(Unmarshaller u) throws UnmarshalException { XMLScanner xs = u.scanner(); Validator v = u.validator(); xs.takeStart("book"); while (xs.atAttribute()) { String an = xs.takeAttributeName(); throw new InvalidAttributeException(an); }
if (xs.atStart("title")) { xs.takeStart("title"); String s; if (xs.atChars(XMLScanner.WS_COLLAPSE)) { s = xs.takeChars(XMLScanner.WS_COLLAPSE); } else { s = ""; } try { _Title = String.valueOf(s); } catch (Exception x) { throw new ConversionException("title", x); } xs.takeEnd("title"); } if (xs.atStart("author")) { xs.takeStart("author"); String s; if (xs.atChars(XMLScanner.WS_COLLAPSE)) { s = xs.takeChars(XMLScanner.WS_COLLAPSE); } else { s = ""; }
try { _Author = String.valueOf(s); } catch (Exception x) { throw new ConversionException("author", x); } xs.takeEnd("author"); } if (xs.atStart("chapter")) { xs.takeStart("chapter"); String s; if (xs.atChars(XMLScanner.WS_COLLAPSE)) { s = xs.takeChars(XMLScanner.WS_COLLAPSE); } else { s = ""; } try { _Chapter = String.valueOf(s); } catch (Exception x) { throw new ConversionException("chapter", x); } xs.takeEnd("chapter"); }
xs.takeEnd("book"); } public static Book unmarshal(InputStream in) throws UnmarshalException { return unmarshal(XMLScanner.open(in)); } public static Book unmarshal(XMLScanner xs) throws UnmarshalException { return unmarshal(xs, newDispatcher()); } public static Book unmarshal(XMLScanner xs, Dispatcher d) throws UnmarshalException { return ((Book) d.unmarshal(xs, (Book.class))); }
public boolean equals(Object ob) { if (this == ob) { return true; } if (!(ob instanceof Book)) { return false; } Book tob = ((Book) ob); if (_Title!= null) { if (tob._Title == null) { return false; } if (!_Title.equals(tob._Title)) { return false; } } else { if (tob._Title!= null) { return false; } }
if (_Author!= null) { if (tob._Author == null) { return false; } if (!_Author.equals(tob._Author)) { return false; } } else { if (tob._Author!= null) { return false; } } if (_Chapter!= null) { if (tob._Chapter == null) { return false; } if (!_Chapter.equals(tob._Chapter)) { return false; }
} else { if (tob._Chapter!= null) { return false; } } return true; } public int hashCode() { int h = 0; h = ((127 *h)+((_Title!= null)?_Title.hashCode(): 0)); h = ((127 *h)+((_Author!= null)?_Author.hashCode(): 0)); h = ((127 *h)+((_Chapter!= null)?_Chapter.hashCode(): 0)); return h; }
public String toString() { StringBuffer sb = new StringBuffer("<<book"); if (_Title!= null) { sb.append(" title="); sb.append(_Title.toString()); } if (_Author!= null) { sb.append(" author="); sb.append(_Author.toString()); } if (_Chapter!= null) { sb.append(" chapter="); sb.append(_Chapter.toString()); } sb.append(">>"); return sb.toString(); }
public static Dispatcher newDispatcher() { Dispatcher d = new Dispatcher(); d.register("book", (Book.class)); d.freezeElementNameMap(); return d; } }
A Driver Program // demo JAXB import java.io.*; public class TestJaxb { public static void main(String args[]) throws java.io.FileNotFoundException, javax.xml.bind.UnmarshalException, java.io.IOException { DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream(args[0]))); DataOutputStream out = new DataOutputStream( new FileOutputStream(args[1]));
// read in the book Book catcher = Book.unmarshal(in); // change its title catcher.setTitle("Gone With The Wind"); // write out the book catcher.marshal(out); } }
Compile and Run C:\McCarthy\www\95-733\examples\jaxb>javac Book.java C:\McCarthy\www\95-733\examples\jaxb>javac TestJaxb.java C:\McCarthy\www\95-733\examples\jaxb>java TestJaxb book.xml out.xml
Out.xml <?xml version="1.0" encoding="UTF-8"?> <book> <title>Gone With The Wind</title> <author>J.D. Salinger</author> <chapter>If you really want to hear about it...</chapter></book>
Writing Simple Email Clients in Java • Email Using Sockets • Email using the JavaMail API
Email Using Sockets (Linden Chapter 17) // See page 571 of Linden's Just Java Fifth Edition import java.io.*; import java.net.*; public class SimpleEmailClient { public static void main(String args[]) throws IOException { Socket sock; DataInputStream dis; PrintStream ps;
// open a socket to an email server on port 25 sock = new Socket("cyrus.andrew.cmu.edu",25); dis = new DataInputStream(sock.getInputStream()); ps = new PrintStream(sock.getOutputStream()); // talk email ps.println("mail from: mm6@andrew.cmu.edu"); System.out.println(dis.readLine()); String Addressee = "mm6@andrew.cmu.edu"; ps.println("rcpt to: " + Addressee); System.out.println(dis.readLine());
ps.println("data"); System.out.println(dis.readLine()); ps.println("A message sent by a Java client using sockets"); ps.println("."); System.out.println(dis.readLine()); ps.flush(); sock.close(); } }
Output Echos from Cyrus D:\McCarthy\www\95-713\JavaMail>java SimpleEmailClient 220-mail-fe2.andrew.cmu.edu ESMTP Sendmail 8.12.3.Beta2/8.12.3. Beta2 220-Mis-identifing the sender of mail is an abuse of computing facilites. 220 ESMTP spoken here 250 2.1.0 mm6@andrew.cmu.edu... Sender ok
Using JavaMail // A simple example using JavaMail import java.io.*; import java.net.InetAddress; import java.util.Properties; import java.util.Date; import javax.mail.*; import javax.mail.internet.*; public class Mailer { String to, from, msg;
public Mailer(String to, String from, String msg) { this.to = to; this.from = from; this.msg = msg; } public void send() { Session s = createSession(); try { Message mess = createMessage(s, msg); Transport.send(mess); } catch(MessagingException e) { System.out.println("Messaging Exception: "+e); }
catch(Exception e ) { System.out.println("Exception thrown" + e); } } private Session createSession() { Properties p = System.getProperties(); p.setProperty("mail.transport.protocol", "smtp"); p.setProperty("mail.smtp.host","cyrus.andrew.cmu.edu"); Session sess = Session.getDefaultInstance(p); return sess; }
private Message createMessage(Session sess, String msg)throws MessagingException{ Message mess = new MimeMessage(sess); mess.setFrom(new InternetAddress(from)); mess.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false)); mess.setSubject("Warning"); mess.setText(msg); mess.setSentDate(new Date()); return mess; }
public static void main(String a[]) { Mailer mailman = new Mailer("mm6@andrew.cmu.edu", "mccarthy@cs.pitt.edu", "It's hot"); mailman.send(); } }
JavaMail Installation Instructions Visit http://java.sun.com/products/javamail • Download the JavaMail API Implementation Version 1.3ea • Download the JavaBeans Activation Framework 1.0.2ea • Unzip both files. • Add the following files to your classpath: • mail.jar (JavaMail) • activation.jar (JAF file)