package jdk.jfr.internal.jfc;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.Reader;
import java.text.ParseException;
import jdk.internal.org.xml.sax.InputSource;
import jdk.internal.org.xml.sax.SAXException;
import jdk.internal.util.xml.SAXParser;
import jdk.internal.util.xml.impl.SAXParserImpl;
import jdk.jfr.Configuration;
import jdk.jfr.internal.PrivateAccess;
final class JFCParser {
static final String FILE_EXTENSION = ".jfc";
private static final int MAXIMUM_FILE_SIZE = 1024 * 1024;
public static Configuration createConfiguration(String name, Reader reader) throws IOException, ParseException {
return createConfiguration(name, readContent(reader));
}
public static Configuration createConfiguration(String name, String content) throws IOException, ParseException {
try {
JFCParserHandler ch = new JFCParserHandler();
parseXML(content, ch);
return PrivateAccess.getInstance().newConfiguration(name, ch.label, ch.description, ch.provider, ch.settings, content);
} catch (IllegalArgumentException iae) {
throw new ParseException(iae.getMessage(), -1);
} catch (SAXException e) {
ParseException pe = new ParseException("Error reading JFC file. " + e.getMessage(), -1);
pe.initCause(e);
throw pe;
}
}
private static void parseXML(String content, JFCParserHandler ch) throws SAXException, IOException {
CharArrayReader r = new CharArrayReader(content.toCharArray());
SAXParser parser = new SAXParserImpl();
parser.parse(new InputSource(r), ch);
}
private static String readContent(Reader r) throws IOException {
CharArrayWriter writer = new CharArrayWriter(1024);
int count = 0;
int ch;
while ((ch = r.read()) != -1) {
writer.write(ch);
count++;
if (count >= MAXIMUM_FILE_SIZE) {
throw new IOException("Presets with more than " + MAXIMUM_FILE_SIZE + " characters can't be read.");
}
}
return new String(writer.toCharArray());
}
}