@Override
  public DataSourceInfo getInfo(final Object resource) throws Exception {
    DataSourceInfo dataSourceInfo = null;
    if (canMap(resource)) {
      final BoneCPDataSource source = (BoneCPDataSource) resource;
      BoneCP pool;
      try {
        pool = source.getPool();
      } catch (NoSuchMethodError ex) {
        logger.trace("", ex);
        // This is an older version of BoneCP (pre-0.8.0)
        final Field poolField = BoneCPDataSource.class.getDeclaredField("pool");
        poolField.setAccessible(true);
        pool = (BoneCP) poolField.get(source);
      }

      dataSourceInfo = new DataSourceInfo();
      dataSourceInfo.setBusyConnections(source.getTotalLeased());
      dataSourceInfo.setEstablishedConnections(pool.getTotalCreatedConnections());
      dataSourceInfo.setMaxConnections(
          source.getPartitionCount() * source.getMaxConnectionsPerPartition());
      dataSourceInfo.setJdbcUrl(source.getJdbcUrl());
      dataSourceInfo.setUsername(source.getUsername());
      dataSourceInfo.setResettable(false);
      dataSourceInfo.setType("bonecp");
    }
    return dataSourceInfo;
  }