/*
* @(#)MLetParser.java 1.26 04/04/16
*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package javax.management.loading;
// java import
import java.net.URL;
import java.net.URLConnection;
import java.net.MalformedURLException;
import java.io.Reader;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.File;
import java.util.Hashtable;
import java.util.Vector;
import com.sun.jmx.trace.Trace;
/**
* This class is used for parsing URLs.
*
* @since 1.5
*/
class MLetParser {
/*
* ------------------------------------------
* PRIVATE VARIABLES
* ------------------------------------------
*/
/**
* The current character
*/
private int c;
/**
* Tag to parse.
*/
private static String tag = "mlet";
/**
* The name of this class to be used for trace messages
*/
private String dbgTag = "MLetParser";
/*
* ------------------------------------------
* CONSTRUCTORS
* ------------------------------------------
*/
/**
* Create an MLet parser object
*/
public MLetParser() {
}
/*
* ------------------------------------------
* PUBLIC METHODS
* ------------------------------------------
*/
/**
* Scan spaces.
*/
public void skipSpace(Reader in) throws IOException {
while ((c >= 0) && ((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r'))) {
c = in.read();
}
}
/**
* Scan identifier
*/
public String scanIdentifier(Reader in) throws IOException {
StringBuffer buf = new StringBuffer();
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();
}
}
}
/**
* Scan tag
*/
public Hashtable scanTag(Reader in) throws IOException {
Hashtable atts = new Hashtable();
skipSpace(in);
while (c >= 0 && c != '>') {
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();
}
StringBuffer buf = new StringBuffer();
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;
}
/**
* Scan an html file for <mlet> tags
*/
public Vector parse(URL url) throws IOException {
String mth = "parse";
// Warning Messages
String requiresNameWarning = "<param name=... value=...> tag requires name parameter.";
String paramOutsideWarning = "<param> 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();
Vector mlets = new Vector();
Hashtable atts = null;
Vector types = new Vector();
Vector values = new Vector();
// 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 (nm.equalsIgnoreCase(tag)) {
if (atts != null) {
// Constructor parameters
if ((types.size() == values.size()) && ((!types.isEmpty()) && (!values.isEmpty()))) {
atts.put("types", types.clone());
atts.put("values", values.clone());
}
mlets.addElement(new MLetContent(url, atts));
}
atts = null;
types.removeAllElements();
values.removeAllElements();
}
} else {
String nm = scanIdentifier(in);
if (nm.equalsIgnoreCase("arg")) {
Hashtable t = scanTag(in);
String att = (String) t.get("type");
if (att == null) {
if (isTraceOn()) {
trace(mth, requiresNameWarning);
}
throw new IOException(requiresNameWarning);
} else {
if (atts != null) {
types.addElement(att);
} else {
if (isTraceOn()) {
trace(mth, paramOutsideWarning);
}
throw new IOException(paramOutsideWarning);
}
}
String val = (String) t.get("value");
if (val == null) {
if (isTraceOn()) {
trace(mth, requiresNameWarning);
}
throw new IOException(requiresNameWarning);
} else {
if (atts != null) {
values.addElement(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;
}
/**
* Parse the document pointed by the URL urlname
*/
public Vector parseURL(String urlname) throws IOException {
// 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);
}
/*
* ------------------------------------------
* PRIVATE METHODS
* ------------------------------------------
*/
// TRACES & DEBUG
//---------------
private boolean isTraceOn() {
return Trace.isSelected(Trace.LEVEL_TRACE, Trace.INFO_MLET);
}
private void trace(String clz, String func, String info) {
Trace.send(Trace.LEVEL_TRACE, Trace.INFO_MLET, clz, func, info);
}
private void trace(String func, String info) {
trace(dbgTag, func, info);
}
private boolean isDebugOn() {
return Trace.isSelected(Trace.LEVEL_DEBUG, Trace.INFO_MLET);
}
private void debug(String clz, String func, String info) {
Trace.send(Trace.LEVEL_DEBUG, Trace.INFO_MLET, clz, func, info);
}
private void debug(String func, String info) {
debug(dbgTag, func, info);
}
}
|