[jdom-interest] JDOMBean
Alex Chaffee
guru at edamame.stinky.com
Wed Jun 21 02:43:53 PDT 2000
Here's a bean I just whipped up so you can easily use JDOM in a
Servlet or JSP. It's a light wrapper that also keeps a cache of
already-parsed files, and checks to see if they've changed on disk,
and reloads if they have. (I know there's some sort of swap-out or
weak-reference stuff either in JDOM or coming soon, so this may be a
redundant feature.)
Usage in JSP (take your pick):
<jsp:useBean id="jdom" class="JDOMBean" scope="application">
<% jdom.setFileRoot(application.getRealPath("")); %>
</jsp:useBean>
or
<jsp:useBean id="jdom" class="JDOMBean" scope="application">
<jsp:setProperty name="jdom" property="fileRoot" value='<%=application.getRealPath("")%>' />
</jsp:useBean>
then
<%
Element root = jdom.getRootElement("news.xml");
%>
or
<%
Document doc = jdom.getDocument("news.xml");
%>
and you're playing with JDOM.
You can also set the parser in the constructor (maybe it should be a
property too).
So, does this qualify for the contrib directory?
- Alex
--
Alex Chaffee mailto:alex at jguru.com
jGuru - Java News and FAQs http://www.jguru.com/alex/
Creator of Gamelan http://www.gamelan.com/
Founder of Purple Technology http://www.purpletech.com/
Curator of Stinky Art Collective http://www.stinky.com/
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.*;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
public class JDOMBean {
/** Default SAX Driver class to use */
private static final String DEFAULT_SAX_DRIVER_CLASS =
"org.apache.xerces.parsers.SAXParser";
/** SAX Driver Class to use */
private String saxDriverClass = DEFAULT_SAX_DRIVER_CLASS;
/** <code>{@link SAXBuilder}</code> instance to use */
private SAXBuilder builder;
/** file cache **/
private Map files = new HashMap();
/** where to locate files **/
private File fileRoot;
public JDOMBean() {
init();
}
public JDOMBean(String saxDriverClass) {
this.saxDriverClass = saxDriverClass;
init();
}
/**
* <p>
* This will create an instance of <code>{@link SAXBuilder}</code>
* for use in the rest of this program.
* </p>
*
* @param saxDriverClass <code>String</code> name of driver class to use.
*/
public void init() {
builder = new SAXBuilder(saxDriverClass);
}
// todo: pathname normalization (remove ./ and foo/../ and so forth)
public Document getDocument(String filename) throws JDOMException {
FileInfo info = (FileInfo) files.get(filename);
File file = getFile(filename);
if (info == null ||
info.modified < file.lastModified())
{
Document doc = builder.build(file);
info = new FileInfo(filename, file.lastModified(), doc);
files.put(filename, info);
}
return info.document;
}
public Element getRootElement(String file) throws JDOMException {
Document doc = getDocument(file);
if (doc != null) return doc.getRootElement();
return null;
}
public void setFileRoot(String root) {
if (!root.endsWith("/")) {
root = root + "/";
}
this.fileRoot = new File(root);
}
public String getFileRoot() {
if (fileRoot == null) return null;
else return fileRoot.getAbsolutePath();
}
private File getFile(String filename) {
File file;
if (fileRoot == null) {
return new File(filename);
}
else {
return new File(fileRoot, filename);
}
}
class FileInfo {
String name;
long modified;
Document document;
public FileInfo(String name, long modified, Document document) {
this.name = name;
this.modified = modified;
this.document = document;
}
}
// test
public static void main(String[] args) throws IOException, JDOMException {
int i=0;
JDOMBean bean;
if (args[i].equals("-parser")) {
++i;
bean = new JDOMBean(args[i]);
i++;
}
else {
bean = new JDOMBean();
}
XMLOutputter out = new XMLOutputter();
for (; i<args.length; ++i) {
Document doc = bean.getDocument(args[i]);
out.output(doc, System.out);
}
}
}
More information about the jdom-interest
mailing list