package progen;

import java.util.Calendar;
import java.util.GregorianCalendar;

import progen.context.MissingContextFileException;
import progen.context.ProGenContext;
import progen.kernel.error.Error;
import progen.kernel.grammar.UndefinedFunctionSetException;
import progen.output.HistoricalData;
import progen.output.outputers.OutputStore;
import progen.roles.ExecutionRole;
import progen.roles.ProGenFactory;

/**
 * Clase principal del programa. Desde el método main, se inicializan todos los
 * Singleton existentes y se instancia el rol concreto de ejecución de la
 * aplicación.
 * 
 * @author jirsis
 * @since 2.0
 */
public class ProGen {
  
  private String[] args;

  public ProGen(String args[]){
    this.args = args;
  }
  
  public void runProGen(){
    ProGenContext.makeInstance(args[0]);
    Error.makeInstance();
    ProGenFactory progenFactory = ProGenFactory.makeInstance();
    ExecutionRole progen = progenFactory.makeExecutionRole();
    HistoricalData.makeInstance();
    OutputStore.makeInstance();
    System.out.println(ProGenContext.getMandatoryProperty("progen.welcome"));
    progen.start();
  }
  
  /**
   * Método principal de la aplicación en la que se inicializan los elementos
   * estáticos de la aplicación y se ejecuta el rol que corresponde según esté
   * definido en el fichero de configuración pasado como parámetro.
   * 
   * @param args
   *          Fichero <code>master-file</code> en el que se define la
   *          configuración de la ejecución de ProGen
   * @see progen.roles
   */
  public static void main(String[] args) {
    Calendar begin = GregorianCalendar.getInstance();
    if (args.length != 1) {
      System.err.println(Error.get(0));
      throw new ProGenException(Error.get(0));
    } else {
      try {
        new ProGen(args).runProGen();
      } catch (MissingContextFileException e) {
        System.err.println(Error.get(2) + "(" + e.getMessage() + ")");
      } catch (UndefinedFunctionSetException e) {
        System.err.println(e.getMessage());
      } catch (NumberFormatException e) {
        e.printStackTrace();
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        Calendar end = GregorianCalendar.getInstance();
        System.out.println("\nEXECUTION TIME: " + (end.getTimeInMillis() - begin.getTimeInMillis()) + " ms.");
      }
    }
  }

}

@@ -10,16 +10,41 @@
 rogen;%0A%0A
+import java.util.Arrays;%0A
 import j
@@ -717,22 +717,30 @@
 Gen(
+final 
 String
+ %5B%5D
  args
-%5B%5D
 )
+ 
 %7B%0A  
@@ -753,20 +753,48 @@
 .args = 
-args
+Arrays.copyOf(args, args.length)
 ;%0A  %7D%0A  
@@ -803,16 +803,22 @@
  public 
+final 
 void run
@@ -825,16 +825,17 @@
 ProGen()
+ 
 %7B%0A    Pr
@@ -1626,16 +1626,22 @@
 id main(
+final 
 String%5B%5D

Refactor de la clase principal