JAXBJavaMailJAXM

Download Report

Transcript JAXBJavaMailJAXM

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
.java file(s)
DTD
JAXB
Binding
Schema
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: [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 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 [email protected]... 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("[email protected]",
"[email protected]", "It's hot");
mailman.send();
}
}
JavaMail Installation Instructions
Visit http://java.sun.com/products/javamail
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)