configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py
changeset 3 e7e0ae78773e
parent 0 2e8eeb919028
child 4 0951727b8815
--- a/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py	Fri Mar 12 08:30:17 2010 +0200
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py	Tue Aug 10 14:29:28 2010 +0300
@@ -22,14 +22,27 @@
 
 import re
 import os
-import sys
 import logging
 import types
+import pkg_resources
 
 import subprocess
-import __init__
+
+from cone.public import plugin,utils
 
-from cone.public import exceptions,plugin,utils,api, settings
+def get_folder_set(folder):
+    """
+    Get a set object containing all files of given folder
+    @param folder: the folder to create set for
+    @return: a python set 
+    """
+    fileset = set()
+    for (root, _, filenames) in os.walk(folder):
+        for filename in filenames:
+            fname = utils.relpath(os.path.join(root,filename), folder)
+            fileset.add(fname)
+    
+    return fileset
 
 class CommandImpl(plugin.ImplBase):
     """
@@ -47,13 +60,16 @@
         self.desc = ""
         self.logger = logging.getLogger('cone.commandml(%s)' % self.ref)
         self.reader = reader
+        for element in self.reader.elements:
+            element.set_logger(self.logger)
         
 
     def generate(self, context=None):
         """
         Generate the given implementation.
         """
-        self.create_output()        
+        
+        self.create_output(context)
         return 
     
     def generate_layers(self,layers):
@@ -64,17 +80,26 @@
         self.create_output(layers)
         return 
     
-    def create_output(self, layers=None):
+    def create_output(self, context, layers=None):
         """
         Function to generate output files.
         """
-        
+        self.context = context
         tmpDict = self.__create_helper_variables()
-        
+        # Get the contents of output folder before the generation
+        outset_before = get_folder_set(context.output)
         for element in self.reader.elements:
             #Element can be either command or condition.
             element.set_logger(self.logger)
-            element.execute(tmpDict)        
+            element.execute(context, tmpDict)        
+        
+        # Get the contents of output folder after the generation 
+        # and get the new files created by the set difference.
+        # NOTE! this does not recognize files outside output folder!
+        outset_after = get_folder_set(context.output)
+        outset = outset_after - outset_before
+        for outfile in outset:
+            context.add_file(outfile, implementation=self)
         return
 
     def __create_helper_variables(self):
@@ -82,8 +107,8 @@
         Internal function to create dictionary containing most often used ConE "environment" variables.
         """        
         tmp = {}
-        tmp["%CONE_OUT%"] = self.output
-        tmp["%CONE_OUT_ABSOLUTE%"] = os.path.abspath(self.output)
+        tmp["%CONE_OUT%"] = os.path.join(self.context.output, self.output).rstrip('\\')
+        tmp["%CONE_OUT_ABSOLUTE%"] = os.path.abspath(os.path.join(self.context.output, self.output)).rstrip('\\')
         return tmp    
     
     def has_ref(self, refs):
@@ -100,6 +125,8 @@
     Parses a single commandml file
     """ 
     NAMESPACE = 'http://www.s60.com/xml/commandml/1'
+    NAMESPACE_ID = 'commandml'
+    ROOT_ELEMENT_NAME = 'commandml'
     FILE_EXTENSIONS = ['commandml']
     
     def __init__(self):
@@ -122,7 +149,11 @@
         if reader.tags:
             impl.set_tags(reader.tags)
         return impl
-            
+    
+    @classmethod
+    def get_schema_data(cls):
+        return pkg_resources.resource_string('commandplugin', 'xsd/commandml.xsd')
+    
     def set_default_view(self, dview):
         """
         Function to set default view that is needed when solving out ConfML reference information
@@ -260,17 +291,17 @@
             cmd.set_logger(logger)        
 
     def add_command(self, command):
-        self.command.append(command)
+        self.commands.append(command)
 
-    def execute(self, replaceDict=None):
-        if self.__solve_condition(self.condition):
+    def execute(self, context, replaceDict=None):
+        if self._solve_condition(self.condition, context):
             #Condition is true -> running command
             for command in self.commands:                
-                command.execute(replaceDict)
+                command.execute(context, replaceDict)
         else:
             self.logger.info("Ignoring %s because it is evaluated as False." % self.condition)
 
-    def __solve_condition(self, condition_str):
+    def _solve_condition(self, condition_str, context):
         """
         Internal function to handle condition
         """
@@ -278,7 +309,7 @@
             #Expanding ConfML information
             modstr = utils.expand_delimited_tokens(
                 condition_str,
-                lambda ref, index: repr(self.dview.get_feature(ref).get_value()))
+                lambda ref, index: repr(context.configuration.get_default_view().get_feature(ref).get_value()))
             return eval(modstr)
         else:
             #Empty condition is true always.
@@ -323,8 +354,7 @@
         self.cwd = cwd
     
     def set_all_envs(self, envs):
-        if envs:
-            self.envs = eval(envs)
+        self.envs = envs
     def set_default_view(self, dview):
         self.dview = dview
         
@@ -401,9 +431,17 @@
         for filter in self.filters:
             filter.report(self.logger)
 
-    def execute(self, replaceDict=None):
+    def execute(self, context, replaceDict=None):
+        self.dview = context.configuration.get_default_view()
+        
         self.solve_refs()
         
+        try:
+            if self.envs:   env_dict = eval(self.envs)
+            else:           env_dict = None
+        except Exception, e:
+            raise RuntimeError("Failed to evaluate env dictionary: %s: %s" % (e.__class__.__name__, e))
+        
         exit_code = 0
         try:
             try:
@@ -415,8 +453,8 @@
                 self.logger.info("Running command: \"%s\"" % command_str)
                 self.logger.info("with args: shell=%s envs=%s cwd=%s bufsize=%s stdin=%s stdout=%s stderr=%s" \
                                  % (self.shell, self.envs, cwd, self.bufsize, \
-                                    self.get_pipe("stdin", 'r'),self.get_pipe("stdout"), self.get_pipe("stderr")))                    
-                pid = subprocess.Popen(command_str, shell=self.shell, env=self.envs, cwd=cwd,\
+                                    self.get_pipe("stdin", 'r'),self.get_pipe("stdout"), self.get_pipe("stderr")))
+                pid = subprocess.Popen(command_str, shell=self.shell, env=env_dict, cwd=cwd,\
                                           bufsize=self.bufsize, stdin = self.get_pipe("stdin", 'r'),\
                                           stdout = self.get_pipe("stdout"), stderr = self.get_pipe("stderr"))
                 #Waiting for process to complete
@@ -452,6 +490,7 @@
         self.shell = self.__solve_ref(self.shell)
         self.bufsize = self.__solve_ref(self.bufsize)
         self.cwd = self.__solve_ref(self.cwd)
+        self.envs = self.__solve_ref(self.envs)
         for argument in self.arguments:
             self.arguments[self.arguments.index(argument)] = self.__solve_ref(argument) 
         for pipe in self.pipes.keys():