123436e16SPedro 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
1223436e16SPedro 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
4723436e16SPedro 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
5423436e16SPedro 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
9223436e16SPedro Giffuni    h = hex(n)[2:].upper()
9323436e16SPedro Giffuni    return '\\u' + '0' * (4 - len(h)) + h
94cdf0e10cSrcweir
95cdf0e10cSrcweir
96cdf0e10cSrcweirdef escapestr(s):
97cdf0e10cSrcweir
9823436e16SPedro Giffuni    buff = []
9923436e16SPedro Giffuni    # QUESTION: escape leading or trailing spaces?
10023436e16SPedro Giffuni    for c in s:
10123436e16SPedro Giffuni        if c == '\\':
10223436e16SPedro Giffuni            buff.append('\\\\')
10323436e16SPedro Giffuni        elif c == '\t':
10423436e16SPedro Giffuni            buff.append('\\t')
10523436e16SPedro Giffuni        elif c == '\n':
10623436e16SPedro Giffuni            buff.append('\\n')
10723436e16SPedro Giffuni        elif c == '\r':
10823436e16SPedro Giffuni            buff.append('\\r')
10923436e16SPedro Giffuni        elif c == ' ':
11023436e16SPedro Giffuni            buff.append('\\ ')
11123436e16SPedro Giffuni        elif c == "'":
11223436e16SPedro Giffuni            buff.append("\\'")
11323436e16SPedro Giffuni        elif c == '"':
11423436e16SPedro Giffuni            buff.append('\\"')
11523436e16SPedro Giffuni        elif c == '#':
11623436e16SPedro Giffuni            buff.append('\\#')
11723436e16SPedro Giffuni        elif c == '!':
11823436e16SPedro Giffuni            buff.append('\\!')
11923436e16SPedro Giffuni        elif c == '=':
12023436e16SPedro Giffuni            buff.append('\\=')
12123436e16SPedro Giffuni        elif 32 <= ord(c) <= 126:
12223436e16SPedro Giffuni            buff.append(c)
12323436e16SPedro Giffuni        else:
12423436e16SPedro Giffuni            buff.append(dec2hex(c))
12523436e16SPedro Giffuni
12623436e16SPedro Giffuni    return ''.join(buff)
127cdf0e10cSrcweir
128cdf0e10cSrcweir
129cdf0e10cSrcweir# TODO: add support for \uXXXX?
130cdf0e10cSrcweirdef unescapestr(line):
131cdf0e10cSrcweir
13223436e16SPedro Giffuni    buff = []
13323436e16SPedro Giffuni    escape = 0
13423436e16SPedro Giffuni    for i in range(len(line)):
13523436e16SPedro Giffuni        c = line[i]
13623436e16SPedro Giffuni        if c == '\\':
13723436e16SPedro Giffuni            if escape:
13823436e16SPedro Giffuni                escape = 0
13923436e16SPedro Giffuni                buff.append('\\')
14023436e16SPedro Giffuni                continue
14123436e16SPedro Giffuni            else:
14223436e16SPedro Giffuni                # this is to deal with '\'
14323436e16SPedro Giffuni                # acting as a line continuation
14423436e16SPedro Giffuni                # character
14523436e16SPedro Giffuni                if i == len(line) - 1:
14623436e16SPedro Giffuni                    buff.append('\\')
14723436e16SPedro Giffuni                    break
14823436e16SPedro Giffuni                else:
14923436e16SPedro Giffuni                    escape = 1
15023436e16SPedro Giffuni                    continue
15123436e16SPedro Giffuni        elif c == 'n':
15223436e16SPedro Giffuni            if escape:
15323436e16SPedro Giffuni                escape = 0
15423436e16SPedro Giffuni                buff.append('\n')
15523436e16SPedro Giffuni                continue
15623436e16SPedro Giffuni        elif c == 'r':
15723436e16SPedro Giffuni            if escape:
15823436e16SPedro Giffuni                escape = 0
15923436e16SPedro Giffuni                buff.append('\r')
16023436e16SPedro Giffuni                continue
16123436e16SPedro Giffuni        elif c == 't':
16223436e16SPedro Giffuni            if escape:
16323436e16SPedro Giffuni                escape = 0
16423436e16SPedro Giffuni                buff.append('\t')
16523436e16SPedro Giffuni                continue
16623436e16SPedro Giffuni
16723436e16SPedro Giffuni        buff.append(c)
16823436e16SPedro Giffuni
16923436e16SPedro Giffuni        # make sure escape doesn't stay one
17023436e16SPedro Giffuni        # all expected escape sequences either break
17123436e16SPedro Giffuni        # or continue, so this should be safe
17223436e16SPedro Giffuni        if escape:
17323436e16SPedro Giffuni            escape = 0
17423436e16SPedro Giffuni
17523436e16SPedro Giffuni    return ''.join(buff)
176cdf0e10cSrcweir
177cdf0e10cSrcweir
178cdf0e10cSrcweir
179cdf0e10cSrcweirclass Properties(dict):
180cdf0e10cSrcweir
18123436e16SPedro Giffuni    def __init__(self, defaults={}):
18223436e16SPedro Giffuni        dict.__init__(self)
18323436e16SPedro Giffuni        for n,v in defaults.items():
18423436e16SPedro Giffuni            self[n] = v
18523436e16SPedro Giffuni
18623436e16SPedro Giffuni    def __getittem__(self,key):
18723436e16SPedro Giffuni        try:
18823436e16SPedro Giffuni            return dict.__getittem__(self,key)
18923436e16SPedro Giffuni        except KeyError:
19023436e16SPedro Giffuni            return None
19123436e16SPedro Giffuni
19223436e16SPedro Giffuni    def read(self,filename):
19323436e16SPedro Giffuni        """
19423436e16SPedro Giffuni        Reads properties from a file (java Property class
19523436e16SPedro Giffuni        reads from an input stream -- see load()).
19623436e16SPedro Giffuni        """
19723436e16SPedro Giffuni        f = None
19823436e16SPedro Giffuni        try:
19923436e16SPedro Giffuni            f = open(filename)
20023436e16SPedro Giffuni            self.load(f)
20123436e16SPedro Giffuni        finally:
20223436e16SPedro Giffuni            if f:
20323436e16SPedro Giffuni                f.close()
20423436e16SPedro Giffuni
20523436e16SPedro Giffuni    def load(self, buff):
20623436e16SPedro Giffuni        """
20723436e16SPedro Giffuni        Reads properties from a stream (StringIO, file, etc...)
20823436e16SPedro Giffuni        """
20923436e16SPedro Giffuni        props = readprops(buff)
21023436e16SPedro Giffuni        #for n,v in props.iteritems():
21123436e16SPedro Giffuni        for n in props.keys():
21223436e16SPedro Giffuni            self[n] = props[n]
213cdf0e10cSrcweir
214cdf0e10cSrcweirdef readprops(buff):
215cdf0e10cSrcweir
21623436e16SPedro Giffuni    name,value = None,''
21723436e16SPedro Giffuni    props = {}
21823436e16SPedro Giffuni    continued = 0
21923436e16SPedro Giffuni
22023436e16SPedro Giffuni    while 1:
22123436e16SPedro Giffuni        line = buff.readline()
22223436e16SPedro Giffuni        if not line:
22323436e16SPedro Giffuni            break
22423436e16SPedro Giffuni        line = line.strip()
22523436e16SPedro Giffuni
22623436e16SPedro Giffuni        # empty line
22723436e16SPedro Giffuni        if not line:
22823436e16SPedro Giffuni            continue
22923436e16SPedro Giffuni
23023436e16SPedro Giffuni        # comment
23123436e16SPedro Giffuni        if line[0] in ('#','!'):
23223436e16SPedro Giffuni            continue
23323436e16SPedro Giffuni
23423436e16SPedro Giffuni        # find name
23523436e16SPedro Giffuni        i,escaped = 0,0
23623436e16SPedro Giffuni        while i < len(line):
23723436e16SPedro Giffuni            c = line[i]
23823436e16SPedro Giffuni
23923436e16SPedro Giffuni            if c == '\\':
24023436e16SPedro Giffuni                if escaped:
24123436e16SPedro Giffuni                    escaped = 0
24223436e16SPedro Giffuni                else:
24323436e16SPedro Giffuni                    escaped = 1
24423436e16SPedro Giffuni                i += 1
24523436e16SPedro Giffuni                continue
24623436e16SPedro Giffuni
24723436e16SPedro Giffuni            elif c in (' ', '\t', ':', '=') and not escaped:
24823436e16SPedro Giffuni                name = unescapestr(line[:i])
24923436e16SPedro Giffuni                break
25023436e16SPedro Giffuni
25123436e16SPedro Giffuni            # make sure escaped doesn't stay on
25223436e16SPedro Giffuni            if escaped:
25323436e16SPedro Giffuni                escaped = 0
25423436e16SPedro Giffuni
25523436e16SPedro Giffuni            i += 1
25623436e16SPedro Giffuni
25723436e16SPedro Giffuni        # no dlimiter was found, name is entire line, there is no value
25823436e16SPedro Giffuni        if name == None:
25923436e16SPedro Giffuni            name = unescapestr(line.lstrip())
26023436e16SPedro Giffuni
26123436e16SPedro Giffuni        # skip delimiter
26223436e16SPedro Giffuni        while line[i:i+1] in ('\t', ' ', ':', '='):
26323436e16SPedro Giffuni            i += 1
26423436e16SPedro Giffuni
26523436e16SPedro Giffuni        value = unescapestr(line[i:].strip())
26623436e16SPedro Giffuni        while value[-1:] == '\\':
26723436e16SPedro Giffuni            value = value[:-1]      # remove \
26823436e16SPedro Giffuni            line = buff.readline()
26923436e16SPedro Giffuni            if not line:
27023436e16SPedro Giffuni                break
27123436e16SPedro Giffuni            value += unescapestr(line.strip())
27223436e16SPedro Giffuni
27323436e16SPedro Giffuni        #print 'value:',value   ##
27423436e16SPedro Giffuni        props[name] = value
27523436e16SPedro Giffuni
27623436e16SPedro 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.
28223436e16SPedro Giffuni#
283cdf0e10cSrcweir#  @author  Andreas Schluens
28423436e16SPedro 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():
30323436e16SPedro Giffuni    print("FCFGMerge")
30423436e16SPedro Giffuni    print("Copyright: 2003 by Red Hat, Inc., based on FCFGMerge.java` by Sun")
30523436e16SPedro Giffuni    print("All Rights Reserved.")
306cdf0e10cSrcweir
307cdf0e10cSrcweir#prints out a help message on stdout.
308cdf0e10cSrcweirdef printHelp():
30923436e16SPedro Giffuni    print("____________________________________________________________")
31023436e16SPedro Giffuni    print("usage: FCFGMerge cfg=<file name>")
31123436e16SPedro Giffuni    print("parameters:")
31223436e16SPedro Giffuni    print("\tcfg=<file name>")
31323436e16SPedro Giffuni    print("\t\tmust point to a system file, which contains")
314*07a3d7f1SPedro Giffuni    print("\t\tall necessary configuration data for the merge process.")
31523436e16SPedro Giffuni    print("\tFurther cou can specify every parameter allowed in the")
31623436e16SPedro Giffuni    print("\tconfig file as command line parameter too, to overwrite")
31723436e16SPedro 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.
34123436e16SPedro Giffuni#
342cdf0e10cSrcweir# @author Andreas Schluens
343cdf0e10cSrcweirclass ConfigHelper:
344cdf0e10cSrcweir    def __init__(self, sPropFile, lCommandLineArgs):
34523436e16SPedro 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)
35823436e16SPedro Giffuni            print("Count is {c}".format(c=count))
359cdf0e10cSrcweir        self.m_bEmpty = (count < 1)
360cdf0e10cSrcweir
36123436e16SPedro 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!
37523436e16SPedro 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
38223436e16SPedro Giffuni
38323436e16SPedro 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 (
39023436e16SPedro Giffuni                ("help" in self.props) or
39123436e16SPedro Giffuni                ("?" in self.props   ) or
39223436e16SPedro Giffuni                ("h" in self.props   )
393cdf0e10cSrcweir               )
394cdf0e10cSrcweir
395cdf0e10cSrcweir    def getValue(self, sProp):
39623436e16SPedro 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):
40223436e16SPedro Giffuni        if not sProp in self.props:
40323436e16SPedro Giffuni            return default;
404cdf0e10cSrcweir        return self.props[sProp];
405cdf0e10cSrcweir
406cdf0e10cSrcweir    def getStringList(self, sProp, sDelimiter, bTrim, bDecode):
40723436e16SPedro 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:
41623436e16SPedro Giffuni                sToken = sToken.strip()
41723436e16SPedro 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.
45423436e16SPedro Giffuni#
455cdf0e10cSrcweir#   @author Caolan McNamara converted from the original java by Andreas Schluens
45623436e16SPedro 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:
47723436e16SPedro 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
49523436e16SPedro Giffuni        print("create package \""+sPackage+"\" ...")
49623436e16SPedro 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
505*07a3d7f1SPedro Giffuni        # counts all transferred 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
51723436e16SPedro 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
52223436e16SPedro 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
52723436e16SPedro 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
53223436e16SPedro 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
53923436e16SPedro Giffuni            print("Length of Fragments: {f} Set Name {setname} Subdir {subdir}".
54023436e16SPedro Giffuni             format(f=len(lFragments),setname=sSetName,subdir=sSubDir))
54123436e16SPedro 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
54823436e16SPedro Giffuni        print("generate package footer ... ")
549cdf0e10cSrcweir        sBuffer = sBuffer + generateFooter()
550cdf0e10cSrcweir
551cdf0e10cSrcweir        # Attention!
55223436e16SPedro Giffuni        # If the package seems to be empty, it make no sense to generate a
55323436e16SPedro Giffuni        # corresponding xml file. We should suppress writing of this file on
55423436e16SPedro Giffuni        # disk completely ...
555cdf0e10cSrcweir        if nItemCount < 1:
55623436e16SPedro Giffuni            print("Package is empty and will not result into an xml file on disk!? Please check configuration file.")
557cdf0e10cSrcweir            return
55823436e16SPedro Giffuni        print("package contains "+str(nItemCount)+" items")
559cdf0e10cSrcweir
56023436e16SPedro Giffuni        aPackage = open(sPackage, mode="w")
56123436e16SPedro Giffuni        print("write temp package {pkg}".format(pkg=sPackage))
562cdf0e10cSrcweir        aPackage.write(sBuffer)
563cdf0e10cSrcweir
564cdf0e10cSrcweir    def getFragments(self, aDir, sSetName, lFragments, nPrettyTabs):
56523436e16SPedro Giffuni        sBuffer = ''
566cdf0e10cSrcweir        sExtXcu = self.m_aCfg.getValue(PROP_EXTENSION_XCU);
567cdf0e10cSrcweir
568cdf0e10cSrcweir        if len(lFragments) < 1:
569cdf0e10cSrcweir            return sBuffer
57023436e16SPedro 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
58423436e16SPedro Giffuni            print("merge fragment \""+sFragPath+"\" ...")
585cdf0e10cSrcweir            sBuffer = sBuffer + aFragmentFile.read()
58623436e16SPedro 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