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