MLetParserpublic class MLetParser extends Object This class is used for parsing URLs. |
Fields Summary |
---|
private int | cThe current character | private static String | tagTag to parse. | private String | dbgTagThe name of this class to be used for trace messages |
Constructors Summary |
---|
public MLetParser()Create an MLet parser object
/*
* ------------------------------------------
* CONSTRUCTORS
* ------------------------------------------
*/
|
Methods Summary |
---|
private void | debug(java.lang.String clz, java.lang.String func, java.lang.String info)
Trace.send(Trace.LEVEL_DEBUG, Trace.INFO_MLET, clz, func, info);
| private void | debug(java.lang.String func, java.lang.String info)
debug(dbgTag, func, info);
| private boolean | isDebugOn()
return Trace.isSelected(Trace.LEVEL_DEBUG, Trace.INFO_MLET);
| private boolean | isTraceOn()
return Trace.isSelected(Trace.LEVEL_TRACE, Trace.INFO_MLET);
| public java.util.List | parse(java.net.URL url)Scan an html file for tags
String mth = "parse";
// Warning Messages
String requiresTypeWarning = "<arg type=... value=...> tag requires type parameter.";
String requiresValueWarning = "<arg type=... value=...> tag requires value parameter.";
String paramOutsideWarning = "<arg> tag outside <mlet> ... </mlet>.";
String requiresCodeWarning = "<mlet> tag requires either code or object parameter.";
String requiresJarsWarning = "<mlet> tag requires archive parameter.";
URLConnection conn;
conn = url.openConnection();
Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),
"UTF-8"));
// The original URL may have been redirected - this
// sets it to whatever URL/codebase we ended up getting
//
url = conn.getURL();
List<MLetContent> mlets = new ArrayList<MLetContent>();
Map<String,String> atts = null;
List<String> types = new ArrayList<String>();
List<String> values = new ArrayList<String>();
// debug("parse","*** Parsing " + url );
while(true) {
c = in.read();
if (c == -1)
break;
if (c == '<") {
c = in.read();
if (c == '/") {
c = in.read();
String nm = scanIdentifier(in);
if (c != '>")
throw new IOException("Missing '>' in tag");
if (nm.equalsIgnoreCase(tag)) {
if (atts != null) {
mlets.add(new MLetContent(url, atts, types, values));
}
atts = null;
types = new ArrayList<String>();
values = new ArrayList<String>();
}
} else {
String nm = scanIdentifier(in);
if (nm.equalsIgnoreCase("arg")) {
Map<String,String> t = scanTag(in);
String att = t.get("type");
if (att == null) {
if (isTraceOn()) {
trace(mth, requiresTypeWarning);
}
throw new IOException(requiresTypeWarning);
} else {
if (atts != null) {
types.add(att);
} else {
if (isTraceOn()) {
trace(mth, paramOutsideWarning);
}
throw new IOException(paramOutsideWarning);
}
}
String val = t.get("value");
if (val == null) {
if (isTraceOn()) {
trace(mth, requiresValueWarning);
}
throw new IOException(requiresValueWarning);
} else {
if (atts != null) {
values.add(val);
} else {
if (isTraceOn()) {
trace(mth, paramOutsideWarning);
}
throw new IOException(paramOutsideWarning);
}
}
} else {
if (nm.equalsIgnoreCase(tag)) {
atts = scanTag(in);
if (atts.get("code") == null && atts.get("object") == null) {
if (isTraceOn()) {
trace(mth, requiresCodeWarning);
}
atts = null;
throw new IOException(requiresCodeWarning);
}
if (atts.get("archive") == null) {
if (isTraceOn()) {
trace(mth, requiresJarsWarning);
}
atts = null;
throw new IOException(requiresJarsWarning);
}
}
}
}
}
}
in.close();
return mlets;
| public java.util.List | parseURL(java.lang.String urlname)Parse the document pointed by the URL urlname
// Parse the document
//
URL url = null;
if (urlname.indexOf(':") <= 1) {
String userDir = System.getProperty("user.dir");
String prot;
if (userDir.charAt(0) == '/" ||
userDir.charAt(0) == File.separatorChar) {
prot = "file:";
} else {
prot = "file:/";
}
url =
new URL(prot + userDir.replace(File.separatorChar, '/") + "/");
url = new URL(url, urlname);
} else {
url = new URL(urlname);
}
// Return list of parsed MLets
//
return parse(url);
| public java.lang.String | scanIdentifier(java.io.Reader in)Scan identifier
StringBuilder buf = new StringBuilder();
while (true) {
if (((c >= 'a") && (c <= 'z")) ||
((c >= 'A") && (c <= 'Z")) ||
((c >= '0") && (c <= '9")) || (c == '_")) {
buf.append((char)c);
c = in.read();
} else {
return buf.toString();
}
}
| public java.util.Map | scanTag(java.io.Reader in)Scan tag
Map<String,String> atts = new HashMap<String,String>();
skipSpace(in);
while (c >= 0 && c != '>") {
if (c == '<")
throw new IOException("Missing '>' in tag");
String att = scanIdentifier(in);
String val = "";
skipSpace(in);
if (c == '=") {
int quote = -1;
c = in.read();
skipSpace(in);
if ((c == '\'") || (c == '\"")) {
quote = c;
c = in.read();
}
StringBuilder buf = new StringBuilder();
while ((c > 0) &&
(((quote < 0) && (c != ' ") && (c != '\t") &&
(c != '\n") && (c != '\r") && (c != '>"))
|| ((quote >= 0) && (c != quote)))) {
buf.append((char)c);
c = in.read();
}
if (c == quote) {
c = in.read();
}
skipSpace(in);
val = buf.toString();
}
atts.put(att.toLowerCase(), val);
skipSpace(in);
}
return atts;
| public void | skipSpace(java.io.Reader in)Scan spaces.
while ((c >= 0) && ((c == ' ") || (c == '\t") || (c == '\n") || (c == '\r"))) {
c = in.read();
}
| private void | trace(java.lang.String clz, java.lang.String func, java.lang.String info)
Trace.send(Trace.LEVEL_TRACE, Trace.INFO_MLET, clz, func, info);
| private void | trace(java.lang.String func, java.lang.String info)
trace(dbgTag, func, info);
|
|