/*******************************************************************************
* Copyright 2011 Alex 'Ript' Malyshev <alexript@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package net.autosauler.ballance.server.model;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
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 net.autosauler.ballance.shared.datatypes.DataTypes;
import org.w3c.dom.Element;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
/**
* The Class DocumentTablePart.
*
* @author alexript
*/
public class DocumentTablePart extends AbstractStructuredData {
/** The Constant fieldname_document. */
private static final String fieldname_document = "docnum";
/**
* Instantiates a new document table part.
*
* @param partname
* the partname
* @param domain
* the domain
*/
public DocumentTablePart(String partname, String domain) {
super("doctab", partname, domain);
setDocnum(new Long(0L));
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#addFindAllOrders
* (com.mongodb.BasicDBObject)
*/
@Override
protected void addFindAllOrders(BasicDBObject o) {
return;
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#
* addFindAllQueryParameters(com.mongodb.BasicDBObject)
*/
@Override
protected void addFindAllQueryParameters(BasicDBObject q) {
q.put(fieldname_document, getDocnum());
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#
* addFindLastNumberParams(com.mongodb.BasicDBObject)
*/
@Override
protected void addFindLastNumberParams(final BasicDBObject w) {
w.put(fieldname_document, getDocnum());
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#
* addGetRecordParams(com.mongodb.BasicDBObject)
*/
@Override
protected void addGetRecordParams(final BasicDBObject query) {
query.put(fieldname_document, getDocnum());
}
public void addRecord(Hashtable<String, Object> values) {
Set<String> names = struct.getNames();
Iterator<String> i = names.iterator();
while (i.hasNext()) {
String name = i.next();
if (!name.equals(fieldname_createdate)
&& !name.equals(fieldname_domain)
&& !name.equals(fieldname_number)
&& !name.equals(fieldname_username)) {
if (values.containsKey(name)) {
this.values.setObject(name, values.get(name));
}
}
}
setDocnum(getDocnum());
setUsername("");
save();
}
public Set<Long> findDocuments(String fieldname, Long value) {
Set<Long> ids = new HashSet<Long>();
DB db = Database.get(getDomain());
if (db != null) {
Database.retain();
DBCollection coll = db.getCollection(getTableName());
BasicDBObject q = new BasicDBObject();
BasicDBObject w = new BasicDBObject();
q.put(fieldname_domain, getDomain());
q.put(fieldname, value);
q.put(fieldname_trash, false);
w.put("$query", q);
DBCursor cur = coll.find(w);
while (cur.hasNext()) {
DBObject myDoc = cur.next();
if (myDoc != null) {
Long docid = (Long) myDoc.get(fieldname_document);
if (!ids.contains(docid)) {
ids.add(docid);
}
}
}
Database.release();
}
return ids;
}
/**
* Gets the docnum.
*
* @return the docnum
*/
public Long getDocnum() {
return (Long) values.get(fieldname_document);
}
public String getHelperName(String domain, String fieldname) {
Structures s = new Structures(domain);
Description d = s.getDescription("table." + getSuffix());
List<Field> fields = d.get();
for (Field field : fields) {
if (field.getFieldname().equals(fieldname)) {
return field.getHelper();
}
}
return null;
}
/**
* Gets the records.
*
* @return the records
*/
public Set<HashMap<String, Object>> getRecords() {
Set<HashMap<String, Object>> set = new HashSet<HashMap<String, Object>>();
DB db = Database.get(getDomain());
if (db != null) {
Database.retain();
DBCollection coll = db.getCollection(getTableName());
BasicDBObject q = new BasicDBObject();
BasicDBObject w = new BasicDBObject();
q.put(fieldname_domain, getDomain());
q.put(fieldname_document, getDocnum());
q.put(fieldname_trash, false);
w.put("$query", q);
BasicDBObject o = new BasicDBObject();
o.put(fieldname_number, 1);
addFindAllOrders(o);
w.put("$orderby", o);
DBCursor cur = coll.find(w);
while (cur.hasNext()) {
DBObject myDoc = cur.next();
load(myDoc);
HashMap<String, Object> map = toMap();
set.add(map);
}
Database.release();
}
return set;
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#
* initGlobalStructure()
*/
@Override
protected void initGlobalStructure() {
struct.add(fieldname_document, DataTypes.DT_LONG, new Long(0L));
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#initStructure
* ()
*/
@Override
protected void initStructure(String domain) {
Structures s = new Structures(domain);
Description d = s.getDescription("table." + getSuffix());
List<Field> fields = d.get();
Iterator<Field> i = fields.iterator();
while (i.hasNext()) {
Field f = i.next();
struct.add(f.getFieldname(), f.getType(), f.getDefval());
}
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#onCreate()
*/
@Override
public void onCreate() {
return;
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#onDump()
*/
@Override
protected StringBuilder onDump() {
return null;
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#onGetRecord
* (java.lang.Long)
*/
@Override
protected void onGetRecord(Long number) {
return;
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#onInitDbStruct
* (com.mongodb.BasicDBObject, com.mongodb.DBCollection)
*/
@Override
protected void onInitDbStruct(BasicDBObject i, DBCollection coll) {
i.put(fieldname_document, 1);
coll.createIndex(i);
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#onRestore
* (org.w3c.dom.Element)
*/
@Override
protected void onRestore(Element dump) {
return;
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#onUpdate()
*/
@Override
protected void onUpdate() {
return;
}
/**
* Sets the docnum.
*
* @param docnum
* the docnum to set
*/
public void setDocnum(Long docnum) {
values.setObject(fieldname_document, docnum);
}
/**
* Update records.
*
* @param username
* the username
* @param docnumber
* the docnumber
* @param set
* the set
* @return true, if successful
*/
public boolean updateRecords(String username, Long docnumber,
Set<HashMap<String, Object>> set) {
boolean result = true;
Iterator<HashMap<String, Object>> i = set.iterator();
while (i.hasNext()) {
HashMap<String, Object> map = i.next();
fromMap(map);
setNumber((Long) map.get(fieldname_number));
if (getNumber() < 1L) {
setDocnum(docnumber);
setUsername(username);
}
result = result && save();
}
return result;
}
}