private BreakpointSpec parseBreakpointSpec(String bptSpec) {
   StringTokenizer t = new StringTokenizer(bptSpec);
   BreakpointSpec bpSpec = null;
   //        try {
   String token = t.nextToken("@:( \t\n\r");
   // We can't use hasMoreTokens here because it will cause any leading
   // paren to be lost.
   String rest;
   try {
     rest = t.nextToken("").trim();
   } catch (NoSuchElementException e) {
     rest = null;
   }
   if ((rest != null) && rest.startsWith("@")) {
     t = new StringTokenizer(rest.substring(1));
     String sourceName = token;
     String lineToken = t.nextToken();
     int lineNumber = Integer.valueOf(lineToken).intValue();
     if (t.hasMoreTokens()) {
       return null;
     }
     bpSpec = runtime.createSourceLineBreakpoint(sourceName, lineNumber);
   } else if ((rest != null) && rest.startsWith(":")) {
     t = new StringTokenizer(rest.substring(1));
     String classId = token;
     String lineToken = t.nextToken();
     int lineNumber = Integer.valueOf(lineToken).intValue();
     if (t.hasMoreTokens()) {
       return null;
     }
     bpSpec = runtime.createClassLineBreakpoint(classId, lineNumber);
   } else {
     // Try stripping method from class.method token.
     int idot = token.lastIndexOf(".");
     if ((idot <= 0) || /* No dot or dot in first char */ (idot >= token.length() - 1)) {
       /* dot in last char */
       return null;
     }
     String methodName = token.substring(idot + 1);
     String classId = token.substring(0, idot);
     List<String> argumentList = null;
     if (rest != null) {
       if (!rest.startsWith("(") || !rest.endsWith(")")) {
         // ### Should throw exception with error message
         // out.println("Invalid method specification: "
         //            + methodName + rest);
         return null;
       }
       // Trim the parens
       // ### What about spaces in arglist?
       rest = rest.substring(1, rest.length() - 1);
       argumentList = new ArrayList<String>();
       t = new StringTokenizer(rest, ",");
       while (t.hasMoreTokens()) {
         argumentList.add(t.nextToken());
       }
     }
     bpSpec = runtime.createMethodBreakpoint(classId, methodName, argumentList);
   }
   //        } catch (Exception e) {
   //            env.error("Exception attempting to create breakpoint: " + e);
   //            return null;
   //        }
   return bpSpec;
 }