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