95-733 Internet Technologies JAXB Java API for XML Binding JavaMail.
-
date post
21-Dec-2015 -
Category
Documents
-
view
228 -
download
0
Transcript of 95-733 Internet Technologies JAXB Java API for XML Binding JavaMail.
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
JAXBDTD
BindingSchema
.java file(s)
javac
.class files
javac
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 JAXBC:\McCarthy\www\95-733\examples\jaxb>java -jar D:\jaxb\jaxb-1.0-ea\lib\jaxb-xjc-1.0-ea.jar -helpUsage: 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 JAXBimport 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: [email protected]"); System.out.println(dis.readLine());
String Addressee = "[email protected]"; 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 SimpleEmailClient220-mail-fe2.andrew.cmu.edu ESMTP Sendmail 8.12.3.Beta2/8.12.3.Beta2220-Mis-identifing the sender of mail is an abuse of computing facilites.220 ESMTP spoken here250 2.1.0 [email protected]... Sender ok
Using JavaMail// A simple example using JavaMailimport 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("[email protected]", "[email protected]", "It's hot"); mailman.send();
}}
JavaMail Installation Instructions
1. Download the JavaMail API Implementation Version 1.3ea
2. Download the JavaBeans Activation Framework 1.0.2ea
3. Unzip both files.4. Add the following files to your classpath:
– mail.jar (JavaMail)– activation.jar (JAF file)
Visit http://java.sun.com/products/javamail