xref: /aosp_15_r20/external/libxml2/xstc/fixup-tests.py (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*7c568831SAndroid Build Coastguard Worker
3*7c568831SAndroid Build Coastguard Workerimport sys, os
4*7c568831SAndroid Build Coastguard Workerimport libxml2
5*7c568831SAndroid Build Coastguard Worker
6*7c568831SAndroid Build Coastguard Worker
7*7c568831SAndroid Build Coastguard Workerlibxml2.debugMemory(1)
8*7c568831SAndroid Build Coastguard WorkerbaseDir = os.path.join('msxsdtest', 'Particles')
9*7c568831SAndroid Build Coastguard Workerfilenames = os.listdir(baseDir)
10*7c568831SAndroid Build Coastguard WorkermainXSD = str()
11*7c568831SAndroid Build Coastguard Workersignature = str()
12*7c568831SAndroid Build Coastguard WorkerdictXSD = dict()
13*7c568831SAndroid Build Coastguard Worker
14*7c568831SAndroid Build Coastguard Workerdef gatherFiles():
15*7c568831SAndroid Build Coastguard Worker    for file in filenames:
16*7c568831SAndroid Build Coastguard Worker        if (file[-5] in ["a", "b", "c"]) and (file[-3:] == 'xsd'):
17*7c568831SAndroid Build Coastguard Worker            # newfilename = string.replace(filename, ' ', '_')
18*7c568831SAndroid Build Coastguard Worker            signature = file[:-5]
19*7c568831SAndroid Build Coastguard Worker            mainXSD = signature + ".xsd"
20*7c568831SAndroid Build Coastguard Worker            imports = []
21*7c568831SAndroid Build Coastguard Worker            for sub in filenames:
22*7c568831SAndroid Build Coastguard Worker                if (mainXSD != sub) and (sub[-3:] == 'xsd') and sub.startswith(signature):
23*7c568831SAndroid Build Coastguard Worker                    imports.append(sub)
24*7c568831SAndroid Build Coastguard Worker            if len(imports) != 0:
25*7c568831SAndroid Build Coastguard Worker                dictXSD[mainXSD] = imports
26*7c568831SAndroid Build Coastguard Worker
27*7c568831SAndroid Build Coastguard Workerdef debugMsg(text):
28*7c568831SAndroid Build Coastguard Worker    #pass
29*7c568831SAndroid Build Coastguard Worker    print("DEBUG:", text)
30*7c568831SAndroid Build Coastguard Worker
31*7c568831SAndroid Build Coastguard Worker
32*7c568831SAndroid Build Coastguard Workerdef fixup():
33*7c568831SAndroid Build Coastguard Worker    for mainXSD in dictXSD:
34*7c568831SAndroid Build Coastguard Worker        debugMsg("fixing '%s'..." % mainXSD)
35*7c568831SAndroid Build Coastguard Worker        schemaDoc = None
36*7c568831SAndroid Build Coastguard Worker        xpmainCtx = None
37*7c568831SAndroid Build Coastguard Worker        # Load the schema document.
38*7c568831SAndroid Build Coastguard Worker        schemaFile = os.path.join(baseDir, mainXSD)
39*7c568831SAndroid Build Coastguard Worker        schemaDoc = libxml2.parseFile(schemaFile)
40*7c568831SAndroid Build Coastguard Worker        if (schemaDoc is None):
41*7c568831SAndroid Build Coastguard Worker            print("ERROR: doc '%s' not found" % mainXSD)
42*7c568831SAndroid Build Coastguard Worker            sys.exit(1)
43*7c568831SAndroid Build Coastguard Worker        try:
44*7c568831SAndroid Build Coastguard Worker            xpmainCtx = schemaDoc.xpathNewContext()
45*7c568831SAndroid Build Coastguard Worker            xpmainCtx.xpathRegisterNs("xs", "http://www.w3.org/2001/XMLSchema")
46*7c568831SAndroid Build Coastguard Worker            xpres = xpmainCtx.xpathEval("/xs:schema")
47*7c568831SAndroid Build Coastguard Worker            if len(xpres) == 0:
48*7c568831SAndroid Build Coastguard Worker                print("ERROR: doc '%s' has no <schema> element" % mainXSD)
49*7c568831SAndroid Build Coastguard Worker                sys.exit(1)
50*7c568831SAndroid Build Coastguard Worker            schemaElem = xpres[0]
51*7c568831SAndroid Build Coastguard Worker            schemaNs = schemaElem.ns()
52*7c568831SAndroid Build Coastguard Worker            # Select all <import>s.
53*7c568831SAndroid Build Coastguard Worker            xpres = xpmainCtx.xpathEval("/xs:schema/xs:import")
54*7c568831SAndroid Build Coastguard Worker            if len(xpres) != 0:
55*7c568831SAndroid Build Coastguard Worker                for elem in xpres:
56*7c568831SAndroid Build Coastguard Worker                    loc = elem.noNsProp("schemaLocation")
57*7c568831SAndroid Build Coastguard Worker                    if (loc is not None):
58*7c568831SAndroid Build Coastguard Worker                        debugMsg("  imports '%s'" % loc)
59*7c568831SAndroid Build Coastguard Worker                        if loc in dictXSD[mainXSD]:
60*7c568831SAndroid Build Coastguard Worker                            dictXSD[mainXSD].remove(loc)
61*7c568831SAndroid Build Coastguard Worker            for loc in dictXSD[mainXSD]:
62*7c568831SAndroid Build Coastguard Worker                # Read out the targetNamespace.
63*7c568831SAndroid Build Coastguard Worker                impTargetNs = None
64*7c568831SAndroid Build Coastguard Worker                impFile = os.path.join(baseDir, loc)
65*7c568831SAndroid Build Coastguard Worker                impDoc = libxml2.parseFile(impFile)
66*7c568831SAndroid Build Coastguard Worker                try:
67*7c568831SAndroid Build Coastguard Worker                    xpimpCtx = impDoc.xpathNewContext()
68*7c568831SAndroid Build Coastguard Worker                    try:
69*7c568831SAndroid Build Coastguard Worker                        xpimpCtx.setContextDoc(impDoc)
70*7c568831SAndroid Build Coastguard Worker                        xpimpCtx.xpathRegisterNs("xs", "http://www.w3.org/2001/XMLSchema")
71*7c568831SAndroid Build Coastguard Worker                        xpres = xpimpCtx.xpathEval("/xs:schema")
72*7c568831SAndroid Build Coastguard Worker                        impTargetNs = xpres[0].noNsProp("targetNamespace")
73*7c568831SAndroid Build Coastguard Worker                    finally:
74*7c568831SAndroid Build Coastguard Worker                        xpimpCtx.xpathFreeContext()
75*7c568831SAndroid Build Coastguard Worker                finally:
76*7c568831SAndroid Build Coastguard Worker                    impDoc.freeDoc()
77*7c568831SAndroid Build Coastguard Worker
78*7c568831SAndroid Build Coastguard Worker                # Add the <import>.
79*7c568831SAndroid Build Coastguard Worker                debugMsg("  adding <import namespace='%s' schemaLocation='%s'/>" % (impTargetNs, loc))
80*7c568831SAndroid Build Coastguard Worker                newElem = schemaDoc.newDocNode(schemaNs, "import", None)
81*7c568831SAndroid Build Coastguard Worker                if (impTargetNs is not None):
82*7c568831SAndroid Build Coastguard Worker                    newElem.newProp("namespace", impTargetNs)
83*7c568831SAndroid Build Coastguard Worker                newElem.newProp("schemaLocation", loc)
84*7c568831SAndroid Build Coastguard Worker                if schemaElem.children is not None:
85*7c568831SAndroid Build Coastguard Worker                    schemaElem.children.addPrevSibling(newElem)
86*7c568831SAndroid Build Coastguard Worker                schemaDoc.saveFile(schemaFile)
87*7c568831SAndroid Build Coastguard Worker        finally:
88*7c568831SAndroid Build Coastguard Worker            xpmainCtx.xpathFreeContext()
89*7c568831SAndroid Build Coastguard Worker            schemaDoc.freeDoc()
90*7c568831SAndroid Build Coastguard Worker
91*7c568831SAndroid Build Coastguard Workertry:
92*7c568831SAndroid Build Coastguard Worker    gatherFiles()
93*7c568831SAndroid Build Coastguard Worker    fixup()
94*7c568831SAndroid Build Coastguard Workerfinally:
95*7c568831SAndroid Build Coastguard Worker    libxml2.cleanupParser()
96*7c568831SAndroid Build Coastguard Worker    if libxml2.debugMemory(1) != 0:
97*7c568831SAndroid Build Coastguard Worker        print("Memory leak %d bytes" % (libxml2.debugMemory(1)))
98*7c568831SAndroid Build Coastguard Worker
99