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);
}
}