Title: XML Messaging
1Internet Technologies
XML Messaging A PowerWarning application
using servlets and SAX
The PowerWarning Application is from XML and
Java by Maruyama, Tamura, and Uramoto,
Addison-Wesley.
2XML Messaging Part I
The PowerWarning application allows users to
register their geographical position and their
temperature concerns. Users will receive e-mail
when the temperature exceeds the user specified
parameters.
This example is from XML and Java by
Maruyama, Tamura, and Uramoto, Addison-Wesley. Th
e web container is called Jigsaw from the W3C.
3Suppose that we know that the weather information
is available from the web at http//www.xweather.
com/White_Plains_NY_US.html.
1 lthtmlgt 2 ltheadgt 3 lttitlegtWeather
Reportlt/titlegt 4 lt/headgt 5 ltbodygt 6
lth2gtWeather Report -- White Plains, NY lt/h2gt 7
lttable border1gt 8 lttrgtlttdgtDate/Timelt/tdgtlttd
aligncentergt11 AM EDT Sat Jul 25
1998lt/tdgtlt/trgt 9 lttrgtlttdgtCurrent Tem.lt/tdgtlttd
aligncentergt70176lt/tdgtlt/trgt 10 lttrgtlttdgtToday
s Highlt/tdgtlttd aligncentergt82176lt/tdgtlt/trgt 1
1 lttrgtlttdgtTodays Lowlt/tdgtlttd aligncentergt6217
6lt/tdgtlttrgt 12 lt/tablegt 13 lt/bodygt 14
lt/htmlgt
4- Strategy 1
- For the current temperature of White Plains, go
to line 9, - column 46 of the page and continue until reaching
the next - ampersand.
- Strategy 2
- For the current temperature of the White Plains,
go to the - first lttablegt tag, then go to the second lttrgt tag
within the - table, and then go to the second lttggt tag within
the row.
Neither of these seems very appealing
5lt?xml version1.0?gt lt!DOCTYPE WeatherReport
SYSTEM httpgt//www.xweather.com/WeatherReport.dtd
gt ltWeatherReportgt ltCitygtWhite Plainslt/Citygt ltSta
tegtNYlt/Stategt ltDategtSat Jul 25
1998lt/Dategt ltTimegt11 AM EDTlt/Timegt ltCurrTemp
unitFarenheitgt70lt/CurrTempgt ltHigh
unitFarenheitgt82lt/Highgt ltLow
unitFarenheitgt62lt/Lowgt lt/Weather Reportgt
XML would help
6- Strategy 3
- For the current temperature of White Plains,
N.Y., go - to the ltCurrTempgt tag.
7WeatherReport application
Mobile users
XSLT
WML
HTML
XML
PC users
Http//www.xweather.com
PowerWarning application
XML
Email notifications
Registrations
Application programs
XML
8The XML Describing the Weather
lt?xml version"1.0" encoding"UTF-8"?gt ltWeatherRep
ortgt ltCitygtPittsburghlt/Citygt
ltStategtPAlt/Stategt ltDategtWed. April 11,
2001lt/Dategt ltTimegt3lt/Timegt
ltCurrTemp Unit "Farenheit"gt70lt/CurrTempgt
ltHigh Unit "Farenheit"gt82lt/Highgt ltLow
Unit "Farenheit"gt62lt/Lowgt
lt/WeatherReportgt
This file is behind Jigsaw in the
file Www/weather/ weather.xml.
Perhaps this is being served up by
www.xweather.com for ½ cents per hit.
9Serving the weather
// This servlet file is stored in
Www/Jigsaw/servlet/GetWeather.java // This
servlet returns a user selected xml weather file
from // the Www/weather directory and returns it
to the client. import java.io. import
java.util. import javax.servlet. import
javax.servlet.http. public class GetWeather
extends HttpServlet
This data would not normally be retrieved from a
file.
10public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException
String theData ""
/ For simplicity we get the users request
from the path. / String extraPath
req.getPathInfo() extraPath
extraPath.substring(1) // read the
file try //
open file and create a DataInputStream
FileInputStream theFile
new FileInputStream("c\\Jigsaw\\Jigsa
w\\
Jigsaw\\Www\\weather\\"extraPath)
11 InputStreamReader is new
InputStreamReader(theFile)
BufferedReader br new BufferedReader(is)
// read the file into the string
theData String
thisLine while((thisLine
br.readLine()) ! null)
theData thisLine "\n"
catch(Exception e)
System.err.println("Error " e)
PrintWriter out res.getWriter()
out.write(theData)
System.out.println("Wrote document to client")
out.close()
12WeatherReport application
Mobile users
XSLT
WML
HTML
XML
PC users
Http//www.xweather.com
PowerWarning application
XML
Email notifications
Registrations
Application programs
XML
13Registrations (HTML)
lt!-- PowerWarningForm.html --gt lthtmlgt ltheadgt lttitl
egtPowerWarninglt/titlegt lt/headgt ltbodygt ltform
method"post" action"/servlet/PowerWarn"gt
E-Mail ltinput type"text" name
"User"gt ltpgt State ltinput
type"text" name "State"gt ltpgt City
ltinput type"text" name "City"gt ltpgt
Temperature ltinput type"text" name
"Temperature"gt ltpgt Duration
ltinput type"text" name "Duration"gt ltpgt
ltinput type "submit"gt lt/formgt lt/bodygt lt/htm
lgt
14Registrations (Servlet)
The servlet will create a watcher object for each
registered user. The watcher object will be told
of each users location and temperature
requirements. Each watcher object will run in its
own thread and may or may not notify its
assigned user by email.
On servlet initialization, we will start up an
object whose responsibility it is to
periodically wake up and tell the watcher objects
to check the weather.
15Registrations (Servlet)
/ This servlet is called by an HTML form. The
form passes the user email, state, city,
temperature and duration. / import
java.io. import java.util. import
javax.servlet. import javax.servlet.http. pub
lic class PowerWarn extends HttpServlet
16 static Hashtable userTable / Holds
(email,watcher) pairs / public void
init(ServletConfig conf) throws ServletException
super.init(conf)
PowerWarn.userTable new Hashtable()
Scheduler scheduler new Scheduler()
scheduler.start() / Run the
scheduler /
/ The scheduler can see the hash
table. It has package access.
/
17public void doPost(HttpServletRequest req,
HttpServletResponse res) throws
ServletException, IOException /
Collect data from the HTML form /
String par_user req.getParameter("User")
String par_state req.getParameter("St
ate") String par_city
req.getParameter("City") int
par_temp Integer.parseInt(
req.getParameter("Tempera
ture")) int par_duration
Integer.parseInt(
req.getParameter("Duration"))
18 / Assign a watcher to this user.
/ Watcher watcher new Watcher(par_user,
par_state, par_city,
par_temp,
par_duration) / Place the
(email,watcher) pair in the hash table. /
PowerWarn.userTable.put(par_user, watcher)
res.setContentType("text/html")
PrintWriter writer res.getWriter()
writer.print("lthtmlgtltheadgtlt/headgtltbodygtltbgt
You'll be notified by
emaillt/bgtlt/bodygtlt/htmlgt")
writer.close()
19Servlet
Http Request
PowerWarn.userTable
Watcher
mm6_at_andrew.cmu.edu
User data
Email
Http Request
Watcher
User data
Email
w_at_whitehouse.gov
Scheduler
20The Scheduler
import java.util.Enumeration public class
Scheduler extends Thread
public void run()
System.out.println("Running scheduler")
while(true) Enumeration en
PowerWarn.userTable.elements()
while(en.hasMoreElements())
Watcher wa (Watcher)en.nextElement()
new Thread(wa).start()
21 try / put this thread to sleep
for 15 seconds /
Thread.sleep(1000 15)
catch(InterruptedException ie)
// ignore
/ end while /
public Scheduler() super()
Fifteen seconds for testing.
22The Watcher Class
The Watcher objects make HTTP requests to get
XML.
SAX.
How should we handle the XML? SAX or DOM?
JavaMail.
How do we send email?
23import org.xml.sax. import org.xml.sax.helpers.P
arserFactory import java.io. import
java.net. import org.w3c.dom.Document import
javax.xml.parsers.SAXParserFactory import
javax.xml.parsers.ParserConfigurationException im
port javax.xml.parsers.SAXParser
24public class Watcher extends HandlerBase
implements Runnable String user, state,
city int temp, duration, overTemp
public Watcher(String user, String state, String
city, int temp,
int duration) super()
this.user user this.state state
this.city city this.temp temp
this.duration duration
this.overTemp 0
25public void run() // called by scheduler
System.out.println("Running watcher") / Set
up to call the weather service. / String
weatheruri http//mccarthy.heinz.cmu.edu80
01/servlet/GetWeather /weather.xml" /
For simplicity we wont take the appropriate
approach. / / String weatheruri
"http//mccarthy.heinz.cmu.edu8001/servlet/GetWea
ther/?city" URLEncoder.encode(this.city)
/ / Create an InputSource object for the
parser to use. / InputSource is new
InputSource(weatheruri)
26try / Set up to handle incoming XML /
SAXParserFactory factory
SAXParserFactory.newInstance()
factory.setValidating(true)
SAXParser parser factory.newSAXParser()
parser.parse(is, this) / The parser makes
the calls. /
catch(Exception e)
e.printStackTrace()
return
/ The parsing and callbacks are done by this
time. / int currentTempNumber
try currentTempNumber
Integer.parseInt(this.currentTemp.trim())
catch( NumberFormatException e)
e.printStackTrace() return
27/ See if the user wants to be alerted.
/ if(currentTempNumber gt this.temp)
this.overTemp if(this.overTemp gt
this.duration) warning()
else
this.overTemp 0 / Send email via
JavaMail. The Mailer class is based on the
JavaMail API. / public void warning()
System.out.println("Sending
email") Mailer mailman new
Mailer(this.user,
"mm6_at_andrew.cmu.edu", "It's hot")
mailman.send()
28/ Handle SAX events. / StringBuffer
buffer String currentTemp public void
startDocument() throws SAXException
this.currentTemp null public void
startElement(String name, AttributeList aMap)
throws SAXException
if(name.equals("CurrTemp")) / Prepare for
next event. / this.buffer new
StringBuffer()
29public void endElement(String name) throws
SAXException
if(name.equals("CurrTemp"))
this.currentTemp this.buffer.toString()
this.buffer null
public void characters(char ch, int start, int
length) throws SAXException
if(this.buffer ! null) this.buffer.append(ch,star
t,length)
30WeatherReport application
Mobile users
WML
HTML
XML
PC users
Http//www.xweather.com
PowerWarning application
XML
Email notifications
Registrations
Application programs
XML