/*PLEASE DO NOT EDIT THIS CODE*/
/*This code was generated using the UMPLE ${last.version} modeling language!*/


import java.util.*;
import java.util.regex.Pattern;

// line 1 "test.ump"
public class ClassGenerator
{

  //------------------------
  // STATIC VARIABLES
  //------------------------

  public static final String NL = System.getProperty("line.separator");
  public static final String TEXT_0 = NL + "  ";
  public static final String TEXT_1 = NL + "/*******************************************************************************" + NL + "* Copyright (c ) This is some copyright." + NL + "*******************************************************************************/" + NL + "  ";
  public static final String TEXT_2 = " " + NL + "  ";
  public static final String TEXT_3 = NL + "    package ";
  public static final String TEXT_4 = ";" + NL + "    ";
  public static final String TEXT_5 = "";
  public static final String TEXT_6 = NL + "    import ";
  public static final String TEXT_7 = ";";
  public static final String TEXT_8 = NL + "    class ";
  public static final String TEXT_9 = " {" + NL + "        ";
  public static final String TEXT_10 = NL + "        //TODO" + NL + "  ";
  public static final String TEXT_11 = "      " + NL + "    }" + NL + "  ";
  public static final String TEXT_12 = " " + NL + "  ";

  //------------------------
  // MEMBER VARIABLES
  //------------------------

  //------------------------
  // CONSTRUCTOR
  //------------------------

  public ClassGenerator()
  {}

  //------------------------
  // INTERFACE
  //------------------------

  public void delete()
  {}

  // line 36 "test.ump"
   public static  void main(String [] ags){
    Thread.currentThread().setUncaughtExceptionHandler(new UmpleExceptionHandler());
    Thread.setDefaultUncaughtExceptionHandler(new UmpleExceptionHandler());
    ClassGenerator classGenerator= new ClassGenerator();
       String path= "org.eclipse.someplugin.root";
        List<String> imports= Arrays.asList(new String[]{"java.util.Arrays", "java.util.List"});
       
      String className= "someClassName";
    
      System.out.println(classGenerator.emitResults(path, imports, className));
  }

  private String _createSpacesString(int numSpaces){
      StringBuilder spaces =  new StringBuilder();
      for(int i=0; i <numSpaces; i++) {
          spaces.append(" ");
      }
      return spaces.toString();
    
  }

  public StringBuilder _emitResults(Integer numSpaces, StringBuilder sb, String path, List<String> listOfImports, String className){
    String spaces="";
    StringBuilder newCode = new StringBuilder();
    StringBuilder realSb = sb;
    if(numSpaces > 0) {
        realSb = newCode;
        spaces = _createSpacesString(numSpaces);
        newCode.append(spaces);
    }
    
    realSb.append(TEXT_0);
    realSb.append(TEXT_1);
    realSb.append(TEXT_2);
    realSb.append(TEXT_3);
    realSb.append(path);
    realSb.append(TEXT_4);
    realSb.append(TEXT_5);
     for(String _import:listOfImports){
    realSb.append(TEXT_6);
    realSb.append(_import);
    realSb.append(TEXT_7);
     
          }
    realSb.append(TEXT_8);
    realSb.append(className);
    realSb.append(TEXT_9);
    realSb.append(TEXT_10);
    realSb.append(TEXT_11);
    realSb.append(TEXT_12);

    if(numSpaces > 0) {
        newCode.replace(0, newCode.length(), Pattern.compile(NL).matcher(newCode).replaceAll(NL + spaces));
        sb.append(newCode);
    }
    return sb; 
  }

  public String emitResults(String path, List<String> listOfImports, String className){
        StringBuilder sb = new StringBuilder();
    return this._emitResults(0,sb,path,listOfImports,className).toString(); 
  }


  public String toString()
  {
    return super.toString() + "["+ "]";
  }
  public static class UmpleExceptionHandler implements Thread.UncaughtExceptionHandler
  {
    public void uncaughtException(Thread t, Throwable e)
    {
      translate(e);
      if(e.getCause()!=null)
      {
        translate(e.getCause());
      }
      e.printStackTrace();
    }
    public void translate(Throwable e)
    {
      java.util.List<StackTraceElement> result = new java.util.ArrayList<StackTraceElement>();
      StackTraceElement[] elements = e.getStackTrace();
      try
      {
        for(StackTraceElement element:elements)
        {
          String className = element.getClassName();
          String methodName = element.getMethodName();
          boolean methodFound = false;
          int index = className.lastIndexOf('.')+1;
          try {
            java.lang.reflect.Method query = this.getClass().getMethod(className.substring(index)+"_"+methodName,new Class[]{});
            UmpleSourceData sourceInformation = (UmpleSourceData)query.invoke(this,new Object[]{});
            for(int i=0;i<sourceInformation.size();++i)
            {
              int distanceFromStart = element.getLineNumber()-sourceInformation.getJavaLine(i)-(("main".equals(methodName))?2:0);
              if(distanceFromStart>=0&&distanceFromStart<=sourceInformation.getLength(i))
              {
                result.add(new StackTraceElement(element.getClassName(),element.getMethodName(),sourceInformation.getFileName(i),sourceInformation.getUmpleLine(i)+distanceFromStart));
                methodFound = true;
                break;
              }
            }
          }
          catch (Exception e2){}
          if(!methodFound)
          {
            result.add(element);
          }
        }
      }
      catch (Exception e1)
      {
        e1.printStackTrace();
      }
      e.setStackTrace(result.toArray(new StackTraceElement[0]));
    }
  //The following methods Map Java lines back to their original Umple file / line    
    public UmpleSourceData ClassGenerator__createSpacesString(){ return new UmpleSourceData().setFileNames("test.ump").setUmpleLines(32).setJavaLines(62).setLengths(2);}
    public UmpleSourceData ClassGenerator_main(){ return new UmpleSourceData().setFileNames("test.ump").setUmpleLines(35).setJavaLines(49).setLengths(3);}
    public UmpleSourceData ClassGenerator__emitResults(){ return new UmpleSourceData().setFileNames("test.ump").setUmpleLines(32).setJavaLines(71).setLengths(2);}
    public UmpleSourceData ClassGenerator_emitResults(){ return new UmpleSourceData().setFileNames("test.ump").setUmpleLines(32).setJavaLines(108).setLengths(2);}

  }
  public static class UmpleSourceData
  {
    String[] umpleFileNames;
    Integer[] umpleLines;
    Integer[] umpleJavaLines;
    Integer[] umpleLengths;
    
    public UmpleSourceData(){
    }
    public String getFileName(int i){
      return umpleFileNames[i];
    }
    public Integer getUmpleLine(int i){
      return umpleLines[i];
    }
    public Integer getJavaLine(int i){
      return umpleJavaLines[i];
    }
    public Integer getLength(int i){
      return umpleLengths[i];
    }
    public UmpleSourceData setFileNames(String... filenames){
      umpleFileNames = filenames;
      return this;
    }
    public UmpleSourceData setUmpleLines(Integer... umplelines){
      umpleLines = umplelines;
      return this;
    }
    public UmpleSourceData setJavaLines(Integer... javalines){
      umpleJavaLines = javalines;
      return this;
    }
    public UmpleSourceData setLengths(Integer... lengths){
      umpleLengths = lengths;
      return this;
    }
    public int size(){
      return umpleFileNames.length;
    }
  } 
}