package org.jboss.mx.loading;
import java.util.Set;
import java.util.HashSet;
import java.util.StringTokenizer;
import java.util.NoSuchElementException;
import java.net.URL;
import java.net.MalformedURLException;
import java.text.ParseException;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.jboss.logging.Logger;
public class MLetParser
implements MBeanFileParser
{
private static final Logger log = Logger.getLogger(MLetParser.class);
public Set parseMBeanFile(String url) throws ParseException, MalformedURLException
{
return parseMBeanFile(new URL(url));
}
public Set parseMBeanFile(URL url) throws ParseException
{
Set mlets = new HashSet();
MBeanElement element = null;
try
{
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
int c = -1;
while((c = reader.read()) != -1)
{
if (c == '<')
{
StringBuffer buf = new StringBuffer(1000);
boolean readMore = true;
while(readMore)
{
c = reader.read();
if (c == -1)
throw new ParseException("Unexpected end of file. Tag was not closed: " + buf.toString().replace('\t', ' ').replace('\n', ' ').replace('\r', ' ').trim(), 0);
if (c == '>')
{
readMore = false;
break;
}
buf.append((char)c);
}
StringTokenizer tokenizer = new StringTokenizer(buf.toString(), "= \n\t\r");
String tagName = null, attributeName = null, attributeValue = null;
if (tokenizer.hasMoreTokens())
tagName = tokenizer.nextToken().trim();
if (tagName.equals("MLET"))
{
element = new MBeanElement();
while(tokenizer.hasMoreTokens())
{
try
{
attributeName = tokenizer.nextToken("= \n\t\r").trim();
attributeValue = tokenizer.nextToken(" \n\t\r").trim();
if (attributeValue.equals("="))
attributeValue = tokenizer.nextToken();
if (attributeName.equals("CODE"))
{
element.setCode(attributeValue);
}
else if (attributeName.equals("OBJECT"))
element.setObject(attributeValue);
else if (attributeName.equals("ARCHIVE"))
element.setArchive(attributeValue);
else if (attributeName.equals("CODEBASE"))
element.setCodebase(attributeValue);
else if (attributeName.equals("NAME"))
element.setName(attributeValue);
else if (attributeName.equals("VERSION"))
element.setVersion(attributeValue);
}
catch (NoSuchElementException e)
{
log.warn("No value found for attribute '" + attributeName);
}
}
if (element.getCode() == null && element.getObject() == null)
throw new ParseException("<" + buf.toString().replace('\n', ' ').replace('\r', ' ').replace('\t', ' ').trim() + "> is missing mandatory CODE | OBJECT attribute", 0);
if (element.getArchives().size() == 0)
throw new ParseException("<" + buf.toString().replace('\n', ' ').replace('\r', ' ').replace('\t', ' ').trim() + "> is missing mandatory ARCHIVE attribute", 0);
}
else if (tagName.equals("/MLET"))
{
mlets.add(element);
element = null;
}
else if (tagName.equals("ARG"))
{
try
{
if (!tokenizer.nextToken().equals("TYPE"))
continue;
String type = tokenizer.nextToken();
if (!tokenizer.nextToken().equals("VALUE"))
continue;
String value = tokenizer.nextToken(" \n\t\r");
if (element != null)
element.addArg(type, value);
}
catch (NoSuchElementException e)
{
element = null;
log.warn("Malformed element: <" + buf.toString() + ">");
}
}
} }
mlets.remove(null);
return mlets;
}
catch (IOException e)
{
throw new ParseException(e.toString(), 0);
}
}
}