def handle_klocwork_config_file(errors_node, rules):
    enabled_rules = []
    for error in errors_node.getElementsByTagName("error"):
        for rule in rules:
            if error.getAttribute("enabled") == "true" and error.getAttribute("id") == rule.key:
                new_rule = Rule(rule.key, rule.name, rule.configKey, rule.description, rule.priority)
                if error.getAttribute("severity") != None and len(error.getAttribute("severity").strip()) != 0:
                    print error.getAttribute("id")
                    new_rule.priority = KlocworkExtractor.severities[error.getAttribute("severity")]
                enabled_rules.append(new_rule)

    return enabled_rules
 def add_rule(self, rules, line):
     pattern = re.compile('^\\s*(?:reportErr|reportError)\\(\\s*[\\w-]+?\\s*,\\s*(.+?)\\s*,\\s*\\\"(.+?)\\\"\\s*,\\s*.+?\\s*\\).*$')
     search = pattern.search(line)
     if search != None:
         values = search.groups()
         rule = Rule()
         rule.key = values[1]
         if rule.key != 'uninitVar': #rules present twice
             rule.configKey = values[1]
             rule.category = 'Reliability'
             rule.description = values[1]
             rule.name = values[1]
             splittedSeverity = values[0].split('::')
             rule.priority = 'MAJOR'
             if len(splittedSeverity) >= 2:
                 severity = splittedSeverity[1]
                 if ' ' in severity:
                     cleaned_severity = severity.split()
                     severity = cleaned_severity[0]
                 rule.priority = self.severities[severity.strip()]
             rules.append(rule)
 def extract_rules(self, file_path):
     fd = open(file_path, 'r')
     std_description = False
     rl_description = False
     rule = Rule(None, None, None, None, None, None)
     splittedPath = file_path.split(os.sep)
     rule.key = splittedPath[-1].split('.')[0]
     rule.configKey = rule.key
     rule.category = "Reliability"
     rule.name =''
     for line in fd.readlines():
         if std_description:
             if not len(line)==0 and not line.startswith('---') and not line.startswith('Definition:'):
                 rule.name += line
         
         #In .rl files, most of the time, the first line after the ".TITLE Description" Markup is enough to understand the violation...
         elif rl_description:
             rule.name += line
             #...But in some .rl files, we have to copy more lines
             if not line.endswith(':') and not line.startswith('-'):
                 rl_description=False
                 
         if line.startswith('.NAME '):
             rule.description = line[len('.NAME ')-1:]
         
         elif line.startswith('.SEVERITY '):
             severity = line[len('.SEVERITY ')-1:].strip()
             if severity in self.user_severities.keys():
                 rule.priority = self.user_severities[severity]
             elif severity in self.severities.keys():
                 rule.priority = self.severities[severity]
             elif re.match("\d+", severity):
                 rule.priority = self.calculate_sonar_severity(severity)
             else:
                 rule.priority = 'INFO'
         
         elif line.startswith('.DESCRIPTION'):
             std_description = True
             
         elif line.startswith('.TITLE Description'):
             rl_description = True
             
     if std_description:
         #Trying to get characters until ". " is met
         if rule.name.find('. ') != -1:
             rule.name = rule.name[:rule.name.find('. ')]
         
         #Trying to get characters until "." is met
         else:
             rule.name = rule.name[:rule.name.find('.')]
         
         #Last problem : sometimes, the above verification is not enough strengthful. So we have to check that there isn't more than the description in the string
         if rule.name.find(".SEVERITY") != -1:
             rule.name = rule.name[:rule.name.find(".SEVERITY")]
     
     rule.name = rule.name.strip()
     
     if (len(rule.name)>= name_length):
         rule.name = rule.name[:name_length-1]
     
     fd.close()
     
     return rule