public boolean putObservation(Observation observation) {
    int ncStatus = 0;
    NativeLongByReference record_startp = new NativeLongByReference(new NativeLong(record_index));
    NativeLongByReference record_countp = new NativeLongByReference(new NativeLong(1));

    boolean observationPutSuccessful = false;
    if (!isClosed && record.isObservationValid(observation)) {
      ByteBuffer recordBuffer = ByteBuffer.allocateDirect(record.getCompoundSize());
      recordBuffer.order(ByteOrder.nativeOrder());

      recordBuffer.putInt(observation.station_index);
      recordBuffer.putInt(observation.time_offset);
      for (Object value : observation.values) {
        if (value instanceof String) {
          throw new UnsupportedOperationException("Need to implement char[] or string");
          //                    String val = (String) value;
          //                    ncStatus = nc_put_att_text(ncId, ncVarId, key, val);
          //                    status(ncStatus);
        } else if (value instanceof Integer) {
          int val = ((Integer) value).intValue();
          recordBuffer.putInt(val);
        } else if (value instanceof Short) {
          short val = ((Short) value).shortValue();
          recordBuffer.putShort(val);
        } else if (value instanceof Float) {
          float val = ((Float) value).floatValue();
          recordBuffer.putFloat(val);
        } else if (value instanceof Double) {
          double val = ((Double) value).doubleValue();
          recordBuffer.putDouble(val);
        } else {
          throw new UnsupportedOperationException("Should implement the other types");
        }
      } // record complete

      recordBuffer.rewind();
      ncStatus = nc_put_vara(ncId, record.getVarId(), record_startp, record_countp, recordBuffer);
      status(ncStatus);
      record_index++;

      // station_indexp.setValue(station_indexp.longValue() + 1);
      return true;
    }
    return observationPutSuccessful;
  }