// Path: src/bindings/ejdb2_jni/src/main/java/com/softmotions/ejdb2/JSON.java
// public static final class ObjectBuilder {
// 
//   final Map<String, Object> value;
// 
//   private JSON json;
// 
//   ObjectBuilder(Map<String, Object> value) {
//     this.value = value;
//   }
// 
//   ObjectBuilder() {
//     this(new LinkedHashMap<>());
//   }
// 
//   public ObjectBuilder putObject(String key) {
//     ObjectBuilder b = new ObjectBuilder();
//     value.put(key, b.value);
//     return b;
//   }
// 
//   public ObjectBuilder putObject(String key, JSON val) {
//     if (val.type == ValueType.NULL) {
//       return putNull(key);
//     }
//     if (val.type != ValueType.OBJECT) {
//       throw new JSONException("Value must be an Object");
//     }
//     value.put(key, val.value);
//     return this;
//   }
// 
//   public ArrayBuilder putArray(String key) {
//     ArrayBuilder b = new ArrayBuilder();
//     value.put(key, b.value);
//     return b;
//   }
// 
//   public ObjectBuilder putArray(String key, JSON val) {
//     if (val.type == ValueType.NULL) {
//       return putNull(key);
//     }
//     if (val.type != ValueType.ARRAY) {
//       throw new JSONException("Value must be an Array");
//     }
//     value.put(key, val.value);
//     return this;
//   }
// 
//   public ObjectBuilder put(String key, String val) {
//     value.put(key, val);
//     return this;
//   }
// 
//   public ObjectBuilder put(String key, Number val) {
//     value.put(key, val);
//     return this;
//   }
// 
//   public ObjectBuilder put(String key, Boolean val) {
//     value.put(key, val);
//     return this;
//   }
// 
//   public ObjectBuilder putNull(String key) {
//     value.put(key, null);
//     return this;
//   }
// 
//   public ObjectBuilder move(String oldKey, String newKey) {
//     if (value.containsKey(oldKey)) {
//       value.put(newKey, value.get(oldKey));
//       value.remove(oldKey);
//     }
//     return this;
//   }
// 
//   public ObjectBuilder delete(String key) {
//     value.remove(key);
//     return this;
//   }
// 
//   public Iterable<String> keys() {
//     return value.keySet();
//   }
// 
//   public JSON toJSON() {
//     if (json == null) {
//       json = new JSON(ValueType.OBJECT, value);
//     }
//     return json;
//   }
// 
//   @Override
//   public String toString() {
//     StringWriter sw = new StringWriter();
//     writeTo(sw, value);
//     return sw.toString();
//   }
// }
// 
// Path: src/bindings/ejdb2_jni/src/main/java/com/softmotions/ejdb2/JSON.java
// public static enum ValueType {
//   UNKNOWN, NULL, BOOLEAN, NUMBER, STRING, OBJECT, ARRAY;
// 
//   public static ValueType getTypeOf(Object v) {
//     if (v == null) {
//       return NULL;
//     }
//     Class clazz = v.getClass();
//     if (clazz == String.class) {
//       return STRING;
//     }
//     if (clazz == Boolean.class) {
//       return BOOLEAN;
//     }
//     if (v instanceof Number) {
//       return NUMBER;
//     }
//     if (v instanceof Map) {
//       return OBJECT;
//     }
//     if (v instanceof List) {
//       return ARRAY;
//     }
//     return UNKNOWN;
//   }
// }


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import com.softmotions.ejdb2.JSON.ObjectBuilder;
import com.softmotions.ejdb2.JSON.ValueType;
      EJDB2Exception exception = null;
      String json = "{'foo':'bar'}".replace('\'', '"');
      String patch = "[{'op':'add', 'path':'/baz', 'value':'qux'}]".replace('\'', '"');

      long id = db.put("c1", json);
      assert (id == 1L);

      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      db.get("c1", 1L, bos);
      assert (bos.toString().equals(json));

      db.patch("c1", patch, id);
      bos.reset();
      db.get("c1", 1L, bos);
      assert (bos.toString().equals("{'foo':'bar','baz':'qux'}".replace('\'', '"')));
      bos.reset();

      db.del("c1", id);

      exception = null;
      try {
        db.get("c1", id, bos);
      } catch (EJDB2Exception e) {
        exception = e;
      }
      assert (exception != null);
      assert (exception.getMessage().contains("IWKV_ERROR_NOTFOUND"));

      // JQL resources can be closed explicitly or garbage collected
      JQL q = db.createQuery("@mycoll/*");
// Path: src/bindings/ejdb2_jni/src/main/java/com/softmotions/ejdb2/JSON.java
// public static final class ObjectBuilder {
// 
//   final Map<String, Object> value;
// 
//   private JSON json;
// 
//   ObjectBuilder(Map<String, Object> value) {
//     this.value = value;
//   }
// 
//   ObjectBuilder() {
//     this(new LinkedHashMap<>());
//   }
// 
//   public ObjectBuilder putObject(String key) {
//     ObjectBuilder b = new ObjectBuilder();
//     value.put(key, b.value);
//     return b;
//   }
// 
//   public ObjectBuilder putObject(String key, JSON val) {
//     if (val.type == ValueType.NULL) {
//       return putNull(key);
//     }
//     if (val.type != ValueType.OBJECT) {
//       throw new JSONException("Value must be an Object");
//     }
//     value.put(key, val.value);
//     return this;
//   }
// 
//   public ArrayBuilder putArray(String key) {
//     ArrayBuilder b = new ArrayBuilder();
//     value.put(key, b.value);
//     return b;
//   }
// 
//   public ObjectBuilder putArray(String key, JSON val) {
//     if (val.type == ValueType.NULL) {
//       return putNull(key);
//     }
//     if (val.type != ValueType.ARRAY) {
//       throw new JSONException("Value must be an Array");
//     }
//     value.put(key, val.value);
//     return this;
//   }
// 
//   public ObjectBuilder put(String key, String val) {
//     value.put(key, val);
//     return this;
//   }
// 
//   public ObjectBuilder put(String key, Number val) {
//     value.put(key, val);
//     return this;
//   }
// 
//   public ObjectBuilder put(String key, Boolean val) {
//     value.put(key, val);
//     return this;
//   }
// 
//   public ObjectBuilder putNull(String key) {
//     value.put(key, null);
//     return this;
//   }
// 
//   public ObjectBuilder move(String oldKey, String newKey) {
//     if (value.containsKey(oldKey)) {
//       value.put(newKey, value.get(oldKey));
//       value.remove(oldKey);
//     }
//     return this;
//   }
// 
//   public ObjectBuilder delete(String key) {
//     value.remove(key);
//     return this;
//   }
// 
//   public Iterable<String> keys() {
//     return value.keySet();
//   }
// 
//   public JSON toJSON() {
//     if (json == null) {
//       json = new JSON(ValueType.OBJECT, value);
//     }
//     return json;
//   }
// 
//   @Override
//   public String toString() {
//     StringWriter sw = new StringWriter();
//     writeTo(sw, value);
//     return sw.toString();
//   }
// }
// 
// Path: src/bindings/ejdb2_jni/src/main/java/com/softmotions/ejdb2/JSON.java
// public static enum ValueType {
//   UNKNOWN, NULL, BOOLEAN, NUMBER, STRING, OBJECT, ARRAY;
// 
//   public static ValueType getTypeOf(Object v) {
//     if (v == null) {
//       return NULL;
//     }
//     Class clazz = v.getClass();
//     if (clazz == String.class) {
//       return STRING;
//     }
//     if (clazz == Boolean.class) {
//       return BOOLEAN;
//     }
//     if (v instanceof Number) {
//       return NUMBER;
//     }
//     if (v instanceof Map) {
//       return OBJECT;
//     }
//     if (v instanceof List) {
//       return ARRAY;
//     }
//     return UNKNOWN;
//   }
// }


// Path: src/bindings/ejdb2_jni/src/test/java/com/softmotions/ejdb2/TestEJDB2.java
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import com.softmotions.ejdb2.JSON.ObjectBuilder;
import com.softmotions.ejdb2.JSON.ValueType;

      EJDB2Exception exception = null;
      String json = "{'foo':'bar'}".replace('\'', '"');
      String patch = "[{'op':'add', 'path':'/baz', 'value':'qux'}]".replace('\'', '"');

      long id = db.put("c1", json);
      assert (id == 1L);

      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      db.get("c1", 1L, bos);
      assert (bos.toString().equals(json));

      db.patch("c1", patch, id);
      bos.reset();
      db.get("c1", 1L, bos);
      assert (bos.toString().equals("{'foo':'bar','baz':'qux'}".replace('\'', '"')));
      bos.reset();

      db.del("c1", id);

      exception = null;
      try {
        db.get("c1", id, bos);
      } catch (EJDB2Exception e) {
        exception = e;
      }
      assert (exception != null);
      assert (exception.getMessage().contains("IWKV_ERROR_NOTFOUND"));

      // JQL resources can be closed explicitly or garbage collected
      JQL q = db.createQuery("@mycoll/*");
      assert (q.getDb() != null);