fix duplicate link creation
This commit is contained in:
parent
4a73b746bd
commit
f43dcd904f
|
@ -779,7 +779,7 @@ public class JsonParser extends ParserBase {
|
|||
prop("resourceType", e.getType(), null);
|
||||
Set<String> done = new HashSet<String>();
|
||||
for (Element child : e.getChildren()) {
|
||||
compose(e.getName(), e, done, child);
|
||||
compose(e.getName(), e, done, child, "");
|
||||
}
|
||||
json.endObject();
|
||||
json.finish();
|
||||
|
@ -804,28 +804,28 @@ public class JsonParser extends ParserBase {
|
|||
prop("resourceType", e.getType(), linkResolver == null ? null : linkResolver.resolveProperty(e.getProperty()));
|
||||
Set<String> done = new HashSet<String>();
|
||||
for (Element child : e.getChildren()) {
|
||||
compose(e.getName(), e, done, child);
|
||||
compose(e.getName(), e, done, child, "");
|
||||
}
|
||||
json.endObject();
|
||||
json.finish();
|
||||
}
|
||||
|
||||
private void compose(String path, Element e, Set<String> done, Element child) throws IOException {
|
||||
private void compose(String path, Element e, Set<String> done, Element child, String tgtPath) throws IOException {
|
||||
checkComposeComments(child);
|
||||
if (wantCompose(path, child)) {
|
||||
boolean isList = child.hasElementProperty() ? child.getElementProperty().isList() : child.getProperty().isList();
|
||||
if (!isList) {// for specials, ignore the cardinality of the stated type
|
||||
compose(path, child);
|
||||
compose(path, child, tgtPath);
|
||||
} else if (!done.contains(child.getName())) {
|
||||
done.add(child.getName());
|
||||
List<Element> list = e.getChildrenByName(child.getName());
|
||||
composeList(path, list);
|
||||
composeList(path, list, tgtPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void composeList(String path, List<Element> list) throws IOException {
|
||||
private void composeList(String path, List<Element> list, String tgtPath) throws IOException {
|
||||
// there will be at least one element
|
||||
String name = list.get(0).getName();
|
||||
boolean complex = true;
|
||||
|
@ -858,6 +858,7 @@ public class JsonParser extends ParserBase {
|
|||
}
|
||||
if (complex) {
|
||||
openArray(name, linkResolver == null ? null : linkResolver.resolveProperty(list.get(0).getProperty()));
|
||||
int i = 0;
|
||||
for (Element item : list) {
|
||||
if (item.hasChildren()) {
|
||||
open(null,null);
|
||||
|
@ -872,11 +873,21 @@ public class JsonParser extends ParserBase {
|
|||
}
|
||||
Set<String> done = new HashSet<String>();
|
||||
for (Element child : item.getChildren()) {
|
||||
compose(path+"."+name+"[]", item, done, child);
|
||||
String tp = tgtPath;
|
||||
if (child.getSpecial() == SpecialElement.BUNDLE_ENTRY) {
|
||||
if (Utilities.noString(tp)) {
|
||||
tp = "Bnd."+i+".";
|
||||
} else {
|
||||
tp = tgtPath+i+".";
|
||||
}
|
||||
}
|
||||
compose(path+"."+name+"[]", item, done, child, tp);
|
||||
}
|
||||
close();
|
||||
} else
|
||||
} else {
|
||||
json.nullValue();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
closeArray();
|
||||
}
|
||||
|
@ -903,14 +914,14 @@ public class JsonParser extends ParserBase {
|
|||
json.value(item.getValue());
|
||||
}
|
||||
|
||||
private void compose(String path, Element element) throws IOException {
|
||||
private void compose(String path, Element element, String tgtPath) throws IOException {
|
||||
String name = element.getName();
|
||||
if (element.isPrimitive() || isPrimitive(element.getType())) {
|
||||
if (element.hasValue())
|
||||
primitiveValue(name, element);
|
||||
name = "_"+name;
|
||||
if (element.getType().equals("xhtml"))
|
||||
json.anchor("end-xhtml");
|
||||
json.anchor(tgtPath+"end-xhtml");
|
||||
}
|
||||
if (element.hasChildren()) {
|
||||
open(name, linkResolver == null ? null : linkResolver.resolveProperty(element.getProperty()));
|
||||
|
@ -925,7 +936,7 @@ public class JsonParser extends ParserBase {
|
|||
}
|
||||
Set<String> done = new HashSet<String>();
|
||||
for (Element child : element.getChildren()) {
|
||||
compose(path+"."+element.getName(), element, done, child);
|
||||
compose(path+"."+element.getName(), element, done, child, tgtPath);
|
||||
}
|
||||
close();
|
||||
}
|
||||
|
|
|
@ -100,6 +100,7 @@ public class XmlParser extends ParserBase {
|
|||
}
|
||||
|
||||
private String schemaPath;
|
||||
private int bundleEntryCounter = 0;
|
||||
|
||||
public String getSchemaPath() {
|
||||
return schemaPath;
|
||||
|
@ -117,10 +118,10 @@ public class XmlParser extends ParserBase {
|
|||
}
|
||||
|
||||
public List<ValidatedFragment> parse(InputStream inStream) throws FHIRFormatError, DefinitionException, FHIRException, IOException {
|
||||
|
||||
|
||||
byte[] content = TextFile.streamToBytes(inStream);
|
||||
ValidatedFragment focusFragment = new ValidatedFragment(ValidatedFragment.FOCUS_NAME, "xml", content, false);
|
||||
|
||||
|
||||
ByteArrayInputStream stream = new ByteArrayInputStream(content);
|
||||
Document doc = null;
|
||||
try {
|
||||
|
@ -318,7 +319,7 @@ public class XmlParser extends ParserBase {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public Element parse(List<ValidationMessage> errors, org.w3c.dom.Element base, String type) throws Exception {
|
||||
StructureDefinition sd = getDefinition(errors, 0, 0, FormatUtilities.FHIR_NS, type);
|
||||
Element result = new Element(base.getLocalName(), new Property(context, sd.getSnapshot().getElement().get(0), sd, getProfileUtilities(), getContextUtilities())).setFormat(FhirFormat.XML).setNativeObject(base);
|
||||
|
@ -429,7 +430,7 @@ public class XmlParser extends ParserBase {
|
|||
while (child != null) {
|
||||
if (child.getNodeType() == Node.ELEMENT_NODE) {
|
||||
Property property = getElementProp(properties, child.getLocalName(), child.getNamespaceURI());
|
||||
|
||||
|
||||
if (property != null) {
|
||||
if (property.getName().equals(lastName)) {
|
||||
repeatCount++;
|
||||
|
@ -507,13 +508,13 @@ public class XmlParser extends ParserBase {
|
|||
lastName = cgProp.getName();
|
||||
repeatCount = 0;
|
||||
}
|
||||
|
||||
|
||||
String npath = path+"/"+pathPrefix(cgProp.getXmlNamespace())+cgProp.getName();
|
||||
String name = cgProp.getName();
|
||||
Element cgn = new Element(cgProp.getName(), cgProp).setFormat(FhirFormat.XML);
|
||||
cgn.setPath(element.getPath()+"."+cgProp.getName()+"["+repeatCount+"]");
|
||||
element.getChildren().add(cgn);
|
||||
|
||||
|
||||
npath = npath+"/"+pathPrefix(child.getNamespaceURI())+child.getLocalName();
|
||||
name = child.getLocalName();
|
||||
Element n = new Element(name, property).markLocation(line(child, false), col(child, false)).setFormat(FhirFormat.XML).setNativeObject(child);
|
||||
|
@ -534,20 +535,20 @@ public class XmlParser extends ParserBase {
|
|||
lastName = cgProp.getName();
|
||||
repeatCount = 0;
|
||||
}
|
||||
|
||||
|
||||
String npath = path+"/"+pathPrefix(cgProp.getXmlNamespace())+cgProp.getName();
|
||||
String name = cgProp.getName();
|
||||
Element cgn = new Element(cgProp.getName(), cgProp).setFormat(FhirFormat.XML);
|
||||
cgn.setPath(element.getPath()+"."+cgProp.getName()+"["+repeatCount+"]");
|
||||
element.getChildren().add(cgn);
|
||||
|
||||
|
||||
npath = npath+"/text()";
|
||||
name = mtProp.getName();
|
||||
Element n = new Element(name, mtProp, mtProp.getType(), child.getTextContent().trim()).markLocation(line(child, false), col(child, false)).setFormat(FhirFormat.XML).setNativeObject(child);
|
||||
cgn.getChildren().add(n);
|
||||
n.setPath(element.getPath()+"."+mtProp.getName());
|
||||
|
||||
|
||||
|
||||
} else if (child.getNodeType() == Node.CDATA_SECTION_NODE) {
|
||||
logError(errors, ValidationMessage.NO_RULE_DATE, line(child, false), col(child, false), path, IssueType.STRUCTURE, context.formatMessage(I18nConstants.CDATA_IS_NOT_ALLOWED), IssueSeverity.ERROR);
|
||||
} else if (!Utilities.existsInList(child.getNodeType(), 3, 8)) {
|
||||
|
@ -565,7 +566,7 @@ public class XmlParser extends ParserBase {
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
private boolean validAttrValue(String value) {
|
||||
if (version == null) {
|
||||
return true;
|
||||
|
@ -608,7 +609,7 @@ public class XmlParser extends ParserBase {
|
|||
return p;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
@ -737,7 +738,7 @@ public class XmlParser extends ParserBase {
|
|||
if (hasTypeAttr(e))
|
||||
xml.namespace("http://www.w3.org/2001/XMLSchema-instance", "xsi");
|
||||
addNamespaces(xml, e);
|
||||
composeElement(xml, e, e.getType(), true);
|
||||
composeElement(xml, e, e.getType(), true, "");
|
||||
xml.end();
|
||||
}
|
||||
|
||||
|
@ -795,11 +796,11 @@ public class XmlParser extends ParserBase {
|
|||
if (schemaPath != null) {
|
||||
xml.setSchemaLocation(FormatUtilities.FHIR_NS, Utilities.pathURL(schemaPath, e.fhirType()+".xsd"));
|
||||
}
|
||||
composeElement(xml, e, e.getType(), true);
|
||||
composeElement(xml, e, e.getType(), true, "");
|
||||
xml.end();
|
||||
}
|
||||
|
||||
private void composeElement(IXMLWriter xml, Element element, String elementName, boolean root) throws IOException, FHIRException {
|
||||
private void composeElement(IXMLWriter xml, Element element, String elementName, boolean root, String tgtPath) throws IOException, FHIRException {
|
||||
if (showDecorations) {
|
||||
@SuppressWarnings("unchecked")
|
||||
List<ElementDecoration> decorations = (List<ElementDecoration>) element.getUserData("fhir.decorations");
|
||||
|
@ -833,7 +834,7 @@ public class XmlParser extends ParserBase {
|
|||
new CDANarrativeFormat().convert(xml, new XhtmlParser().parseFragment(rawXhtml));
|
||||
} else {
|
||||
xml.escapedText(rawXhtml);
|
||||
xml.anchor("end-xhtml");
|
||||
xml.anchor(tgtPath+"end-xhtml");
|
||||
}
|
||||
} else if (isText(element.getProperty())) {
|
||||
if (linkResolver != null)
|
||||
|
@ -857,7 +858,7 @@ public class XmlParser extends ParserBase {
|
|||
}
|
||||
}
|
||||
for (Element child : element.getChildren())
|
||||
composeElement(xml, child, child.getName(), false);
|
||||
composeElement(xml, child, child.getName(), false, tgtPath);
|
||||
xml.exit(element.getProperty().getXmlNamespace(),elementName);
|
||||
} else
|
||||
xml.element(elementName);
|
||||
|
@ -908,8 +909,18 @@ public class XmlParser extends ParserBase {
|
|||
if (linkResolver != null)
|
||||
xml.link(linkResolver.resolveProperty(element.getProperty()));
|
||||
xml.text(child.getValue());
|
||||
} else if (!isAttr(child.getProperty()))
|
||||
composeElement(xml, child, child.getName(), false);
|
||||
} else if (!isAttr(child.getProperty())) {
|
||||
String tp = tgtPath;
|
||||
if (child.getSpecial() == SpecialElement.BUNDLE_ENTRY) {
|
||||
bundleEntryCounter ++;
|
||||
if (Utilities.noString(tp)) {
|
||||
tp = "Bnd."+bundleEntryCounter+".";
|
||||
} else {
|
||||
tp = tgtPath+bundleEntryCounter+".";
|
||||
}
|
||||
}
|
||||
composeElement(xml, child, child.getName(), false, tp);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!root && element.getSpecial() != null)
|
||||
|
@ -924,12 +935,12 @@ public class XmlParser extends ParserBase {
|
|||
ElementDefinition ed = property.getDefinition();
|
||||
String ns = property.getXmlNamespace();
|
||||
String n = property.getXmlName();
|
||||
|
||||
|
||||
String diff = property.getName().toLowerCase().replace(n.toLowerCase(), "");
|
||||
if (!Utilities.noString(diff) && diff.length() <= 5 && Utilities.isToken(diff) && !xml.abbreviationDefined(diff)) {
|
||||
return diff;
|
||||
}
|
||||
|
||||
|
||||
int i = ns.length()-1;
|
||||
while (i > 0) {
|
||||
if (Character.isAlphabetic(ns.charAt(i)) || Character.isDigit(ns.charAt(i))) {
|
||||
|
@ -942,7 +953,7 @@ public class XmlParser extends ParserBase {
|
|||
if (!Utilities.noString(tail) && tail.length() <= 5 && Utilities.isToken(tail) && !xml.abbreviationDefined(tail)) {
|
||||
return tail;
|
||||
}
|
||||
|
||||
|
||||
i = 0;
|
||||
while (xml.abbreviationDefined("ns"+i)) {
|
||||
i++;
|
||||
|
@ -1008,17 +1019,17 @@ public class XmlParser extends ParserBase {
|
|||
class NullErrorHandler implements ErrorHandler {
|
||||
@Override
|
||||
public void fatalError(SAXParseException e) {
|
||||
// do nothing
|
||||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(SAXParseException e) {
|
||||
// do nothing
|
||||
// do nothing
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void warning(SAXParseException e) {
|
||||
// do nothing
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue