1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.schemagen.xml.datatype;
28
29 import gov.nist.secauto.metaschema.core.model.IModule;
30 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
31 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
32 import gov.nist.secauto.metaschema.schemagen.datatype.IDatatypeContent;
33
34 import org.jdom2.Attribute;
35 import org.jdom2.Element;
36 import org.jdom2.filter.Filters;
37 import org.jdom2.xpath.XPathExpression;
38 import org.jdom2.xpath.XPathFactory;
39
40 import java.io.InputStream;
41 import java.util.LinkedHashMap;
42 import java.util.List;
43 import java.util.Map;
44 import java.util.function.Function;
45 import java.util.stream.Collectors;
46
47 import edu.umd.cs.findbugs.annotations.NonNull;
48
49 public class XmlCoreDatatypeProvider
50 extends AbstractXmlDatatypeProvider {
51
52 @Override
53 protected InputStream getSchemaResource() {
54 return IModule.class.getResourceAsStream("/schema/xml/metaschema-datatypes.xsd");
55 }
56
57 @Override
58 protected List<Element> queryElements(JDom2XmlSchemaLoader loader) {
59 return loader.getContent(
60 "/xs:schema/xs:simpleType",
61 CollectionUtil.singletonMap("xs", JDom2XmlSchemaLoader.NS_XML_SCHEMA));
62 }
63
64 @NonNull
65 private static List<String> analyzeDependencies(@NonNull Element element) {
66 XPathExpression<Attribute> xpath = XPathFactory.instance().compile(".//@base", Filters.attribute());
67 return ObjectUtils.notNull(xpath.evaluate(element).stream()
68 .map(attr -> attr.getValue())
69 .filter(type -> !type.startsWith("xs:"))
70 .distinct()
71 .collect(Collectors.toList()));
72 }
73
74 @Override
75 protected @NonNull Map<String, IDatatypeContent> handleResults(
76 @NonNull List<Element> items) {
77 return ObjectUtils.notNull(items.stream()
78 .map(element -> {
79 return (IDatatypeContent) new JDom2DatatypeContent(
80 ObjectUtils.requireNonNull(element.getAttributeValue("name")),
81 CollectionUtil.singletonList(element),
82 analyzeDependencies(element));
83 }).collect(Collectors.toMap(content -> content.getTypeName(), Function.identity(), (e1, e2) -> e2,
84 LinkedHashMap::new)));
85 }
86 }