1*23436e16SPedro Giffuni#!/usr/bin/env python
2cdf0e10cSrcweir#_____________________________________________
3cdf0e10cSrcweir# Caolan McNamara caolanm@redhat.com
4cdf0e10cSrcweir# converted from original java written by Andreas Schluens so we can continue
5cdf0e10cSrcweir# to build 680 OpenOffice.org series without java
6cdf0e10cSrcweir# this is not really a replacement for the existing java tool, just the
7cdf0e10cSrcweir# minimum required to make it work for now, the existing tool is still
8cdf0e10cSrcweir# the canonical base, changes to it will have to be mirrored here until
9cdf0e10cSrcweir# there is a java which is available for use by all
10cdf0e10cSrcweir#_____________________________________________
11cdf0e10cSrcweir
12*23436e16SPedro Giffuniimport sys, string, os.path
13cdf0e10cSrcweir
14cdf0e10cSrcweirCFGFILE             = os.environ["SOLARVER"] + "/" + os.environ["INPATH"] + "/inc/l10ntools/FCFGMerge.cfg"
15cdf0e10cSrcweir
16cdf0e10cSrcweirPROP_XMLVERSION      = "xmlversion"               # // <= global cfg file
17cdf0e10cSrcweirPROP_XMLENCODING     = "xmlencoding"              # // <= global cfg file
18cdf0e10cSrcweirPROP_XMLPATH         = "xmlpath"                  # // <= global cfg file
19cdf0e10cSrcweirPROP_XMLPACKAGE      = "xmlpackage"               # // <= global cfg file
20cdf0e10cSrcweirPROP_SETNAME_TYPES    = "setname_types"           # // <= global cfg file
21cdf0e10cSrcweirPROP_SETNAME_FILTERS  = "setname_filters"         # // <= global cfg file
22cdf0e10cSrcweirPROP_SETNAME_LOADERS  = "setname_frameloaders"    # // <= global cfg file
23cdf0e10cSrcweirPROP_SETNAME_HANDLERS = "setname_contenthandlers" # // <= global cfg file
24cdf0e10cSrcweirPROP_SUBDIR_TYPES    = "subdir_types"             # // <= global cfg file
25cdf0e10cSrcweirPROP_SUBDIR_FILTERS  = "subdir_filters"           # // <= global cfg file
26cdf0e10cSrcweirPROP_SUBDIR_LOADERS  = "subdir_frameloaders"      # // <= global cfg file
27cdf0e10cSrcweirPROP_SUBDIR_HANDLERS = "subdir_contenthandlers"   # // <= global cfg file
28cdf0e10cSrcweirPROP_EXTENSION_XCU   = "extension_xcu"            # // <= global cfg file
29cdf0e10cSrcweirPROP_EXTENSION_PKG   = "extension_pkg"            # // <= global cfg file
30cdf0e10cSrcweirPROP_DELIMITER       = "delimiter"                # // <= global cfg file
31cdf0e10cSrcweirPROP_TRIM            = "trim"                     # // <= global cfg file
32cdf0e10cSrcweirPROP_DECODE          = "decode"                   # // <= global cfg file
33cdf0e10cSrcweirPROP_FRAGMENTSDIR    = "fragmentsdir"             # // <= cmdline
34cdf0e10cSrcweirPROP_TEMPDIR         = "tempdir"                  # // <= cmdline
35cdf0e10cSrcweirPROP_OUTDIR          = "outdir"                   # // <= cmdline
36cdf0e10cSrcweirPROP_PKG             = "pkg"                      # // <= cmdline
37cdf0e10cSrcweirPROP_TCFG            = "tcfg"                     # // <= cmdline
38cdf0e10cSrcweirPROP_FCFG            = "fcfg"                     # // <= cmdline
39cdf0e10cSrcweirPROP_LCFG            = "lcfg"                     # // <= cmdline
40cdf0e10cSrcweirPROP_CCFG            = "ccfg"                     # // <= cmdline
41cdf0e10cSrcweirPROP_LANGUAGEPACK    = "languagepack"             # // <= cmdline
42cdf0e10cSrcweirPROP_ITEMS           = "items"                    # // <= pkg cfg files!
43cdf0e10cSrcweir
44cdf0e10cSrcweir#---begin java.util.Properties copy---#
45cdf0e10cSrcweir"""
46cdf0e10cSrcweir
47*23436e16SPedro GiffuniAn incomplete clean room implementation of
48cdf0e10cSrcweirjava.util.Properties written in Python.
49cdf0e10cSrcweir
50cdf0e10cSrcweirCopyright (C) 2002,2004 - Ollie Rutherfurd <oliver@rutherfurd.net>
51cdf0e10cSrcweir
52cdf0e10cSrcweirBased on:
53cdf0e10cSrcweir
54*23436e16SPedro Giffuni        http://java.sun.com/j2se/1.3/docs/api/java/util/Properties.html
55cdf0e10cSrcweir
56cdf0e10cSrcweirMissing:
57cdf0e10cSrcweir
58cdf0e10cSrcweir - Currently, u\XXXX sequences are escaped when saving, but not unescaped
59cdf0e10cSrcweir   when read..
60cdf0e10cSrcweir
61cdf0e10cSrcweirLicense: Python License
62cdf0e10cSrcweir
63cdf0e10cSrcweirExample Usage:
64cdf0e10cSrcweir
65cdf0e10cSrcweir>>> from properties import Properties
66cdf0e10cSrcweir>>> props = Properties()
67cdf0e10cSrcweir>>> props['one'] = '1'
68cdf0e10cSrcweir>>> props['your name'] = "I don't know"
69cdf0e10cSrcweir>>> print '\n'.join(props.keys())
70cdf0e10cSrcweiryour name
71cdf0e10cSrcweirone
72cdf0e10cSrcweir>>> from StringIO import StringIO
73cdf0e10cSrcweir>>> buff = StringIO()
74cdf0e10cSrcweir>>> props.store(buff, "a little example...")
75cdf0e10cSrcweir>>> buff.seek(0)
76cdf0e10cSrcweir>>> print buff.read()
77cdf0e10cSrcweir# a little example...
78cdf0e10cSrcweiryour\ name=I\ don\'t\ know
79cdf0e10cSrcweirone=1
80cdf0e10cSrcweir>>> print props['your name']
81cdf0e10cSrcweirI don't know
82cdf0e10cSrcweir
83cdf0e10cSrcweir$Id: pyAltFCFGMerge,v 1.3 2007-12-07 10:57:44 vg Exp $
84cdf0e10cSrcweir
85cdf0e10cSrcweir"""
86cdf0e10cSrcweir
87cdf0e10cSrcweir__all__ = ['Properties']
88cdf0e10cSrcweir
89cdf0e10cSrcweir
90cdf0e10cSrcweirdef dec2hex(n):
91cdf0e10cSrcweir
92*23436e16SPedro Giffuni    h = hex(n)[2:].upper()
93*23436e16SPedro Giffuni    return '\\u' + '0' * (4 - len(h)) + h
94cdf0e10cSrcweir
95cdf0e10cSrcweir
96cdf0e10cSrcweirdef escapestr(s):
97cdf0e10cSrcweir
98*23436e16SPedro Giffuni    buff = []
99*23436e16SPedro Giffuni    # QUESTION: escape leading or trailing spaces?
100*23436e16SPedro Giffuni    for c in s:
101*23436e16SPedro Giffuni        if c == '\\':
102*23436e16SPedro Giffuni            buff.append('\\\\')
103*23436e16SPedro Giffuni        elif c == '\t':
104*23436e16SPedro Giffuni            buff.append('\\t')
105*23436e16SPedro Giffuni        elif c == '\n':
106*23436e16SPedro Giffuni            buff.append('\\n')
107*23436e16SPedro Giffuni        elif c == '\r':
108*23436e16SPedro Giffuni            buff.append('\\r')
109*23436e16SPedro Giffuni        elif c == ' ':
110*23436e16SPedro Giffuni            buff.append('\\ ')
111*23436e16SPedro Giffuni        elif c == "'":
112*23436e16SPedro Giffuni            buff.append("\\'")
113*23436e16SPedro Giffuni        elif c == '"':
114*23436e16SPedro Giffuni            buff.append('\\"')
115*23436e16SPedro Giffuni        elif c == '#':
116*23436e16SPedro Giffuni            buff.append('\\#')
117*23436e16SPedro Giffuni        elif c == '!':
118*23436e16SPedro Giffuni            buff.append('\\!')
119*23436e16SPedro Giffuni        elif c == '=':
120*23436e16SPedro Giffuni            buff.append('\\=')
121*23436e16SPedro Giffuni        elif 32 <= ord(c) <= 126:
122*23436e16SPedro Giffuni            buff.append(c)
123*23436e16SPedro Giffuni        else:
124*23436e16SPedro Giffuni            buff.append(dec2hex(c))
125*23436e16SPedro Giffuni
126*23436e16SPedro Giffuni    return ''.join(buff)
127cdf0e10cSrcweir
128cdf0e10cSrcweir
129cdf0e10cSrcweir# TODO: add support for \uXXXX?
130cdf0e10cSrcweirdef unescapestr(line):
131cdf0e10cSrcweir
132*23436e16SPedro Giffuni    buff = []
133*23436e16SPedro Giffuni    escape = 0
134*23436e16SPedro Giffuni    for i in range(len(line)):
135*23436e16SPedro Giffuni        c = line[i]
136*23436e16SPedro Giffuni        if c == '\\':
137*23436e16SPedro Giffuni            if escape:
138*23436e16SPedro Giffuni                escape = 0
139*23436e16SPedro Giffuni                buff.append('\\')
140*23436e16SPedro Giffuni                continue
141*23436e16SPedro Giffuni            else:
142*23436e16SPedro Giffuni                # this is to deal with '\'
143*23436e16SPedro Giffuni                # acting as a line continuation
144*23436e16SPedro Giffuni                # character
145*23436e16SPedro Giffuni                if i == len(line) - 1:
146*23436e16SPedro Giffuni                    buff.append('\\')
147*23436e16SPedro Giffuni                    break
148*23436e16SPedro Giffuni                else:
149*23436e16SPedro Giffuni                    escape = 1
150*23436e16SPedro Giffuni                    continue
151*23436e16SPedro Giffuni        elif c == 'n':
152*23436e16SPedro Giffuni            if escape:
153*23436e16SPedro Giffuni                escape = 0
154*23436e16SPedro Giffuni                buff.append('\n')
155*23436e16SPedro Giffuni                continue
156*23436e16SPedro Giffuni        elif c == 'r':
157*23436e16SPedro Giffuni            if escape:
158*23436e16SPedro Giffuni                escape = 0
159*23436e16SPedro Giffuni                buff.append('\r')
160*23436e16SPedro Giffuni                continue
161*23436e16SPedro Giffuni        elif c == 't':
162*23436e16SPedro Giffuni            if escape:
163*23436e16SPedro Giffuni                escape = 0
164*23436e16SPedro Giffuni                buff.append('\t')
165*23436e16SPedro Giffuni                continue
166*23436e16SPedro Giffuni
167*23436e16SPedro Giffuni        buff.append(c)
168*23436e16SPedro Giffuni
169*23436e16SPedro Giffuni        # make sure escape doesn't stay one
170*23436e16SPedro Giffuni        # all expected escape sequences either break
171*23436e16SPedro Giffuni        # or continue, so this should be safe
172*23436e16SPedro Giffuni        if escape:
173*23436e16SPedro Giffuni            escape = 0
174*23436e16SPedro Giffuni
175*23436e16SPedro Giffuni    return ''.join(buff)
176cdf0e10cSrcweir
177cdf0e10cSrcweir
178cdf0e10cSrcweir
179cdf0e10cSrcweirclass Properties(dict):
180cdf0e10cSrcweir
181*23436e16SPedro Giffuni    def __init__(self, defaults={}):
182*23436e16SPedro Giffuni        dict.__init__(self)
183*23436e16SPedro Giffuni        for n,v in defaults.items():
184*23436e16SPedro Giffuni            self[n] = v
185*23436e16SPedro Giffuni
186*23436e16SPedro Giffuni    def __getittem__(self,key):
187*23436e16SPedro Giffuni        try:
188*23436e16SPedro Giffuni            return dict.__getittem__(self,key)
189*23436e16SPedro Giffuni        except KeyError:
190*23436e16SPedro Giffuni            return None
191*23436e16SPedro Giffuni
192*23436e16SPedro Giffuni    def read(self,filename):
193*23436e16SPedro Giffuni        """
194*23436e16SPedro Giffuni        Reads properties from a file (java Property class
195*23436e16SPedro Giffuni        reads from an input stream -- see load()).
196*23436e16SPedro Giffuni        """
197*23436e16SPedro Giffuni        f = None
198*23436e16SPedro Giffuni        try:
199*23436e16SPedro Giffuni            f = open(filename)
200*23436e16SPedro Giffuni            self.load(f)
201*23436e16SPedro Giffuni        finally:
202*23436e16SPedro Giffuni            if f:
203*23436e16SPedro Giffuni                f.close()
204*23436e16SPedro Giffuni
205*23436e16SPedro Giffuni    def load(self, buff):
206*23436e16SPedro Giffuni        """
207*23436e16SPedro Giffuni        Reads properties from a stream (StringIO, file, etc...)
208*23436e16SPedro Giffuni        """
209*23436e16SPedro Giffuni        props = readprops(buff)
210*23436e16SPedro Giffuni        #for n,v in props.iteritems():
211*23436e16SPedro Giffuni        for n in props.keys():
212*23436e16SPedro Giffuni            self[n] = props[n]
213cdf0e10cSrcweir
214cdf0e10cSrcweirdef readprops(buff):
215cdf0e10cSrcweir
216*23436e16SPedro Giffuni    name,value = None,''
217*23436e16SPedro Giffuni    props = {}
218*23436e16SPedro Giffuni    continued = 0
219*23436e16SPedro Giffuni
220*23436e16SPedro Giffuni    while 1:
221*23436e16SPedro Giffuni        line = buff.readline()
222*23436e16SPedro Giffuni        if not line:
223*23436e16SPedro Giffuni            break
224*23436e16SPedro Giffuni        line = line.strip()
225*23436e16SPedro Giffuni
226*23436e16SPedro Giffuni        # empty line
227*23436e16SPedro Giffuni        if not line:
228*23436e16SPedro Giffuni            continue
229*23436e16SPedro Giffuni
230*23436e16SPedro Giffuni        # comment
231*23436e16SPedro Giffuni        if line[0] in ('#','!'):
232*23436e16SPedro Giffuni            continue
233*23436e16SPedro Giffuni
234*23436e16SPedro Giffuni        # find name
235*23436e16SPedro Giffuni        i,escaped = 0,0
236*23436e16SPedro Giffuni        while i < len(line):
237*23436e16SPedro Giffuni            c = line[i]
238*23436e16SPedro Giffuni
239*23436e16SPedro Giffuni            if c == '\\':
240*23436e16SPedro Giffuni                if escaped:
241*23436e16SPedro Giffuni                    escaped = 0
242*23436e16SPedro Giffuni                else:
243*23436e16SPedro Giffuni                    escaped = 1
244*23436e16SPedro Giffuni                i += 1
245*23436e16SPedro Giffuni                continue
246*23436e16SPedro Giffuni
247*23436e16SPedro Giffuni            elif c in (' ', '\t', ':', '=') and not escaped:
248*23436e16SPedro Giffuni                name = unescapestr(line[:i])
249*23436e16SPedro Giffuni                break
250*23436e16SPedro Giffuni
251*23436e16SPedro Giffuni            # make sure escaped doesn't stay on
252*23436e16SPedro Giffuni            if escaped:
253*23436e16SPedro Giffuni                escaped = 0
254*23436e16SPedro Giffuni
255*23436e16SPedro Giffuni            i += 1
256*23436e16SPedro Giffuni
257*23436e16SPedro Giffuni        # no dlimiter was found, name is entire line, there is no value
258*23436e16SPedro Giffuni        if name == None:
259*23436e16SPedro Giffuni            name = unescapestr(line.lstrip())
260*23436e16SPedro Giffuni
261*23436e16SPedro Giffuni        # skip delimiter
262*23436e16SPedro Giffuni        while line[i:i+1] in ('\t', ' ', ':', '='):
263*23436e16SPedro Giffuni            i += 1
264*23436e16SPedro Giffuni
265*23436e16SPedro Giffuni        value = unescapestr(line[i:].strip())
266*23436e16SPedro Giffuni        while value[-1:] == '\\':
267*23436e16SPedro Giffuni            value = value[:-1]      # remove \
268*23436e16SPedro Giffuni            line = buff.readline()
269*23436e16SPedro Giffuni            if not line:
270*23436e16SPedro Giffuni                break
271*23436e16SPedro Giffuni            value += unescapestr(line.strip())
272*23436e16SPedro Giffuni
273*23436e16SPedro Giffuni        #print 'value:',value   ##
274*23436e16SPedro Giffuni        props[name] = value
275*23436e16SPedro Giffuni
276*23436e16SPedro Giffuni    return props
277cdf0e10cSrcweir#---end java.util.Properties copy---#
278cdf0e10cSrcweir
279cdf0e10cSrcweir#   Its a simple command line tool, which can merge different XML fragments
280cdf0e10cSrcweir#   together. Such fragments must exist as files on disk, will be moved into
281cdf0e10cSrcweir#   one file together on disk.
282*23436e16SPedro Giffuni#
283cdf0e10cSrcweir#  @author  Andreas Schluens
284*23436e16SPedro Giffuni#
285cdf0e10cSrcweirdef run(sCmdLine):
286cdf0e10cSrcweir    printCopyright()
287cdf0e10cSrcweir
288cdf0e10cSrcweir    aCfg = ConfigHelper(CFGFILE, sCmdLine)
289cdf0e10cSrcweir
290cdf0e10cSrcweir    # help requested?
291cdf0e10cSrcweir    if aCfg.isHelp():
292cdf0e10cSrcweir        printHelp()
293cdf0e10cSrcweir        sys.exit(-1)
294cdf0e10cSrcweir
295cdf0e10cSrcweir    #create new merge object and start operation
296cdf0e10cSrcweir    aMerger = Merger(aCfg)
297cdf0e10cSrcweir    aMerger.merge()
298cdf0e10cSrcweir
299cdf0e10cSrcweir    sys.exit(0)
300cdf0e10cSrcweir
301cdf0e10cSrcweir#prints out a copyright message on stdout.
302cdf0e10cSrcweirdef printCopyright():
303*23436e16SPedro Giffuni    print("FCFGMerge")
304*23436e16SPedro Giffuni    print("Copyright: 2003 by Red Hat, Inc., based on FCFGMerge.java` by Sun")
305*23436e16SPedro Giffuni    print("All Rights Reserved.")
306cdf0e10cSrcweir
307cdf0e10cSrcweir#prints out a help message on stdout.
308cdf0e10cSrcweirdef printHelp():
309*23436e16SPedro Giffuni    print("____________________________________________________________")
310*23436e16SPedro Giffuni    print("usage: FCFGMerge cfg=<file name>")
311*23436e16SPedro Giffuni    print("parameters:")
312*23436e16SPedro Giffuni    print("\tcfg=<file name>")
313*23436e16SPedro Giffuni    print("\t\tmust point to a system file, which contains")
314*23436e16SPedro Giffuni    print("\t\tall neccessary configuration data for the merge process.")
315*23436e16SPedro Giffuni    print("\tFurther cou can specify every parameter allowed in the")
316*23436e16SPedro Giffuni    print("\tconfig file as command line parameter too, to overwrite")
317*23436e16SPedro Giffuni    print("\tthe value from the file.")
318cdf0e10cSrcweir
319cdf0e10cSrcweirdef StringTokenizer(mstring, separators, isSepIncluded=0):
320cdf0e10cSrcweir#Return a list of tokens given a base string and a string of
321cdf0e10cSrcweir#separators, optionally including the separators if asked for"""
322cdf0e10cSrcweir    token=''
323cdf0e10cSrcweir    tokenList=[]
324cdf0e10cSrcweir    for c in mstring:
325cdf0e10cSrcweir        if c in separators:
326cdf0e10cSrcweir            if token != '':
327cdf0e10cSrcweir                tokenList.append(token)
328cdf0e10cSrcweir                token=''
329cdf0e10cSrcweir                if isSepIncluded:
330cdf0e10cSrcweir                    tokenList.append(c)
331cdf0e10cSrcweir        else:
332cdf0e10cSrcweir            token+=c
333cdf0e10cSrcweir    if token:
334cdf0e10cSrcweir        tokenList.append(token)
335cdf0e10cSrcweir    return tokenList
336cdf0e10cSrcweir
337cdf0e10cSrcweir# can be used to analyze command line parameters
338cdf0e10cSrcweir# and merge it together with might existing config
339cdf0e10cSrcweir# files. That provides the possibility to overwrite
340cdf0e10cSrcweir# config values via command line parameter.
341*23436e16SPedro Giffuni#
342cdf0e10cSrcweir# @author Andreas Schluens
343cdf0e10cSrcweirclass ConfigHelper:
344cdf0e10cSrcweir    def __init__(self, sPropFile, lCommandLineArgs):
345*23436e16SPedro Giffuni        self.m_bEmpty = 1
346cdf0e10cSrcweir        # first load prop file, so its values can be overwritten
347cdf0e10cSrcweir        # by command line args later
348cdf0e10cSrcweir        # Do it only, if a valid file name was given.
349cdf0e10cSrcweir        # But in case this file name is wrong, throw an exception.
350cdf0e10cSrcweir        # So the outside code can react!
351cdf0e10cSrcweir        if sPropFile != None and len(sPropFile) > 0:
352cdf0e10cSrcweir            self.props = Properties()
353cdf0e10cSrcweir            self.props.read(sPropFile)
354cdf0e10cSrcweir
355cdf0e10cSrcweir        count = 0
356cdf0e10cSrcweir        if lCommandLineArgs != None:
357cdf0e10cSrcweir            count = len(lCommandLineArgs)
358*23436e16SPedro Giffuni            print("Count is {c}".format(c=count))
359cdf0e10cSrcweir        self.m_bEmpty = (count < 1)
360cdf0e10cSrcweir
361*23436e16SPedro Giffuni        #print( lCommandLineArgs, "and len is", count )
362cdf0e10cSrcweir        for arg in range(count):
363cdf0e10cSrcweir            # is it a named-value argument?
364cdf0e10cSrcweir            # Note: We ignores double "=" signs! => search from left to right
365cdf0e10cSrcweir            pos = lCommandLineArgs[arg].find('=')
366cdf0e10cSrcweir            if pos != -1:
367cdf0e10cSrcweir                sArg   = lCommandLineArgs[arg][0:pos]
368cdf0e10cSrcweir                sValue = lCommandLineArgs[arg][pos+1:]
369cdf0e10cSrcweir                self.props[sArg] = sValue
370cdf0e10cSrcweir                continue
371cdf0e10cSrcweir
372cdf0e10cSrcweir            # is it a boolean argument?
373cdf0e10cSrcweir            # Note: Because "--" and "-" will be interpreted as the same
374cdf0e10cSrcweir            # we search from right to left!
375*23436e16SPedro Giffuni            pos = lCommandLineArgs[arg].rfind('-')
376cdf0e10cSrcweir            if pos == -1:
377cdf0e10cSrcweir                pos = lCommandLineArgs[arg].rfind('/')
378cdf0e10cSrcweir            if pos != -1:
379cdf0e10cSrcweir                sArg = lCommandLineArgs[arg][pos+1:]
380cdf0e10cSrcweir                self.props[sArg] = 1
381cdf0e10cSrcweir                continue
382*23436e16SPedro Giffuni
383*23436e16SPedro Giffuni            raise Exception("Invalid command line detected. The argument \""+lCommandLineArgs[arg]+"\" use an unsupported format.")
384cdf0e10cSrcweir
385cdf0e10cSrcweir#        for item in self.props:
386cdf0e10cSrcweir#            print item, '->', self.props[item]
387cdf0e10cSrcweir
388cdf0e10cSrcweir    def isHelp(self):
389cdf0e10cSrcweir        return (
390*23436e16SPedro Giffuni                ("help" in self.props) or
391*23436e16SPedro Giffuni                ("?" in self.props   ) or
392*23436e16SPedro Giffuni                ("h" in self.props   )
393cdf0e10cSrcweir               )
394cdf0e10cSrcweir
395cdf0e10cSrcweir    def getValue(self, sProp):
396*23436e16SPedro Giffuni        if not sProp in self.props:
397cdf0e10cSrcweir            raise Exception("The requested config value \""+sProp+"\" "\
398cdf0e10cSrcweir                "does not exists!");
399cdf0e10cSrcweir        return self.props[sProp];
400cdf0e10cSrcweir
401cdf0e10cSrcweir    def getValueWithDefault(self, sProp, default):
402*23436e16SPedro Giffuni        if not sProp in self.props:
403*23436e16SPedro Giffuni            return default;
404cdf0e10cSrcweir        return self.props[sProp];
405cdf0e10cSrcweir
406cdf0e10cSrcweir    def getStringList(self, sProp, sDelimiter, bTrim, bDecode):
407*23436e16SPedro Giffuni        if not sProp in self.props:
408cdf0e10cSrcweir            raise Exception("The requested config value \""+sProp+"\" does "\
409cdf0e10cSrcweir                "not exists!");
410cdf0e10cSrcweir        sValue = self.props[sProp]
411cdf0e10cSrcweir
412cdf0e10cSrcweir        lValue = []
413cdf0e10cSrcweir        lTokens = StringTokenizer(sValue, sDelimiter)
414cdf0e10cSrcweir        for sToken in lTokens:
415cdf0e10cSrcweir            if bTrim:
416*23436e16SPedro Giffuni                sToken = sToken.strip()
417*23436e16SPedro Giffuni
418cdf0e10cSrcweir            # remove ""
419cdf0e10cSrcweir            if ((bDecode) and (sToken.find("\"") == 0) and \
420cdf0e10cSrcweir                (sToken.rfind("\"") == len(sToken)-1)):
421cdf0e10cSrcweir                sToken = sToken[1, len(sToken)-1]
422cdf0e10cSrcweir            lValue.append(sToken)
423cdf0e10cSrcweir
424cdf0e10cSrcweir        return lValue
425cdf0e10cSrcweir
426cdf0e10cSrcweirdef generateHeader(sVersion, sEncoding, sPath, sPackage, bLanguagePack):
427cdf0e10cSrcweir    sHeader = "<?xml version=\""
428cdf0e10cSrcweir    sHeader += sVersion
429cdf0e10cSrcweir    sHeader += "\" encoding=\""
430cdf0e10cSrcweir    sHeader += sEncoding
431cdf0e10cSrcweir    sHeader += "\"?>\n"
432cdf0e10cSrcweir
433cdf0e10cSrcweir    if bLanguagePack:
434cdf0e10cSrcweir        sHeader += "<oor:component-data oor:package=\""
435cdf0e10cSrcweir        sHeader += sPath
436cdf0e10cSrcweir        sHeader += "\" oor:name=\""
437cdf0e10cSrcweir        sHeader += sPackage
438cdf0e10cSrcweir        sHeader += "\" xmlns:install=\"http://openoffice.org/2004/installation\""
439cdf0e10cSrcweir        sHeader += " xmlns:oor=\"http://openoffice.org/2001/registry\""
440cdf0e10cSrcweir        sHeader += " xmlns:xs=\"http://www.w3.org/2001/XMLSchema\""
441cdf0e10cSrcweir        sHeader += " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n"
442cdf0e10cSrcweir    else:
443cdf0e10cSrcweir        sHeader += "<oor:component-data xmlns:oor=\"http://openoffice.org/2001/registry\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" oor:package=\""
444cdf0e10cSrcweir        sHeader += sPath
445cdf0e10cSrcweir        sHeader += "\" oor:name=\""
446cdf0e10cSrcweir        sHeader += sPackage
447cdf0e10cSrcweir        sHeader += "\">\n"
448cdf0e10cSrcweir    return sHeader
449cdf0e10cSrcweir
450cdf0e10cSrcweirdef generateFooter():
451cdf0e10cSrcweir    return "</oor:component-data>\n"
452cdf0e10cSrcweir
453cdf0e10cSrcweir# can merge different xml fragments together.
454*23436e16SPedro Giffuni#
455cdf0e10cSrcweir#   @author Caolan McNamara converted from the original java by Andreas Schluens
456*23436e16SPedro Giffuni#
457cdf0e10cSrcweirclass Merger:
458cdf0e10cSrcweir    def __init__(self, aCfg):
459cdf0e10cSrcweir        self.m_aCfg = aCfg
460cdf0e10cSrcweir
461cdf0e10cSrcweir        self.m_aFragmentsDir = self.m_aCfg.getValue(PROP_FRAGMENTSDIR)
462cdf0e10cSrcweir
463cdf0e10cSrcweir        sDelimiter = self.m_aCfg.getValue(PROP_DELIMITER)
464cdf0e10cSrcweir        bTrim = self.m_aCfg.getValue(PROP_TRIM)
465cdf0e10cSrcweir        bDecode = self.m_aCfg.getValue(PROP_DECODE)
466cdf0e10cSrcweir
467cdf0e10cSrcweir        try:
468cdf0e10cSrcweir            aFcfg = ConfigHelper(self.m_aCfg.getValue(PROP_TCFG), None)
469cdf0e10cSrcweir            self.m_lTypes = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode)
470cdf0e10cSrcweir        except:
471cdf0e10cSrcweir            self.m_lTypes = []
472cdf0e10cSrcweir
473cdf0e10cSrcweir        try:
474cdf0e10cSrcweir            aFcfg = ConfigHelper(self.m_aCfg.getValue(PROP_FCFG), None)
475cdf0e10cSrcweir            self.m_lFilters = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode)
476cdf0e10cSrcweir        except:
477*23436e16SPedro Giffuni            print( "Filters are empty" )
478cdf0e10cSrcweir            self.m_lFilters = []
479cdf0e10cSrcweir
480cdf0e10cSrcweir        try:
481cdf0e10cSrcweir            aFcfg = ConfigHelper(self.m_aCfg.getValue(PROP_LCFG), None)
482cdf0e10cSrcweir            self.m_lLoaders = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode)
483cdf0e10cSrcweir        except:
484cdf0e10cSrcweir            self.m_lLoaders = []
485cdf0e10cSrcweir
486cdf0e10cSrcweir        try:
487cdf0e10cSrcweir            aFcfg = ConfigHelper(self.m_aCfg.getValue(PROP_CCFG), None)
488cdf0e10cSrcweir            self.m_lHandlers = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode)
489cdf0e10cSrcweir        except:
490cdf0e10cSrcweir            self.m_lHandlers = []
491cdf0e10cSrcweir
492cdf0e10cSrcweir    def merge(self):
493cdf0e10cSrcweir        sPackage = self.m_aCfg.getValue(PROP_PKG)
494cdf0e10cSrcweir
495*23436e16SPedro Giffuni        print("create package \""+sPackage+"\" ...")
496*23436e16SPedro Giffuni        print("generate package header ... ")
497cdf0e10cSrcweir
498cdf0e10cSrcweir        sBuffer = generateHeader(\
499cdf0e10cSrcweir                self.m_aCfg.getValue(PROP_XMLVERSION ),\
500cdf0e10cSrcweir                self.m_aCfg.getValue(PROP_XMLENCODING),\
501cdf0e10cSrcweir                self.m_aCfg.getValue(PROP_XMLPATH    ),\
502cdf0e10cSrcweir                self.m_aCfg.getValue(PROP_XMLPACKAGE ),\
503cdf0e10cSrcweir                self.m_aCfg.getValueWithDefault(PROP_LANGUAGEPACK, False))
504cdf0e10cSrcweir
505cdf0e10cSrcweir        # counts all transfered fragments
506cdf0e10cSrcweir        # Can be used later to decide, if a generated package file
507cdf0e10cSrcweir        # contains "nothing"!
508cdf0e10cSrcweir        nItemCount = 0
509cdf0e10cSrcweir
510cdf0e10cSrcweir        for i in range(4):
511cdf0e10cSrcweir            sSetName = None
512cdf0e10cSrcweir            sSubDir = None
513cdf0e10cSrcweir            lFragments = None
514cdf0e10cSrcweir
515cdf0e10cSrcweir            try:
516cdf0e10cSrcweir                if i == 0: #types
517*23436e16SPedro Giffuni                    print("generate set for types ... ")
518cdf0e10cSrcweir                    sSetName = self.m_aCfg.getValue(PROP_SETNAME_TYPES)
519cdf0e10cSrcweir                    sSubDir = self.m_aCfg.getValue(PROP_SUBDIR_TYPES )
520cdf0e10cSrcweir                    lFragments = self.m_lTypes
521cdf0e10cSrcweir                elif i == 1: # filters
522*23436e16SPedro Giffuni                    print("generate set for filter ... ")
523cdf0e10cSrcweir                    sSetName = self.m_aCfg.getValue(PROP_SETNAME_FILTERS)
524cdf0e10cSrcweir                    sSubDir = self.m_aCfg.getValue(PROP_SUBDIR_FILTERS )
525cdf0e10cSrcweir                    lFragments = self.m_lFilters
526cdf0e10cSrcweir                elif i == 2: # loaders
527*23436e16SPedro Giffuni                    print("generate set for frame loader ... ")
528cdf0e10cSrcweir                    sSetName = self.m_aCfg.getValue(PROP_SETNAME_LOADERS)
529cdf0e10cSrcweir                    sSubDir = self.m_aCfg.getValue(PROP_SUBDIR_LOADERS )
530cdf0e10cSrcweir                    lFragments = self.m_lLoaders
531cdf0e10cSrcweir                elif i == 3: # handlers
532*23436e16SPedro Giffuni                    print("generate set for content handler ... ")
533cdf0e10cSrcweir                    sSetName = self.m_aCfg.getValue(PROP_SETNAME_HANDLERS)
534cdf0e10cSrcweir                    sSubDir = self.m_aCfg.getValue(PROP_SUBDIR_HANDLERS )
535cdf0e10cSrcweir                    lFragments = self.m_lHandlers
536cdf0e10cSrcweir            except:
537cdf0e10cSrcweir                continue
538cdf0e10cSrcweir
539*23436e16SPedro Giffuni            print("Length of Fragments: {f} Set Name {setname} Subdir {subdir}".
540*23436e16SPedro Giffuni             format(f=len(lFragments),setname=sSetName,subdir=sSubDir))
541*23436e16SPedro Giffuni            #sys.stdin.readline()
542cdf0e10cSrcweir            nItemCount = nItemCount + len(lFragments)
543cdf0e10cSrcweir
544cdf0e10cSrcweir            sBuffer = sBuffer + self.getFragments(\
545cdf0e10cSrcweir                os.path.join(self.m_aFragmentsDir, sSubDir), \
546cdf0e10cSrcweir                sSetName, lFragments, 1)
547cdf0e10cSrcweir
548*23436e16SPedro Giffuni        print("generate package footer ... ")
549cdf0e10cSrcweir        sBuffer = sBuffer + generateFooter()
550cdf0e10cSrcweir
551cdf0e10cSrcweir        # Attention!
552*23436e16SPedro Giffuni        # If the package seems to be empty, it make no sense to generate a
553*23436e16SPedro Giffuni        # corresponding xml file. We should suppress writing of this file on
554*23436e16SPedro Giffuni        # disk completely ...
555cdf0e10cSrcweir        if nItemCount < 1:
556*23436e16SPedro Giffuni            print("Package is empty and will not result into an xml file on disk!? Please check configuration file.")
557cdf0e10cSrcweir            return
558*23436e16SPedro Giffuni        print("package contains "+str(nItemCount)+" items")
559cdf0e10cSrcweir
560*23436e16SPedro Giffuni        aPackage = open(sPackage, mode="w")
561*23436e16SPedro Giffuni        print("write temp package {pkg}".format(pkg=sPackage))
562cdf0e10cSrcweir        aPackage.write(sBuffer)
563cdf0e10cSrcweir
564cdf0e10cSrcweir    def getFragments(self, aDir, sSetName, lFragments, nPrettyTabs):
565*23436e16SPedro Giffuni        sBuffer = ''
566cdf0e10cSrcweir        sExtXcu = self.m_aCfg.getValue(PROP_EXTENSION_XCU);
567cdf0e10cSrcweir
568cdf0e10cSrcweir        if len(lFragments) < 1:
569cdf0e10cSrcweir            return sBuffer
570*23436e16SPedro Giffuni
571cdf0e10cSrcweir        for tabs in range(nPrettyTabs):
572cdf0e10cSrcweir            sBuffer = sBuffer + "\t"
573cdf0e10cSrcweir        sBuffer = sBuffer + "<node oor:name=\""+sSetName+"\">\n"
574cdf0e10cSrcweir        nPrettyTabs = nPrettyTabs + 1
575cdf0e10cSrcweir
576cdf0e10cSrcweir        for sFragment in lFragments:
577cdf0e10cSrcweir            sFragPath = os.path.join(aDir, sFragment+"."+sExtXcu)
578cdf0e10cSrcweir            try:
579cdf0e10cSrcweir                aFragmentFile = open(sFragPath)
580cdf0e10cSrcweir            except:
581cdf0e10cSrcweir                # handle simple files only and check for existence!
582cdf0e10cSrcweir                raise Exception("fragment \""+sFragPath+"\" does not exists.")
583cdf0e10cSrcweir
584*23436e16SPedro Giffuni            print("merge fragment \""+sFragPath+"\" ...")
585cdf0e10cSrcweir            sBuffer = sBuffer + aFragmentFile.read()
586*23436e16SPedro Giffuni
587cdf0e10cSrcweir            sBuffer = sBuffer + "\n"
588cdf0e10cSrcweir
589cdf0e10cSrcweir        nPrettyTabs = nPrettyTabs - 1
590cdf0e10cSrcweir        for tabs in range(nPrettyTabs):
591cdf0e10cSrcweir            sBuffer = sBuffer + "\t"
592cdf0e10cSrcweir        sBuffer = sBuffer + "</node>\n"
593cdf0e10cSrcweir        return sBuffer
594cdf0e10cSrcweir
595cdf0e10cSrcweirrun(sys.argv)
596