package net.autosauler.ballance.server.model; import java.util.ArrayList; import java.util.Date; import java.util.Hashtable; import java.util.List; import java.util.Set; import net.autosauler.ballance.server.mongodb.Database; import net.autosauler.ballance.shared.Description; import net.autosauler.ballance.shared.Field; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; public class Regestry { private static final String prefix = "reg_"; private final String domain; private final String tablename; private final String structname; protected final static String fieldname_domain = "domain"; protected final static String fieldname_docname = "docname"; protected final static String fieldname_docnum = "docnum"; protected final static String fieldname_date = "adddate"; protected final static String fieldname_summ = "s"; protected final static String fieldname_curr = "c"; private Description descr; public Regestry(String name, String domain) { this.domain = domain; tablename = prefix + name; structname = "regestry." + name; initStruct(); } public boolean add(AbstractDocument doc, Double summ, String currency, Hashtable<String, Object> values) { boolean result = false; DB db = Database.get(domain); if (db != null) { BasicDBObject data = new BasicDBObject(); if (data != null) { data.put(fieldname_domain, domain); data.put(fieldname_docname, doc.getDocname()); data.put(fieldname_docnum, doc.getNumber()); data.put(fieldname_date, new Date()); data.put(fieldname_summ, summ); data.put(fieldname_curr, currency); Set<String> names = values.keySet(); for (String name : names) { data.put(name, values.get(name)); } Database.retain(); DBCollection coll = db.getCollection(tablename); coll.insert(data); Database.release(); result = true; } } return result; } public List<RegestryRecord> history(String currency, Date startdate, Date enddate, Hashtable<String, Object> filter) { List<RegestryRecord> result = new ArrayList<RegestryRecord>(); DB db = Database.get(domain); if (db != null) { BasicDBObject query = new BasicDBObject(); query.put(fieldname_domain, domain); BasicDBObject dq = new BasicDBObject(); dq.put("$gte", startdate); dq.put("$lte", enddate); query.put(fieldname_date, dq); Set<String> names = filter.keySet(); for (String name : names) { query.put(name, filter.get(name)); } Database.retain(); DBCollection coll = db.getCollection(tablename); DBCursor cur = coll.find(query); while (cur.hasNext()) { DBObject myDoc = cur.next(); result.add(new RegestryRecord(descr, myDoc, currency)); } Database.release(); } return result; } private void initStruct() { Structures structs = new Structures(domain); descr = structs.getDescription(structname); DB db = Database.get(domain); if (db != null) { Database.retain(); DBCollection coll = db.getCollection(tablename); List<DBObject> indexes = coll.getIndexInfo(); if (indexes.size() < 1) { BasicDBObject i = new BasicDBObject(); // for delete i.put(fieldname_domain, 1); i.put(fieldname_docname, 1); i.put(fieldname_docnum, 1); coll.createIndex(i); // for summ List<Field> fields = descr.get(); for (Field field : fields) { i = new BasicDBObject(); i.put(fieldname_domain, 1); i.put(fieldname_date, 1); i.put(field.getFieldname(), 1); coll.createIndex(i); } } Database.release(); } } public boolean remove(AbstractDocument doc) { boolean result = false; String docname = doc.getDocname(); Long docnum = doc.getNumber(); DB db = Database.get(domain); if (db != null) { BasicDBObject data = new BasicDBObject(); if (data != null) { data.put(fieldname_domain, domain); data.put(fieldname_docname, docname); data.put(fieldname_docnum, docnum); Database.retain(); DBCollection coll = db.getCollection(tablename); coll.remove(data); Database.release(); result = true; } } return result; } public Double summ(String currency, Date date, Hashtable<String, Object> filter) { Double result = new Double(0.0D); DB db = Database.get(domain); if (db != null) { BasicDBObject query = new BasicDBObject(); query.put(fieldname_domain, domain); BasicDBObject dq = new BasicDBObject(); dq.put("$lte", date); query.put(fieldname_date, dq); Set<String> names = filter.keySet(); for (String name : names) { query.put(name, filter.get(name)); } Database.retain(); DBCollection coll = db.getCollection(tablename); DBCursor cur = coll.find(query); while (cur.hasNext()) { DBObject myDoc = cur.next(); Double summ = (Double) myDoc.get(fieldname_summ); String curr = (String) myDoc.get(fieldname_curr); Date recorddate = (Date) myDoc.get(fieldname_date); result = result + Currency.convert(summ, curr, currency, recorddate); } Database.release(); } return result; } }