code: package org.gridkit.jvmtool.stacktrace;
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.StringReader;
  import java.util.ArrayList;
  import java.util.List;
  
  public class TraceLoader {
  
      public static StackFrame[] loadFrames(String res) {
          return loadFrames(res);
      }
  
      public static StackFrame[] loadFrames(String res, int multiplier) {
          try {
              List<StackFrame> frames = new ArrayList<StackFrame>();
              for(int i = 0; i != multiplier; ++i) {
                  InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(res);
                  BufferedReader br = new BufferedReader(new InputStreamReader(is));
                  while(true) {
                      String line = br.readLine();
                      if (line == null) {
                          break;
                      }
                      if (line.trim().length() > 0)
                      frames.add(StackFrame.parseFrame(line.trim()));
                  }
              }
              return frames.toArray(new StackFrame[frames.size()]);
          } catch (IOException e) {
              throw new RuntimeException(e);
          }
      };
  
      public static StackFrame[] parseFrames(String trace) {
          try {
              List<StackFrame> frames = new ArrayList<StackFrame>();
              BufferedReader br = new BufferedReader(new StringReader(trace));
              while(true) {
                  String line = br.readLine();
                  if (line == null) {
                      break;
                  }
                  if (line.trim().length() > 0)
                      frames.add(StackFrame.parseFrame(line.trim()));
              }
              return frames.toArray(new StackFrame[frames.size()]);
          } catch (IOException e) {
              throw new RuntimeException(e);
          }
      };
  }
  