package wrappers; //import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Set; import org.bson.BsonArray; import org.bson.BsonBoolean; import org.bson.BsonDateTime; //import org.bson.BsonDecimal128; import org.bson.BsonDocument; import org.bson.BsonDouble; import org.bson.BsonInt32; import org.bson.BsonInt64; import org.bson.BsonNull; import org.bson.BsonString; import org.bson.BsonValue; import org.bson.Document; import org.bson.conversions.Bson; //import org.bson.types.Decimal128; import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; import com.mongodb.MongoException; import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; public class Mongo3Interface { boolean DEBUG = false; String Errmsg = "No error"; String bvalName = null; Set Colnames = null; MongoClient client = null; MongoDatabase db = null; MongoCollection coll = null; FindIterable finditer = null; AggregateIterable aggiter = null; MongoCursor cursor = null; BsonDocument doc = null; BsonDocument util = null; BsonNull bsonull = new BsonNull(); // === Constructors/finalize ========================================= public Mongo3Interface() { this(false); } // end of default constructor public Mongo3Interface(boolean b) { DEBUG = b; } // end of constructor protected void SetErrmsg(String str) { if (DEBUG) System.out.println(str); Errmsg = str; } // end of SetErrmsg protected void SetErrmsg(Exception e) { if (DEBUG) System.out.println(e.getMessage()); Errmsg = e.toString(); } // end of SetErrmsg public String GetErrmsg() { String err = Errmsg; Errmsg = "No error"; return err; } // end of GetErrmsg public int MongoConnect(String[] parms) { int rc = 0; if (DEBUG) System.out.println("Mongo3: URI=" + parms[0] + " DB=" + parms[1]); try { MongoClientURI uri = new MongoClientURI(parms[0]); client = new MongoClient(uri); if (DEBUG) System.out.println("Connection " + client.toString() + " established"); // Now connect to your databases db = client.getDatabase(parms[1]); // if (parms[2] != null && !parms[2].isEmpty()) { // if (DEBUG) // System.out.println("user=" + parms[2] + " pwd=" + parms[3]); // @SuppressWarnings("deprecation") // boolean auth = db.authenticate(parms[2], parms[3].toCharArray()); // if (DEBUG) // System.out.println("Authentication: " + auth); // } // endif user } catch (MongoException me) { SetErrmsg(me); rc = -1; } catch (Exception e) { SetErrmsg(e); rc = -3; } // end try/catch return rc; } // end of MongoConnect public int MongoDisconnect() { int rc = 0; try { if (cursor != null) { if (DEBUG) System.out.println("Closing cursor"); cursor.close(); cursor = null; } // endif client if (client != null) { if (DEBUG) System.out.println("Closing connection"); client.close(); client = null; } // endif client } catch (MongoException se) { SetErrmsg(se); rc += 8; } // end try/catch return rc; } // end of MongoDisconnect public boolean GetCollection(String name) { if (DEBUG) System.out.println("GetCollection: name=" + name); try { coll = db.getCollection(name).withDocumentClass(BsonDocument.class); } catch (Exception e) { SetErrmsg(e); return true; } // end try/catch return false; } // end of GetCollection public long GetCollSize() { return (coll != null) ? coll.count() : 0; } // end of GetCollSize public boolean FindColl(String query, String fields) { if (DEBUG) System.out.println("FindColl: query=" + query + " fields=" + fields); try { if (query != null) { Bson dbq = Document.parse(query); finditer = coll.find(dbq); } else finditer = coll.find(); if (fields != null) { Bson dbf = BsonDocument.parse(fields); finditer = finditer.projection(dbf); } // endif fields cursor = finditer.iterator(); } catch (Exception e) { SetErrmsg(e); return true; } // end try/catch return false; } // end of FindColl @SuppressWarnings("unchecked") public boolean AggregateColl(String pipeline) { if (DEBUG) System.out.println("AggregateColl: pipeline=" + pipeline); try { Document pipe = Document.parse(pipeline); ArrayList pip = (ArrayList) pipe.get("pipeline"); aggiter = coll.aggregate((List) pip); cursor = aggiter.iterator(); } catch (MongoException me) { SetErrmsg(me); return true; } // end try/catch return false; } // end of AggregateColl public boolean Rewind() { if (cursor != null) cursor.close(); if (finditer != null) cursor = finditer.iterator(); else if (aggiter != null) cursor = aggiter.iterator(); return (cursor == null); } // end of Rewind public int ReadNext() { try { if (cursor.hasNext()) { doc = cursor.next(); if (DEBUG) System.out.println("Class doc = " + doc.getClass()); Colnames = doc.keySet(); return Colnames.size(); } else return 0; } catch (MongoException mx) { SetErrmsg(mx); } // end try/catch return -1; } // end of ReadNext public boolean Fetch(int row) { if (cursor.hasNext()) { doc = cursor.next(); Colnames = doc.keySet(); return true; } else return false; } // end of Fetch public String GetDoc() { return (doc != null) ? doc.toJson() : null; } // end of GetDoc public Set GetColumns() { if (doc != null) return doc.keySet(); else return null; } // end of GetColumns public String ColumnName(int n) { if (n < Colnames.size()) return (String) Colnames.toArray()[n]; else return null; } // end of ColumnName public int ColumnType(int n, String name) { // if (rsmd == null) { // System.out.println("No result metadata"); // } else try { // if (n == 0) // n = rs.findColumn(name); // return rsmd.getColumnType(n); // } catch (SQLException se) { // SetErrmsg(se); // } //end try/catch return 666; // Not a type } // end of ColumnType public Object ColumnDesc(Object obj, int n, int[] val, int lvl) { Object ret = null; BsonValue bval = (BsonValue) ((obj != null) ? obj : doc); BsonDocument dob = (bval instanceof BsonDocument) ? (BsonDocument) bval : null; BsonArray ary = (bval instanceof BsonArray) ? (BsonArray) bval : null; try { if (ary != null) { bval = ary.get(n); bvalName = Integer.toString(n); } else if (dob != null) { // String[] k = dob.keySet().toArray(new String[0]); Object[] k = dob.keySet().toArray(); bval = dob.get(k[n]); bvalName = (String) k[n]; } else bvalName = "x" + Integer.toString(n); val[0] = 0; // ColumnType val[1] = 0; // Precision val[2] = 0; // Scale val[3] = 0; // Nullable val[4] = 0; // ncol if (bval.isString()) { val[0] = 1; val[1] = bval.asString().getValue().length(); } else if (bval.isInt32()) { val[0] = 7; val[1] = Integer.toString(bval.asInt32().getValue()).length(); } else if (bval.isInt64()) { val[0] = 5; val[1] = Long.toString(bval.asInt64().getValue()).length(); } else if (bval.isObjectId()) { val[0] = 1; val[1] = bval.asObjectId().getValue().toString().length(); } else if (bval.isDateTime()) { Long TS = (bval.asDateTime().getValue() / 1000); val[0] = 8; val[1] = TS.toString().length(); } else if (bval.isDouble()) { String d = Double.toString(bval.asDouble().getValue()); int i = d.indexOf('.') + 1; val[0] = 2; val[1] = d.length(); val[2] = (i > 0) ? val[1] - i : 0; } else if (bval.isBoolean()) { val[0] = 4; val[1] = 1; } else if (bval.isDocument()) { if (lvl > 0) { ret = bval; val[0] = 1; val[4] = bval.asDocument().keySet().size(); } else if (lvl == 0) { val[0] = 1; val[1] = bval.asDocument().toJson().length(); } // endif lvl } else if (bval.isArray()) { if (lvl > 0) { ret = bval; val[0] = 2; val[4] = bval.asArray().size(); } else if (lvl == 0) { val[0] = 1; util = new BsonDocument("arr", bval.asArray()); String s = util.toJson(); int i1 = s.indexOf('['); int i2 = s.lastIndexOf(']'); val[1] = i2 - i1 + 1; } // endif lvl } else if (bval.isDecimal128()) { val[0] = 9; val[1] = bval.asDecimal128().toString().length(); } else if (bval.isNull()) { val[0] = 0; val[3] = 1; } else { SetErrmsg("Type " + bval.getBsonType() + " of " + bvalName + " not supported"); val[0] = -1; } // endif's return ret; } catch (Exception ex) { SetErrmsg(ex); } // end try/catch val[0] = -1; return null; } // end of ColumnDesc public String ColDescName() { return bvalName; } // end of ColDescName protected BsonValue GetFieldObject(String path) { BsonValue o = doc; BsonDocument dob = null; BsonArray ary = null; String[] names = null; if (path == null || path.equals("") || path.equals("*")) return doc; else if (o instanceof BsonDocument) dob = doc; else if (o instanceof BsonArray) ary = (BsonArray) o; else return doc; try { names = path.split("\\."); for (String name : names) { if (ary != null) { o = ary.get(Integer.parseInt(name)); } else o = dob.get(name); if (o == null) break; if (DEBUG) System.out.println("Class o = " + o.getClass()); if (o instanceof BsonDocument) { dob = (BsonDocument) o; ary = null; } else if (o instanceof BsonArray) { ary = (BsonArray) o; } else break; } // endfor name } catch (IndexOutOfBoundsException x) { o = null; } catch (MongoException me) { SetErrmsg(me); o = null; } // end try/catch return o; } // end of GetFieldObject public String GetField(String path) { BsonValue o = GetFieldObject(path); if (o != null) { if (o.isString()) { return o.asString().getValue(); } else if (o.isInt32()) { return Integer.toString(o.asInt32().getValue()); } else if (o.isInt64()) { return Long.toString(o.asInt64().getValue()); } else if (o.isObjectId()) { return o.asObjectId().getValue().toString(); } else if (o.isDateTime()) { Integer TS = (int) (o.asDateTime().getValue() / 1000); return TS.toString(); } else if (o.isDouble()) { return Double.toString(o.asDouble().getValue()); } else if (o.isBoolean()) { return o.asBoolean().getValue() ? "1" : "0"; } else if (o.isDocument()) { return o.asDocument().toJson(); } else if (o.isArray()) { util = new BsonDocument("arr", o.asArray()); String s = util.toJson(); int i1 = s.indexOf('['); int i2 = s.lastIndexOf(']'); return s.substring(i1, i2 + 1); } else if (o.isDecimal128()) { return o.asDecimal128().toString(); } else if (o.isNull()) { return null; } else return o.toString(); } else return null; } // end of GetField public Object MakeBson(String s, int json) { BsonValue bval; if (json == 1) bval = BsonDocument.parse(s); else if (json == 2) bval = BsonArray.parse(s); else bval = null; return bval; } // end of MakeBson protected BsonValue ObjToBson(Object val, int json) { BsonValue bval = null; if (val == null) bval = bsonull; else if (val.getClass() == String.class) { if (json == 1) bval = BsonDocument.parse((String) val); else if (json == 2) bval = BsonArray.parse((String) val); else bval = new BsonString((String) val); } else if (val.getClass() == Integer.class) bval = new BsonInt32((int) val); else if (val.getClass() == Double.class) bval = new BsonDouble((double) val); else if (val.getClass() == BigInteger.class) bval = new BsonInt64((long) val); else if (val.getClass() == Boolean.class) bval = new BsonBoolean((Boolean) val); else if (val.getClass() == Date.class) bval = new BsonDateTime(((Date) val).getTime() * 1000); else if (val.getClass() == BsonDocument.class) bval = (BsonDocument) val; else if (val.getClass() == BsonArray.class) bval = (BsonArray) val; // else if (val.getClass() == BigDecimal.class) // bval = new BsonDecimal128((BigDecimal) val); return bval; } // end of ObjToBson public Object MakeDocument() { return new BsonDocument(); } // end of MakeDocument public boolean DocAdd(Object bdc, String key, Object val, int json) { try { ((BsonDocument) bdc).append(key, ObjToBson(val, json)); } catch (MongoException me) { SetErrmsg(me); return true; } // end try/catch return false; } // end of DocAdd public Object MakeArray() { return new BsonArray(); } // end of MakeArray public boolean ArrayAdd(Object bar, int n, Object val, int json) { try { for (int i = ((BsonArray) bar).size(); i < n; i++) ((BsonArray) bar).add(bsonull); ((BsonArray) bar).add(ObjToBson(val, json)); } catch (MongoException me) { SetErrmsg(me); return true; } catch (Exception ex) { SetErrmsg(ex); return true; } // end try/catch return false; } // end of ArrayAdd public boolean CollInsert(Object dob) { try { coll.insertOne((BsonDocument) dob); } catch (MongoException me) { SetErrmsg(me); return true; } catch (Exception ex) { SetErrmsg(ex); return true; } // end try/catch return false; } // end of CollInsert public long CollUpdate(Object upd) { long n = -1; if (DEBUG) System.out.println("upd: " + upd.toString()); try { UpdateResult res = coll.updateOne(Filters.eq("_id", doc.get("_id")), (Bson) upd); if (DEBUG) System.out.println("CollUpdate: " + res.toString()); n = res.getModifiedCount(); } catch (MongoException me) { SetErrmsg(me); } catch (Exception ex) { SetErrmsg(ex); } // end try/catch return n; } // end of CollUpdate public long CollDelete(boolean all) { long n = -1; try { DeleteResult res; if (all) res = coll.deleteMany(new Document()); else res = coll.deleteOne(Filters.eq("_id", doc.get("_id"))); if (DEBUG) System.out.println("CollDelete: " + res.toString()); n = res.getDeletedCount(); } catch (MongoException me) { SetErrmsg(me); } catch (Exception ex) { SetErrmsg(ex); } // end try/catch return n; } // end of CollDelete } // end of class Mongo3Interface