public int getNumber() {
   return fBreakpoint.getNumber();
 }
  /**
   * Constructs a DsfMIBreakpoint from a back-end object
   *
   * @param dsfMIBreakpoint back-end breakpoint
   */
  public MIBreakpointDMData(MIBreakpoint dsfMIBreakpoint) {

    // No support for catchpoints yet
    fBreakpoint = dsfMIBreakpoint;
    if (dsfMIBreakpoint.isTracepoint()) {
      fNature = MIBreakpointNature.TRACEPOINT;
    } else if (dsfMIBreakpoint.isWatchpoint()) {
      fNature = MIBreakpointNature.WATCHPOINT;
    } else if (dsfMIBreakpoint.isCatchpoint()) {
      fNature = MIBreakpointNature.CATCHPOINT;
    } else {
      fNature = MIBreakpointNature.BREAKPOINT;
    }

    fProperties = new HashMap<String, Object>();
    switch (fNature) {
      case BREAKPOINT:
        {
          // Note that this may in fact be a catchpoint. See comment below in
          // CATCHPOINT case

          // Generic breakpoint attributes
          fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.BREAKPOINT);
          fProperties.put(MIBreakpoints.FILE_NAME, dsfMIBreakpoint.getFile());
          fProperties.put(MIBreakpoints.LINE_NUMBER, dsfMIBreakpoint.getLine());
          fProperties.put(MIBreakpoints.FUNCTION, dsfMIBreakpoint.getFunction());
          fProperties.put(MIBreakpoints.ADDRESS, dsfMIBreakpoint.getAddress());
          fProperties.put(MIBreakpoints.CONDITION, dsfMIBreakpoint.getCondition());
          fProperties.put(MIBreakpoints.IGNORE_COUNT, dsfMIBreakpoint.getIgnoreCount());
          fProperties.put(MIBreakpoints.IS_ENABLED, new Boolean(dsfMIBreakpoint.isEnabled()));
          fProperties.put(MIBreakpoints.COMMANDS, dsfMIBreakpoint.getCommands());

          // MI-specific breakpoint attributes
          fProperties.put(NUMBER, dsfMIBreakpoint.getNumber());
          fProperties.put(TYPE, dsfMIBreakpoint.getType());
          fProperties.put(THREAD_ID, dsfMIBreakpoint.getThreadId());
          fProperties.put(FULL_NAME, dsfMIBreakpoint.getFullName());
          fProperties.put(HITS, dsfMIBreakpoint.getTimes());
          fProperties.put(IS_TEMPORARY, new Boolean(dsfMIBreakpoint.isTemporary()));
          fProperties.put(IS_HARDWARE, new Boolean(dsfMIBreakpoint.isHardware()));
          fProperties.put(LOCATION, formatLocation());
          break;
        }

      case WATCHPOINT:
        {
          // Generic breakpoint attributes
          fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.WATCHPOINT);
          fProperties.put(MIBreakpoints.EXPRESSION, dsfMIBreakpoint.getExpression());
          fProperties.put(
              MIBreakpoints.READ,
              dsfMIBreakpoint.isAccessWatchpoint() || dsfMIBreakpoint.isReadWatchpoint());
          fProperties.put(
              MIBreakpoints.WRITE,
              dsfMIBreakpoint.isAccessWatchpoint() || dsfMIBreakpoint.isWriteWatchpoint());

          // MI-specific breakpoint attributes
          fProperties.put(NUMBER, dsfMIBreakpoint.getNumber());
          break;
        }

      case TRACEPOINT:
        {
          // Generic breakpoint attributes
          fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
          fProperties.put(MIBreakpoints.FILE_NAME, dsfMIBreakpoint.getFile());
          fProperties.put(MIBreakpoints.LINE_NUMBER, dsfMIBreakpoint.getLine());
          fProperties.put(MIBreakpoints.FUNCTION, dsfMIBreakpoint.getFunction());
          fProperties.put(MIBreakpoints.ADDRESS, dsfMIBreakpoint.getAddress());
          fProperties.put(MIBreakpoints.CONDITION, dsfMIBreakpoint.getCondition());
          fProperties.put(MIBreakpoints.PASS_COUNT, dsfMIBreakpoint.getPassCount());
          fProperties.put(MIBreakpoints.IS_ENABLED, new Boolean(dsfMIBreakpoint.isEnabled()));
          fProperties.put(MIBreakpoints.COMMANDS, dsfMIBreakpoint.getCommands());

          // MI-specific breakpoint attributes
          fProperties.put(NUMBER, dsfMIBreakpoint.getNumber());
          fProperties.put(TYPE, dsfMIBreakpoint.getType());
          fProperties.put(THREAD_ID, dsfMIBreakpoint.getThreadId());
          fProperties.put(FULL_NAME, dsfMIBreakpoint.getFullName());
          fProperties.put(HITS, dsfMIBreakpoint.getTimes());
          fProperties.put(IS_TEMPORARY, new Boolean(dsfMIBreakpoint.isTemporary()));
          fProperties.put(IS_HARDWARE, new Boolean(dsfMIBreakpoint.isHardware()));
          fProperties.put(LOCATION, formatLocation());
          break;
        }

      case CATCHPOINT:
        {
          // Because gdb doesn't support catchpoints in mi, we end up using
          // CLI to set the catchpoint. The sort of MIBreakpoint we create
          // at that time is minimal as the only information we get back from
          // gdb is the breakpoint number and type of the catchpoint we just
          // set. See MIBreakpoint(String)
          //
          // The only type of MIBreakpoint that will be of this CATCHPOINT type
          // is the instance we create from the response of the CLI command we
          // use to set the catchpoint. If we later query gdb for the breakpoint
          // list, we'll unfortunately end up creating an MIBreakpoint of type
          // BREAKPOINT. Maybe one day gdb will treats catchpoints like first
          // class citizens and this messy situation will go away.

          fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.CATCHPOINT);
          fProperties.put(MIBreakpoints.CATCHPOINT_TYPE, dsfMIBreakpoint.getCatchpointType());
          fProperties.put(NUMBER, dsfMIBreakpoint.getNumber());
          break;
        }

        // Not reachable
      default:
        {
          fProperties.put(MIBreakpoints.BREAKPOINT_TYPE, null);
          break;
        }
    }
  }
 public int getReference() {
   return fBreakpoint.getNumber();
 }