/*******************************************************************************
* 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.Iterator;
import java.util.List;
import javax.script.ScriptException;
import net.autosauler.ballance.server.mongodb.Database;
import net.autosauler.ballance.server.vm.CatalogWrapper;
import net.autosauler.ballance.shared.Description;
import net.autosauler.ballance.shared.Field;
import net.autosauler.ballance.shared.UserRole;
import net.autosauler.ballance.shared.datatypes.DataTypes;
import org.w3c.dom.Element;
import com.allen_sauer.gwt.log.client.Log;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
/**
* The Class AbstractCatalog.
*
* @author alexript
*/
public class AbstractCatalog extends AbstractStructuredData implements
IScriptableObject {
// TODO: add periodic catalogs
// TODO: add groups
/** The Constant fieldname_fullname. */
private static final String fieldname_fullname = "fullname";
public static AbstractCatalog getInstance(String catalogname,
String domain, Long number) {
if (catalogname.startsWith("catalog.")) {
String name = catalogname.replace("catalog.", "");
return new AbstractCatalog(name, domain, number);
}
return null;
}
public static AbstractCatalog getInstance(String catalogname,
String domain, Long number, UserRole role) {
if (catalogname.startsWith("catalog.")) {
Structures s = new Structures(domain);
Description d = s.getDescription(catalogname);
if (role.hasAccess(new UserRole(d.getRole()))) {
String name = catalogname.replace("catalog.", "");
return new AbstractCatalog(name, domain, number);
}
}
return null;
}
public static AbstractCatalog getInstance(String catalogname,
UserRole role, String domain, String login) {
if (catalogname.startsWith("catalog.")) {
Structures s = new Structures(domain);
Description d = s.getDescription(catalogname);
if (role.hasAccess(new UserRole(d.getRole()))) {
String name = catalogname.replace("catalog.", "");
return new AbstractCatalog(name, domain, login);
}
}
return null;
}
/**
* Instantiates a new catalog record.
*
* @param name
* the name
* @param domain
* the domain
* @param number
* the number
*/
public AbstractCatalog(String name, String domain, Long number) {
super("cat", name, domain);
get(number);
}
/**
* Instantiates a new catalog record.
*
* @param name
* the name
* @param domain
* the domain
* @param username
* the username
*/
public AbstractCatalog(String name, String domain, String username) {
super("cat", name, domain);
setUsername(username);
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#addFindAllOrders
* ( com.mongodb.BasicDBObject)
*/
@Override
protected void addFindAllOrders(final BasicDBObject o) {
o.put(fieldname_fullname, 1);
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#
* addFindAllQueryParameters (com.mongodb.BasicDBObject)
*/
@Override
protected void addFindAllQueryParameters(final BasicDBObject q) {
return;
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#
* addFindLastNumberParams(com.mongodb.BasicDBObject)
*/
@Override
protected void addFindLastNumberParams(BasicDBObject w) {
return;
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#
* addGetRecordParams(com.mongodb.BasicDBObject)
*/
@Override
protected void addGetRecordParams(BasicDBObject query) {
return;
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.IScriptableObject#generateDefaultScript
* ()
*/
@Override
public String generateDefaultScript() {
StringBuilder sb = new StringBuilder();
sb.append("import java.lang\nimport com.allen_sauer.gwt.log.client.Log\n\n");
sb.append("function OnCreate(record)\n Log.error('method OnCreate not defined')\nend\n\n");
sb.append("function OnTrash(record)\n Log.error('method OnTrash not defined')\nend\n\n");
sb.append("function OnRestore(record)\n Log.error('method OnRestore not defined')\nend\n\n");
sb.append("function OnUpdate(record)\n Log.error('method OnUpdate not defined')\nend\n\n");
// Set<String> names = struct.getNames();
// Iterator<String> i = names.iterator();
// while (i.hasNext()) {
// String n = i.next();
// String nn = Character.toUpperCase(n.charAt(0)) + n.substring(1);
// String name = "On" + nn + "Change";
// sb.append("// must return HashTable\n");
// sb.append("function " + name + "(hashTable)\n Log.error('method "
// + name + " not defined')\nreturn hashTable\nend\n\n");
//
// }
//
sb.append("// must return HashTable\n");
sb.append("function OnChange(changedfield, hashTable)\n return hashTable\nend\n\n");
return sb.toString();
}
/**
* Gets the fullname.
*
* @return the fullname
*/
public String getFullname() {
return (String) values.get(fieldname_fullname);
}
/**
* Gets the select data (pairs name-number).
*
* @return the select data
*/
public HashMap<String, Long> getSelectData() {
HashMap<String, Long> map = new HashMap<String, 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_trash, false);
w.put("$query", q);
BasicDBObject o = new BasicDBObject();
o.put(fieldname_fullname, 1);
w.put("$orderby", o);
DBCursor cur = coll.find(w);
while (cur.hasNext()) {
DBObject myDoc = cur.next();
map.put((String) myDoc.get(fieldname_fullname),
(Long) myDoc.get(fieldname_number));
}
Database.release();
}
return map;
}
/**
* Gets the view data.
*
* @return the view data
*/
public HashMap<Long, String> getViewData() {
HashMap<Long, String> map = new HashMap<Long, String>();
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_trash, false);
w.put("$query", q);
BasicDBObject o = new BasicDBObject();
o.put(fieldname_fullname, 1);
w.put("$orderby", o);
DBCursor cur = coll.find(w);
while (cur.hasNext()) {
DBObject myDoc = cur.next();
map.put((Long) myDoc.get(fieldname_number),
(String) myDoc.get(fieldname_fullname));
}
Database.release();
}
return map;
}
/**
* Inits the catalog structure.
*/
@Override
protected void initGlobalStructure() {
struct.add(fieldname_fullname, DataTypes.DT_STRING, "uncknown");
}
/**
* Inits the structure.
*/
@Override
protected void initStructure(String domain) {
Structures s = new Structures(domain);
Description d = s.getDescription("catalog." + 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
protected void onCreate() {
Scripts script = new Scripts(this, getDomain(), getUsername(),
"catalog." + getSuffix());
try {
script.call("OnCreate", new CatalogWrapper(this));
} catch (ScriptException e) {
Log.error(e.getMessage());
} catch (NoSuchMethodException e) {
Log.error(e.getMessage());
}
}
/*
* (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(final BasicDBObject i, final DBCollection coll) {
i.put(fieldname_fullname, 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() {
Scripts script = new Scripts(this, getDomain(), getUsername(),
"catalog." + getSuffix());
try {
script.call("OnUpdate", new CatalogWrapper(this));
} catch (ScriptException e) {
Log.error(e.getMessage());
} catch (NoSuchMethodException e) {
Log.error(e.getMessage());
}
}
/*
* (non-Javadoc)
*
* @see
* net.autosauler.ballance.server.model.AbstractStructuredData#restore()
*/
@Override
public void restore() {
super.restore();
Scripts script = new Scripts(this, getDomain(), getUsername(),
"catalog." + getSuffix());
try {
script.call("OnRestore", new CatalogWrapper(this));
} catch (ScriptException e) {
Log.error(e.getMessage());
} catch (NoSuchMethodException e) {
Log.error(e.getMessage());
}
}
/**
* Sets the fullname.
*
* @param fullname
* the new fullname
*/
public void setFullname(String fullname) {
values.set(fieldname_fullname, fullname);
}
/*
* (non-Javadoc)
*
* @see net.autosauler.ballance.server.model.AbstractStructuredData#trash()
*/
@Override
public void trash() {
super.trash();
Scripts script = new Scripts(this, getDomain(), getUsername(),
"catalog." + getSuffix());
try {
script.call("OnTrash", new CatalogWrapper(this));
} catch (ScriptException e) {
Log.error(e.getMessage());
} catch (NoSuchMethodException e) {
Log.error(e.getMessage());
}
}
}