}
public void setGraph(WriteGraph graph) {
+ if (graph == this.graph)
+ return;
this.graph = graph;
for (XMLParser p : subParsers.values())
p.setGraph(graph);
}
+ public void setLogger(ILogger logger) {
+ if (logger == this.logger)
+ return;
+ this.logger = logger;
+ for (XMLParser p : subParsers.values())
+ p.setLogger(logger);
+ }
+
public String getSchemaURI() {
return schemaURI;
}
public void add(XMLParser parser) {
subParsers.put(parser.getSchemaURI(), parser);
+
+ }
+
+ public XMLParser resolveDependencies() {
+
+ java.util.Map<String, XMLParser> map = new java.util.HashMap<>();
+ map.put(this.getSchemaURI(), this);
+ addDependencies(map);
+ return this;
+ }
+
+ public void addDependencies(java.util.Map<String,XMLParser> map) {
+
}
private List<ParserElement> idReferenceElements = new ArrayList<ParserElement>();
- private void loadElement(Deque<ParserElement> parents, ParserElement element) throws SAXException{
+
+ private boolean loadElement(Deque<ParserElement> parents, ParserElement element) throws SAXException{
+ return loadElement(parents, element, true);
+ }
+ private boolean loadElement(Deque<ParserElement> parents, ParserElement element, boolean checkParent) throws SAXException{
XMLElementParser parser = null;
ParserElement parent = null;
if (parents.size() > 0) {
+ // process a child element
parent = parents.peek();
// check for assigned subparser
- if (parent.getXMLParser() != null && parent.getXMLParser() != this) {
+ if (checkParent && parent.getXMLParser() != null && parent.getXMLParser() != this) {
+ //element.setXMLParser(parent.getXMLParser());
element.setXMLParser(parent.getXMLParser());
- parent.getXMLParser().loadElement(parents, element);
- return;
+ if (parent.getXMLParser().loadElement(parents, element))
+ return true;
}
if (parent.getElementParser() instanceof XMLElementNamedChildParser) {
// use parent's named child parser if it is supported
// parser = parsers.get(element.qName);
} else {
// otherwise use globally configured element parser
- parser = parsers.get(element.qName);
+ parser = parsers.get(element.getLocalName());
}
} else {
- // use globally configured element parser
- parser = parsers.get(element.qName);
+ // use globally configured element parser for a root element
+ parser = parsers.get(element.getLocalName());
}
if (parser != null) {
if (parser instanceof IDReferenceParser)
idReferenceElements.add(element);
element.setElementParser(parser);
+ return true;
} catch (DatabaseException e) {
throw new SAXException(e);
}
} else {
// check for schema reference attempt to locate subparser for it.
Attribute schemaRef = element.getAttribute(XML_NAMESPACE_REF);
+ String nsRef[] = element.getQName().split(":");
if (schemaRef != null && subParsers.containsKey(schemaRef.value)) {
XMLParser subParser = subParsers.get(schemaRef.value);
- subParser.loadElement(parents, element);
+ boolean b = subParser.loadElement(parents, element);
+ element.setXMLParser(subParser);
+ return b;
+ } else if (nsRef.length == 2 && element.getNS(nsRef[0]) != null && subParsers.containsKey(element.getNS(nsRef[0]))) {
+ XMLParser subParser = subParsers.get(element.getNS(nsRef[0]));
+ boolean b = subParser.loadElement(parents, element, false);
element.setXMLParser(subParser);
+ return b;
} else {
if (parent == null && parents.size() > 0)
parent = parents.peek();
String err = null;
if (parent != null)
- err = "Unknown element " + element.qName + ", parent " + (parent != null ? parent.getQName() : "None");
+ err = "Unknown element " + element.getLocalName() + ", parent " + (parent != null ? parent.getLocalName() : "None");
else {
- err = "Unknown root element " + element.qName + ", cannot import the file";
+ err = "Unknown root element " + element.getLocalName() + ", cannot import the file";
throw new SAXException(err);
}
logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err));
if (debug) System.err.println(err);
+ return false;
}
}
}
if (parent.getElementParser() != null) {
if (!parent.getElementParser().connectChild(graph, parent, element))
if (!parser.connectParent(graph, parent, element)) {
- String err = "Did not connect element " + element.qName + ", parent " + (parent != null ? parent.getQName() : "None");
+ String err = "Did not connect element " + element.getLocalName() + ", parent " + (parent != null ? parent.getLocalName() : "None");
logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err));
if (debug) System.err.println(err);
}
} else {
- String err = "Did not connect element " + element.qName + ", parent " + (parent != null ? parent.getQName() : "None") + " was not imported";
+ String err = "Did not connect element " + element.getLocalName() + ", parent " + (parent != null ? parent.getLocalName() : "None") + " was not imported";
logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err));
if (debug) System.err.println(err);
}
boolean useExt = existing.elementParser.idPriority() > element.elementParser.idPriority();
if (useExt)
idMap.put(id, existing);
- String err = "Duplicate XML element id: " + id + " for " + element.getQName() + " and " + existing.getQName() + ", using " + (useExt ? existing.getQName() : element.getQName());
+ String err = "Duplicate XML element id: " + id + " for " + element.getLocalName() + " and " + existing.getLocalName() + ", using " + (useExt ? existing.getLocalName() : element.getLocalName());
logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err));
if (debug) System.err.println(err);
}
public void done() throws SAXException{
try {
for (ParserElement e : idReferenceElements) {
- IDReferenceParser parser = (IDReferenceParser)parsers.get(e.qName);
+ IDReferenceParser parser = (IDReferenceParser)parsers.get(e.getLocalName());
if (!parser.connectReferences(graph, e, idMap)) {
- String err ="Could not resolve ID references for " + e.getQName() + " " + e.getUri();
+ String err ="Could not resolve ID references for " + e.getLocalName() + " " + e.getUri();
logger.log(new Status(IStatus.ERROR, PLUGIN_ID, err));
if (debug) System.err.println(err);
}
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
- ParserElement e = new ParserElement(uri,localName,name,attributes);
+ ParserElement e = new ParserElement(current.peek(),uri,localName,name,attributes);
loadElement(current,e);
current.push(e);
if (e != null) {
handleCharacters(e, charactersValue.toString());
handleElement(current,e);
- }
- if (current.isEmpty()) {
- root = e.getData();
+ if (current.isEmpty()) {
+ root = e.getData();
+ }
}
+
charactersValue = new StringBuilder();
}
}
public void parse(File file, ILogger logger) throws Exception {
- this.logger = logger;
+ setLogger(logger);
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();