/
codebase/
codebase/area/
codebase/doc/
codebase/etc/
codebase/src/net/sourceforge/pain/data/trigger/
codebase/src/net/sourceforge/pain/logic/
codebase/src/net/sourceforge/pain/logic/affect/
codebase/src/net/sourceforge/pain/logic/event/
codebase/src/net/sourceforge/pain/logic/event/deploy/
codebase/src/net/sourceforge/pain/logic/event/guitool/
codebase/src/net/sourceforge/pain/logic/event/guitool/event/
codebase/src/net/sourceforge/pain/logic/fn/util/
codebase/src/net/sourceforge/pain/logic/trigger/
codebase/src/net/sourceforge/pain/logic/trigger/impl/
codebase/src/net/sourceforge/pain/network/console/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/plugin/command/
codebase/src/net/sourceforge/pain/plugin/reset/
codebase/src/net/sourceforge/pain/plugin/shutdown/
codebase/src/net/sourceforge/pain/plugin/social/
codebase/src/net/sourceforge/pain/util/
db/doc/javadoc/resources/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.data;

import net.sourceforge.pain.db.*;
import net.sourceforge.pain.logic.*;

/**
 * All classes that exteds TriggerData are DbObjects
 * and should add only new fields to save
 * All subclasses should be defined in data.trigger package
 * and should not contain any logical code.
 * TRIGGER_LOGIC_CLASS_NAME should provide us with a valid
 * logic handler for this trigger.
 */
public class TriggerData extends DbObject {

    /**
     * trigger type
     */
    private static int TRIGGER_EVENT_TYPE = 0;

    /**
     * role the trigger is applied
     */
    private static int TRIGGERED_ROLE = 1;

    /**
     * class name with trigger logic code
     */
    private static int TRIGGER_CLASS_NAME = 2;

    /**
     * for trigger data subclasses use
     */
    protected static int LAST_BASE_FIELD_INDEX = 2;

    private static int NFIELDS = 3;
    public static final String TRIGGER_LOGIC_PACKAGE_PREFIX = "net.sourceforge.pain.logic.trigger.impl.";
    public static final int TRIGGER_LOGIC_PACKAGE_PREFIX_LEN = TRIGGER_LOGIC_PACKAGE_PREFIX.length();


    public TriggerData() {
    }

    public TriggerData(final PainDB db, Role triggeredRole, Class triggerImplClass, int triggerEventType) throws Exception {
        super(db);
        if (triggeredRole == null) {
            throw new NullPointerException("triggered role is null!");
        }
        if (!Trigger.class.isAssignableFrom(triggerImplClass)) {
            throw new IllegalArgumentException("Illegal trigger impl class!");
        }
        setTriggerEventType(triggerEventType);
        setTriggerClassName(triggerImplClass.getName().substring(TRIGGER_LOGIC_PACKAGE_PREFIX_LEN));
        setTriggeredRole(triggeredRole);
        triggeredRole.getRoot().onTriggerCreated(triggeredRole, this);
    }

    protected DbClassSchema provideSchema() {
        byte types[] = new byte[NFIELDS];
        String names[] = new String[NFIELDS];
        fillSuperSchema(types, names);
        return new DbClassSchema(types, names);
    }

    protected void fillSuperSchema(byte[] types, String[] names) {
        types[TRIGGER_EVENT_TYPE] = DbType.INT;
        names[TRIGGER_EVENT_TYPE] = "type";

        types[TRIGGERED_ROLE] = DbType.REFERENCE;
        names[TRIGGERED_ROLE] = "triggered_role";

        types[TRIGGER_CLASS_NAME] = DbType.STRING;
        names[TRIGGER_CLASS_NAME] = "trigger_class_name";
    }


    public final String getTriggerClassName() {
        return getString(TRIGGER_CLASS_NAME);
    }

    final void setTriggerClassName(String triggerClassName) {
        setString(TRIGGER_CLASS_NAME, triggerClassName);
    }

    public final int getTriggerEventType() {
        return getInt(TRIGGER_EVENT_TYPE);
    }

    final void setTriggerEventType(int type) {
        setInt(TRIGGER_EVENT_TYPE, type);
    }

    public final Role getTriggeredRole() {
        return (Role) getReference(TRIGGERED_ROLE);
    }

    final void setTriggeredRole(Role role) {
        setReference(TRIGGERED_ROLE, role);
    }

}