public static void main(String[] args) throws java.io.IOException {
    if (args.length < 1) {
      System.err.println("Usage java TestHarness <input file> <R1> <R2> ...");
      System.exit(-1);
    }

    // get the name of the input file
    String inputFile = args[0];

    // now get the resources
    int numOfResources = args.length - 1;

    // the initial number of resources
    int[] initialResources = new int[numOfResources];

    // the resources involved in the transaction
    int[] resources = new int[numOfResources];
    for (int i = 0; i < numOfResources; i++)
      initialResources[i] = Integer.parseInt(args[i + 1].trim());

    // create the bank
    Bank theBank = new BankImpl(initialResources);
    int[] maxDemand = new int[numOfResources];

    // read initial values for maximum array
    String line;
    try {
      BufferedReader inFile = new BufferedReader(new FileReader(inputFile));

      int threadNum = 0;
      int resourceNum = 0;

      for (int i = 0; i < Customer.COUNT; i++) {
        line = inFile.readLine();
        StringTokenizer tokens = new StringTokenizer(line, ",");

        while (tokens.hasMoreTokens()) {
          int amt = Integer.parseInt(tokens.nextToken().trim());
          maxDemand[resourceNum++] = amt;
        }
        theBank.addCustomer(threadNum, maxDemand);
        ++threadNum;
        resourceNum = 0;
      }
    } catch (FileNotFoundException fnfe) {
      throw new Error("Unable to find file " + inputFile);
    } catch (IOException ioe) {
      throw new Error("Error processing " + inputFile);
    }

    // now loop reading requests

    BufferedReader cl = new BufferedReader(new InputStreamReader(System.in));
    int[] requests = new int[numOfResources];
    String requestLine;

    while ((requestLine = cl.readLine()) != null) {
      if (requestLine.equals("")) continue;

      if (requestLine.equals("*"))
        // output the state
        theBank.getState();
      else {
        // we know that we are reading N items on the command line
        // [RQ || RL] <customer number> <resource #1> <#2> <#3>
        StringTokenizer tokens = new StringTokenizer(requestLine);

        // get transaction type - request (RQ) or release (RL)
        String trans = tokens.nextToken().trim();

        // get the customer number making the tranaction
        int custNum = Integer.parseInt(tokens.nextToken().trim());

        // get the resources involved in the transaction
        for (int i = 0; i < numOfResources; i++) {
          resources[i] = Integer.parseInt(tokens.nextToken().trim());
          System.out.println("*" + resources[i] + "*");
        }

        // now check the transaction type
        if (trans.equals("RQ")) { // request
          if (theBank.requestResources(custNum, resources)) System.out.println("Approved");
          else System.out.println("Denied");
        } else if (trans.equals("RL")) // release
        theBank.releaseResources(custNum, resources);
        else // illegal request
        System.err.println("Must be either 'RQ' or 'RL'");
      }
    }
  }