public void parse(File pConfigFile) 
  throws ExParser {    
   
    try {
      BufferedReader lReader = new BufferedReader(new FileReader(pConfigFile));
      
      String lFilesInstruction = null;
      Map<String, String> lInstructionMap = new HashMap<String, String>();
      int lLineNumber = 0;
      
      //Read lines until a Files: instruction is found (at which point, create a new ConfigFileEntry with all the previously read lines)
      String lLine;
      while((lLine = lReader.readLine()) != null){
        lLineNumber++;
        
        lLine = lLine.trim();        
        if("".equals(lLine) || lLine.startsWith("#")){
          //skip empty lines and comment lines
          continue;
        }
        
        //Validate the line
        if(lLine.indexOf(":") == -1){
          throw new ExParser("Invalid line " + lLineNumber + ", must be in format Instruction: Value");
        }
        
        String lInstruction = lLine.substring(0, lLine.indexOf(":"));
        String lValue = lLine.substring(lLine.indexOf(":") + 1).trim();
        if(lValue.length() == 0){
          throw new ExParser("Invalid line " + lLineNumber + ", value must be specified");
        }
        
        if(CONFIG_INSTRUCTION_FILES.equals(lInstruction)){
          if(!lInstructionMap.isEmpty()){
            //If this isn't the first Files: line we've hit
            createEntry(lFilesInstruction, lInstructionMap);          
            lInstructionMap.clear();
          }
          lFilesInstruction = lValue;
        }
        else {
          lInstructionMap.put(lInstruction, lValue);
        }
        
      }
      
      //Create an entry with the data from the final read (flush the buffer)
      createEntry(lFilesInstruction, lInstructionMap);
    }
    catch (FileNotFoundException e) {
      throw new ExInternal("Failed to read config file", e);
    }
    catch (IOException e) {
      throw new ExInternal("Failed to read config file", e);
    }    
    
  }