diff --git a/edexOsgi/build.edex/esb/data/utility/common_static/base/python/JUtil.py b/edexOsgi/build.edex/esb/data/utility/common_static/base/python/JUtil.py index c1177cb337..41d47f410b 100644 --- a/edexOsgi/build.edex/esb/data/utility/common_static/base/python/JUtil.py +++ b/edexOsgi/build.edex/esb/data/utility/common_static/base/python/JUtil.py @@ -1,22 +1,22 @@ -## +# # # This software was developed and / or modified by Raytheon Company, # pursuant to Contract DG133W-05-CQ-1067 with the US Government. -# +# # U.S. EXPORT CONTROLLED TECHNICAL DATA # This software product contains export-restricted data whose # export/transfer/disclosure is restricted by U.S. law. Dissemination # to non-U.S. persons whether in the United States or abroad requires # an export license or other authorization. -# +# # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 -# +# # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. -## +# # from java.lang import Integer, Float, Long, Boolean, String @@ -26,18 +26,18 @@ from collections import OrderedDict # # Provides convenience methods for Java-Python bridging -# # -# +# +# # SOFTWARE HISTORY -# +# # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 05/01/08 njensen Initial Creation. # 03/12/13 1759 dgilling Extend Java List types handled # by javaObjToPyVal(). -# -# +# +# # @@ -64,7 +64,7 @@ def javaStringMapToPyDict(javaMap): fval = str(val) if fval.find('[') > -1: exec "fval = " + fval - else: + else: try: fval = float(fval) except: @@ -86,18 +86,21 @@ def javaMapToPyDict(javaMap, customConverter=None): return pyDict def pyDictToJavaMap(pyDict): + if pyDict is None : + return None + if isinstance(pyDict, OrderedDict): jmap = LinkedHashMap() else: jmap = HashMap() - - for key in pyDict: + + for key in pyDict: jmap.put(pyValToJavaObj(key), pyValToJavaObj(pyDict[key])) return jmap def pyValToJavaObj(val): - retObj = val - valtype = type(val) + retObj = val + valtype = type(val) if valtype is int: retObj = Integer(val) elif valtype is float: @@ -120,12 +123,12 @@ def pyValToJavaObj(val): elif issubclass(valtype, JavaWrapperClass): retObj = val.toJavaObj() return retObj - + def javaObjToPyVal(obj, customConverter=None): retVal = None if obj is None: return retVal - + objtype = obj.jclassname if objtype == "java.lang.Integer": retVal = obj.intValue() @@ -150,7 +153,7 @@ def javaObjToPyVal(obj, customConverter=None): retVal = javaMapToPyDict(obj, customConverter) elif customConverter is not None: retVal = customConverter(obj) - + if retVal is None: retVal = str(obj) return retVal @@ -158,5 +161,4 @@ def javaObjToPyVal(obj, customConverter=None): class JavaWrapperClass(object): def toJavaObj(self): raise NotImplementedError, "Subclasses must override this method." - - \ No newline at end of file + diff --git a/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/PathManager.py b/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/PathManager.py index 4b9fef5388..c837793394 100644 --- a/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/PathManager.py +++ b/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/PathManager.py @@ -1,35 +1,35 @@ # # # This software was developed and / or modified by Raytheon Company, # pursuant to Contract DG133W-05-CQ-1067 with the US Government. -# +# # U.S. EXPORT CONTROLLED TECHNICAL DATA # This software product contains export-restricted data whose # export/transfer/disclosure is restricted by U.S. law. Dissemination # to non-U.S. persons whether in the United States or abroad requires # an export license or other authorization. -# +# # Contractor Name: Raytheon Company # Contractor Address: 6825 Pine Street, Suite 340 # Mail Stop B8 # Omaha, NE 68106 # 402.291.0100 -# +# # See the AWIPS II Master Rights File ("Master Rights File.pdf") for # further licensing information. # # # # Python should use this interface to get to the localization files. -# # -# +# +# # SOFTWARE HISTORY -# +# # Date Ticket# Engineer Description # ------------ ---------- ----------- -------------------------- # 03/18/13 mnash Initial Creation. -# -# +# +# # import os, os.path @@ -43,14 +43,14 @@ from LockingFile import File from com.raytheon.uf.common.localization import PathManagerFactory from com.raytheon.uf.common.localization import LocalizationContext as JavaLocalizationContext from com.raytheon.uf.common.localization import LocalizationContext_LocalizationType as LocalizationType, LocalizationContext_LocalizationLevel as LocalizationLevel -from java.io import File as JavaFile +from java.io import File as JavaFile from java.lang import String class PathManager(IPathManager.IPathManager): - + def __init__(self): self.jpathManager = PathManagerFactory.getPathManager() - + def getLocalizationFile(self, name, loctype=None, loclevel=None, locname=None): ''' @param context: the localization context for which to get the file @@ -68,7 +68,7 @@ class PathManager(IPathManager.IPathManager): lFile = self.jpathManager.getStaticLocalizationFile(name) if lFile is not None: return LocalizationFile(lFile) - + def getTieredLocalizationFile(self, loctype, name): ''' @param loctype: The localization type to look in @@ -77,13 +77,15 @@ class PathManager(IPathManager.IPathManager): @summary: Returns the localization levels available for the file given ''' jtype = self._convertType(loctype) - jMap = JUtil.javaMapToPyDict(self.jpathManager.getTieredLocalizationFile(jtype, name)) + jMap = self.jpathManager.getTieredLocalizationFile(jtype, name) + iterator = jMap.entrySet().iterator() vals = dict() - for level in jMap: - jlevel = self._convertLevel(level) - vals[jlevel.name()] = LocalizationFile(jMap.get(level)) + while iterator.hasNext() : + nextValue = iterator.next() + # the key of the entry set is a localization level, the value is a localization file + vals[nextValue.getKey().name()] = LocalizationFile(nextValue.getValue()) return vals - + def listFiles(self, name, extensions, recursive, filesOnly, loctype=None, loclevel=None, locname=None): ''' @param name: the name and path of the file @@ -102,8 +104,8 @@ class PathManager(IPathManager.IPathManager): extArr = jarray(extensionSize, String) for i in range(extensionSize): extArr[i] = String(extensions[i]) - - if contexts is not None : + + if contexts is not None : jfiles = self.jpathManager.listFiles(contexts, name, extArr, recursive, filesOnly) else : jfiles = self.jpathManager.listStaticFiles(name, extArr, recursive, filesOnly) @@ -112,7 +114,7 @@ class PathManager(IPathManager.IPathManager): for file in jfiles : files.append(LocalizationFile(file)) return files - + def getAvailableLevels(self): ''' @return: the levels available to the caller @@ -122,7 +124,7 @@ class PathManager(IPathManager.IPathManager): levels = list() for level in jLevels : levels.append(level.name()) - return levels + return levels # converts a type of a list of types to the java counterparts def _convertType(self, loctype): @@ -135,7 +137,7 @@ class PathManager(IPathManager.IPathManager): for i in range(loctype): jtype[i] = self._convertType(loctype[i]) return jtype - + # converts a level or a list of levels to the java counterparts def _convertLevel(self, loclevel): if loclevel is not None : @@ -147,7 +149,7 @@ class PathManager(IPathManager.IPathManager): for i in range(loclevel): jlevel[i] = self._convertLevel(loclevel[i]) return jlevel - + def _getContext(self, loctype, loclevel, locname=None): jtype = self._convertType(loctype) jlevel = self._convertLevel(loclevel) @@ -158,7 +160,7 @@ class PathManager(IPathManager.IPathManager): if jlevel is not None : jlevel = [jlevel] return self._contextForList(jtype, jlevel, locname) - + def _contextForList(self, loctypes, loclevels, locname=None): # gets the contexts in list form, for ease of use, we always use a list of contexts # for methods that can take both @@ -167,7 +169,7 @@ class PathManager(IPathManager.IPathManager): if locname is None and loclevels is None: return None elif loclevels is not None : - contexts[i] = self.jpathManager.getContext(loctypes[i], loclevels[i]) + contexts[i] = self.jpathManager.getContext(loctypes[i], loclevels[i]) if locname is not None : contexts[i].setContextName(locname) return contexts diff --git a/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/PythonOverrider.py b/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/PythonOverrider.py new file mode 100644 index 0000000000..d000e0a75b --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/PythonOverrider.py @@ -0,0 +1,118 @@ +# # +# This software was developed and / or modified by Raytheon Company, +# pursuant to Contract DG133W-05-CQ-1067 with the US Government. +# +# U.S. EXPORT CONTROLLED TECHNICAL DATA +# This software product contains export-restricted data whose +# export/transfer/disclosure is restricted by U.S. law. Dissemination +# to non-U.S. persons whether in the United States or abroad requires +# an export license or other authorization. +# +# Contractor Name: Raytheon Company +# Contractor Address: 6825 Pine Street, Suite 340 +# Mail Stop B8 +# Omaha, NE 68106 +# 402.291.0100 +# +# See the AWIPS II Master Rights File ("Master Rights File.pdf") for +# further licensing information. +# # + +# +# Overrides python modules with each other and returns a new module +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 03/12/13 mnash Initial Creation. +# +# +# + +import os +import imp +import inspect +from PathManager import PathManager +import LocalizationUtil + +def override(name, loctype): + """ + Takes a name (filename and localization path) and the localization type and finds the + file and overrides it, and returns the module + + Args: + name : the name and path of the file in localization + loctype : a string representation of the localization type + + Returns: + a module that has all the correct methods after being overridden + """ + pathManager = PathManager() + tieredFiles = pathManager.getTieredLocalizationFile(loctype, name) + levels = pathManager.getAvailableLevels() + lfiles = list() + for level in levels : + if tieredFiles.has_key(level) : + lfiles.append(tieredFiles[level].getPath()) + themodule = _internalOverride(lfiles) + return themodule + +def _internalOverride(files): + """ + Takes the files and overrides them + + Args: + files : the files that are to be overridden + + Returns: + a new module that contains all the necessary elements + """ + themodule = imp.new_module('tmpmodule') + # modules = list of all the modules + for module in files : + # load each module, temporarily + tmpmodule = LocalizationUtil.loadModule(module) + the_module = _combineMembers(tmpmodule, themodule) + return themodule + +def _combineMembers(tocombine, finalmodule): + """ + Loops over the necessary parts of each module and decides how to combine them + + Args: + tocombine : the module to combine in + finalmodule : the module that is being combined into + + Returns: + a new python module that was created above + """ + # get the functions + members = inspect.getmembers(tocombine, inspect.isfunction) + for member in members : + finalmodule.__setattr__(member[0], member[1]) + + # get the classes + classes = inspect.getmembers(tocombine, inspect.isclass) + for clazz in classes: + finalmodule.__setattr__(clazz[0], clazz[1]) + + for attr in dir(tocombine): + if attr.startswith('__') == False or attr.startswith('_') == False: + if hasattr(finalmodule, attr): + if isinstance(attr, dict): + # simply update dicts with the new keys + getattr(finalmodule, attr).update(getattr(tocombine, attr)) + if isinstance(attr, list): + listattr = getattr(tocombine, attr) + for i in listattr: + # override each element in the list if it exists + getattr(finalmodule, attr)[i] = listattr[i] + else : + finalmodule.__setattr__(attr, getattr(tocombine, attr)) + else : + if inspect.ismethod(attr) == False and inspect.isbuiltin(attr) == False and inspect.isclass(attr) == False: + finalmodule.__setattr__(attr, getattr(tocombine, attr)) + return finalmodule diff --git a/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/XMLOverrider.py b/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/XMLOverrider.py new file mode 100644 index 0000000000..cc325c9012 --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.localization.python/utility/common_static/base/python/XMLOverrider.py @@ -0,0 +1,84 @@ +# # +# This software was developed and / or modified by Raytheon Company, +# pursuant to Contract DG133W-05-CQ-1067 with the US Government. +# +# U.S. EXPORT CONTROLLED TECHNICAL DATA +# This software product contains export-restricted data whose +# export/transfer/disclosure is restricted by U.S. law. Dissemination +# to non-U.S. persons whether in the United States or abroad requires +# an export license or other authorization. +# +# Contractor Name: Raytheon Company +# Contractor Address: 6825 Pine Street, Suite 340 +# Mail Stop B8 +# Omaha, NE 68106 +# 402.291.0100 +# +# See the AWIPS II Master Rights File ("Master Rights File.pdf") for +# further licensing information. +# # + +# +# Overrides xml files with each other and returns a dict +# +# +# +# SOFTWARE HISTORY +# +# Date Ticket# Engineer Description +# ------------ ---------- ----------- -------------------------- +# 03/12/13 mnash Initial Creation. +# +# +# + +from com.raytheon.uf.common.localization.overrides import XMLOverrider as JavaXMLOverrider +from com.raytheon.uf.common.localization import LocalizationContext_LocalizationType as LocalizationType + +def override(name, loctype): + """ + Takes a name (filename and localization path) and the localization type and finds the + file and overrides it using the Java overrider, and then takes that value and returns + a dictionary + + Args: + name : the name and path of the file in localization + loctype : a string representation of the localization type + + Returns: + a dictionary representing the XML + """ + # call into the Java XMLOverrider class which will do the combining for us! + configurationNode = JavaXMLOverrider.override(LocalizationType.valueOf(loctype), name) + finalDict = _internalOverride(configurationNode) + return finalDict + +def _internalOverride(configurationNode): + """ + Takes a configuration node from java and returns a dictionary of dictionaries corresponding to an XML file + + Args: + configurationNode : the ConfigurationNode from Java + + Returns: + a dictionary of dictionaries (key is the xml tag, value is its children or the value) + """ + theDict = dict() + for child in configurationNode.getChildren() : + # if there are children, then we can't just make this a value, so it needs to be a dict + if child.getChildrenCount() > 0 : + d = dict() + theDict[child.getName()] = _internalOverride(child, d) + else : + # if this key is already in the dictionary, add to the list if there is one, or make a new one + if theDict.has_key(child.getName()) : + if isinstance(theDict.__getitem__(child.getName()), list) : + theDict.__getitem__(child.getName()).append(child.getValue()) + else : + l = list() + l.append(theDict.__getitem__(child.getName())) + l.append(str(child.getValue())) + theDict[child.getName()] = l + else : + theDict[child.getName()] = str(child.getValue()) + return theDict diff --git a/edexOsgi/com.raytheon.uf.common.localization/META-INF/MANIFEST.MF b/edexOsgi/com.raytheon.uf.common.localization/META-INF/MANIFEST.MF index da89ea6d69..c5bf67671d 100644 --- a/edexOsgi/com.raytheon.uf.common.localization/META-INF/MANIFEST.MF +++ b/edexOsgi/com.raytheon.uf.common.localization/META-INF/MANIFEST.MF @@ -8,11 +8,13 @@ Require-Bundle: org.apache.commons.lang, com.raytheon.uf.common.serialization, com.raytheon.uf.common.serialization.comm;bundle-version="1.0.0", com.raytheon.uf.common.auth, - com.raytheon.uf.common.status;bundle-version="1.12.1174" + com.raytheon.uf.common.status;bundle-version="1.12.1174", + org.apache.commons.configuration;bundle-version="1.6.0" Eclipse-BuddyPolicy: registered, ext, global Eclipse-RegisterBuddy: com.raytheon.uf.common.serialization Export-Package: com.raytheon.uf.common.localization, com.raytheon.uf.common.localization.exception, com.raytheon.uf.common.localization.msgs, + com.raytheon.uf.common.localization.overrides, com.raytheon.uf.common.localization.stream Bundle-RequiredExecutionEnvironment: JavaSE-1.6 diff --git a/edexOsgi/com.raytheon.uf.common.localization/src/com/raytheon/uf/common/localization/overrides/XMLOverrider.java b/edexOsgi/com.raytheon.uf.common.localization/src/com/raytheon/uf/common/localization/overrides/XMLOverrider.java new file mode 100644 index 0000000000..5123a82a0a --- /dev/null +++ b/edexOsgi/com.raytheon.uf.common.localization/src/com/raytheon/uf/common/localization/overrides/XMLOverrider.java @@ -0,0 +1,141 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.uf.common.localization.overrides; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.configuration.CombinedConfiguration; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.XMLConfiguration; +import org.apache.commons.configuration.tree.NodeCombiner; +import org.apache.commons.configuration.tree.OverrideCombiner; + +import com.raytheon.uf.common.localization.IPathManager; +import com.raytheon.uf.common.localization.LocalizationContext.LocalizationLevel; +import com.raytheon.uf.common.localization.LocalizationContext.LocalizationType; +import com.raytheon.uf.common.localization.LocalizationFile; +import com.raytheon.uf.common.localization.PathManagerFactory; +import com.raytheon.uf.common.status.IUFStatusHandler; +import com.raytheon.uf.common.status.UFStatus; +import com.raytheon.uf.common.status.UFStatus.Priority; + +/** + * Override a set of XML files incrementally. + * + *
+ * + * SOFTWARE HISTORY + * + * Date Ticket# Engineer Description + * ------------ ---------- ----------- -------------------------- + * Mar 14, 2013 mnash Initial creation + * + *+ * + * @author mnash + * @version 1.0 + */ + +public class XMLOverrider { + private static final IUFStatusHandler handler = UFStatus + .getHandler(XMLOverrider.class); + + /** + * Takes the information needed to get a file from localization using an + * {@link IPathManager}, and then combines them and returns. + * + * @param type + * @param name + * @return + */ + public static CombinedConfiguration override(LocalizationType type, + String name) { + IPathManager manager = PathManagerFactory.getPathManager(); + Map