|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package jdk.jfr.internal.jfc; |
|
import java.util.LinkedHashMap; |
|
import java.util.Map; |
|
|
|
import jdk.internal.org.xml.sax.Attributes; |
|
import jdk.internal.org.xml.sax.SAXException; |
|
import jdk.internal.org.xml.sax.helpers.DefaultHandler; |
|
|
|
final class JFCParserHandler extends DefaultHandler { |
|
private static final String ELEMENT_CONFIGURATION = "configuration"; |
|
private static final String ELEMENT_EVENT_TYPE = "event"; |
|
private static final String ELEMENT_SETTING = "setting"; |
|
private static final String ATTRIBUTE_NAME = "name"; |
|
private static final String ATTRIBUTE_LABEL = "label"; |
|
private static final String ATTRIBUTE_DESCRIPTION = "description"; |
|
private static final String ATTRIBUTE_PROVIDER = "provider"; |
|
private static final String ATTRIBUTE_VERSION = "version"; |
|
|
|
final Map<String, String> settings = new LinkedHashMap<String, String>(); |
|
private String currentEventPath; |
|
private String currentSettingsName; |
|
private StringBuilder currentCharacters; |
|
String label; |
|
String provider; |
|
String description; |
|
|
|
@Override |
|
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { |
|
switch (qName.toLowerCase()) { |
|
case ELEMENT_CONFIGURATION: |
|
String version = attributes.getValue(ATTRIBUTE_VERSION); |
|
if (version == null || !version.startsWith("2.")) { |
|
throw new SAXException("This version of Flight Recorder can only read JFC file format version 2.x"); |
|
} |
|
label = attributes.getValue(ATTRIBUTE_LABEL); |
|
description = getOptional(attributes, ATTRIBUTE_DESCRIPTION, ""); |
|
provider = getOptional(attributes, ATTRIBUTE_PROVIDER, ""); |
|
break; |
|
case ELEMENT_EVENT_TYPE: |
|
currentEventPath = attributes.getValue(ATTRIBUTE_NAME); |
|
break; |
|
case ELEMENT_SETTING: |
|
currentSettingsName = attributes.getValue(ATTRIBUTE_NAME); |
|
break; |
|
} |
|
currentCharacters = null; |
|
} |
|
|
|
private String getOptional(Attributes attributes, String name, String defaultValue) { |
|
String value = attributes.getValue(name); |
|
return value == null ? defaultValue : value; |
|
} |
|
|
|
@Override |
|
public void characters(char[] ch, int start, int length) throws SAXException { |
|
if (currentCharacters == null) { |
|
currentCharacters = new StringBuilder(length); |
|
} |
|
currentCharacters.append(ch, start, length); |
|
} |
|
|
|
@Override |
|
public void endElement(String uri, String localName, String qName) { |
|
switch (qName.toLowerCase()) { |
|
case ELEMENT_CONFIGURATION: |
|
break; |
|
case ELEMENT_EVENT_TYPE: |
|
currentEventPath = null; |
|
break; |
|
case ELEMENT_SETTING: |
|
String settingsValue = currentCharacters == null ? "" : currentCharacters.toString(); |
|
settings.put(currentEventPath + "#" + currentSettingsName, "" + settingsValue); |
|
currentSettingsName = null; |
|
break; |
|
} |
|
} |
|
|
|
public Map<String, String> getSettings() { |
|
return settings; |
|
} |
|
} |