net.autosauler.ballance.server.model.AbstractCatalog.java Source code

Java tutorial

Introduction

Here is the source code for net.autosauler.ballance.server.model.AbstractCatalog.java

Source

/*******************************************************************************
 * 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());
        }

    }

}