/*
 NeoDatis ODB : Native Object Database (odb.info@neodatis.org)
 Copyright (C) 2007 NeoDatis Inc. http://www.neodatis.org

 "This file is part of the NeoDatis ODB open source object database".

 NeoDatis ODB is free software; you can redistribute it and/or
 modify it under the terms of the GNU Lesser General Public
 License as published by the Free Software Foundation; either
 version 2.1 of the License, or (at your option) any later version.

 NeoDatis ODB is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 Lesser General Public License for more details.

 You should have received a copy of the GNU Lesser General Public
 License along with this library; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.neodatis.odb.impl.core.trigger;

import java.util.Iterator;
import java.util.Map;

import org.neodatis.odb.OID;
import org.neodatis.odb.ObjectRepresentation;
import org.neodatis.odb.OdbConfiguration;
import org.neodatis.odb.core.IError;
import org.neodatis.odb.core.NeoDatisError;
import org.neodatis.odb.core.layers.layer2.meta.NonNativeObjectInfo;
import org.neodatis.odb.core.layers.layer3.IStorageEngine;
import org.neodatis.odb.core.trigger.DeleteTrigger;
import org.neodatis.odb.core.trigger.ITriggerManager;
import org.neodatis.odb.core.trigger.InsertTrigger;
import org.neodatis.odb.core.trigger.OIDTrigger;
import org.neodatis.odb.core.trigger.SelectTrigger;
import org.neodatis.odb.core.trigger.Trigger;
import org.neodatis.odb.core.trigger.UpdateTrigger;
import org.neodatis.odb.impl.core.server.trigger.DefaultObjectRepresentation;
import org.neodatis.odb.impl.main.ODBForTrigger;
import org.neodatis.tool.DLogger;
import org.neodatis.tool.wrappers.OdbString;
import org.neodatis.tool.wrappers.list.IOdbList;
import org.neodatis.tool.wrappers.list.OdbArrayList;
import org.neodatis.tool.wrappers.map.OdbHashMap;

public class DefaultTriggerManager implements ITriggerManager {

	private static final String ALL_CLASS_TRIGGER = "__all_class_";

	private IStorageEngine storageEngine;

	/** key is class Name, value is the collection of triggers for the class */
	protected Map> listOfUpdateTriggers;
	/** key is class Name, value is the collection of triggers for the class */
	protected Map> listOfInsertTriggers;
	/** key is class Name, value is the collection of triggers for the class */
	protected Map> listOfDeleteTriggers;
	/** key is class Name, value is the collection of triggers for the class */
	protected Map> listOfSelectTriggers;
	/** key is class Name, value is the collection of triggers for the class */
	protected Map> listOfOIdTriggers;

	public DefaultTriggerManager(IStorageEngine engine) {
		this.storageEngine = engine;
		init();
	}

	/**
	 * 
	 */
	private void init() {
		listOfUpdateTriggers = new OdbHashMap>();
		listOfDeleteTriggers = new OdbHashMap>();
		listOfSelectTriggers = new OdbHashMap>();
		listOfInsertTriggers = new OdbHashMap>();
		listOfOIdTriggers = new OdbHashMap>();
	}

	public void addUpdateTriggerFor(String className, UpdateTrigger trigger) {
		if (className == null) {
			className = ALL_CLASS_TRIGGER;
		}
		IOdbList c =  listOfUpdateTriggers.get(className);
		if (c == null) {
			c = new OdbArrayList();
			listOfUpdateTriggers.put(className, c);
		}
		c.add(trigger);
	}

	public void addInsertTriggerFor(String className, InsertTrigger trigger) {
		if (className == null) {
			className = ALL_CLASS_TRIGGER;
		}
		IOdbList c = listOfInsertTriggers.get(className);
		if (c == null) {
			c = new OdbArrayList();
			listOfInsertTriggers.put(className, c);
		}
		c.add(trigger);
	}
	public void addOidTriggerFor(String className, OIDTrigger trigger) {
		if (className == null) {
			className = ALL_CLASS_TRIGGER;
		}
		IOdbList c = listOfOIdTriggers.get(className);
		if (c == null) {
			c = new OdbArrayList();
			listOfOIdTriggers.put(className, c);
		}
		c.add(trigger);
	}

	public void addDeleteTriggerFor(String className, DeleteTrigger trigger) {
		if (className == null) {
			className = ALL_CLASS_TRIGGER;
		}
		IOdbList c = listOfDeleteTriggers.get(className);
		if (c == null) {
			c = new OdbArrayList();
			listOfDeleteTriggers.put(className, c);
		}
		c.add(trigger);
	}

	public void addSelectTriggerFor(String className, SelectTrigger trigger) {
		if (className == null) {
			className = ALL_CLASS_TRIGGER;
		}
		IOdbList c = listOfSelectTriggers.get(className);
		if (c == null) {
			c = new OdbArrayList();
			listOfSelectTriggers.put(className, c);
		}
		c.add(trigger);
	}

	public boolean hasDeleteTriggersFor(String classsName) {
		return listOfDeleteTriggers.containsKey(classsName) || listOfDeleteTriggers.containsKey(ALL_CLASS_TRIGGER);
	}

	public boolean hasOidTriggersFor(String classsName) {
		return listOfOIdTriggers.containsKey(classsName) || listOfOIdTriggers.containsKey(ALL_CLASS_TRIGGER);
	}

	public boolean hasInsertTriggersFor(String className) {
		return listOfInsertTriggers.containsKey(className) || listOfInsertTriggers.containsKey(ALL_CLASS_TRIGGER);
	}

	public boolean hasSelectTriggersFor(String className) {
		return listOfSelectTriggers.containsKey(className) || listOfSelectTriggers.containsKey(ALL_CLASS_TRIGGER);
	}

	public boolean hasUpdateTriggersFor(String className) {
		return listOfUpdateTriggers.containsKey(className) || listOfUpdateTriggers.containsKey(ALL_CLASS_TRIGGER);
	}

	/**
	 * FIXME try to cache l1+l2
	 * 
	 * @param className
	 * @return
	 */
	public IOdbList getListOfDeleteTriggersFor(String className) {
		IOdbList l1 = listOfDeleteTriggers.get(className);
		IOdbList l2 = listOfDeleteTriggers.get(ALL_CLASS_TRIGGER);

		if (l2 != null) {
			int size = l2.size();
			if (l1 != null) {
				size = size + l1.size();
			}
			IOdbList r = new OdbArrayList(size);
			if (l1 != null) {
				r.addAll(l1);
			}
			r.addAll(l2);
			return r;
		}

		return l1;
	}

	public IOdbList getListOfInsertTriggersFor(String className) {
		IOdbList l1 = listOfInsertTriggers.get(className);
		IOdbList l2 = listOfInsertTriggers.get(ALL_CLASS_TRIGGER);

		if (l2 != null) {
			int size = l2.size();
			if (l1 != null) {
				size = size + l1.size();
			}
			IOdbList r = new OdbArrayList(size);
			if (l1 != null) {
				r.addAll(l1);
			}
			r.addAll(l2);
			return r;
		}


		return l1;
	}

	public IOdbList getListOfOidTriggersFor(String className) {
		IOdbList l1 = listOfOIdTriggers.get(className);
		IOdbList l2 = listOfOIdTriggers.get(ALL_CLASS_TRIGGER);

		if (l2 != null) {
			int size = l2.size();
			if (l1 != null) {
				size = size + l1.size();
			}
			IOdbList r = new OdbArrayList(size);
			if (l1 != null) {
				r.addAll(l1);
			}
			r.addAll(l2);
			return r;
		}


		return l1;
	}

	public IOdbList getListOfSelectTriggersFor(String className) {
		IOdbList l1 = listOfSelectTriggers.get(className);
		IOdbList l2 = listOfSelectTriggers.get(ALL_CLASS_TRIGGER);
		if (l2 != null) {
			int size = l2.size();
			if (l1 != null) {
				size = size + l1.size();
			}
			IOdbList r = new OdbArrayList(size);
			if (l1 != null) {
				r.addAll(l1);
			}
			r.addAll(l2);
			return r;
		}


		return l1;
	}

	public IOdbList getListOfUpdateTriggersFor(String className) {
		IOdbList l1 = listOfUpdateTriggers.get(className);
		IOdbList l2 = listOfUpdateTriggers.get(ALL_CLASS_TRIGGER);

		if (l2 != null) {
			int size = l2.size();
			if (l1 != null) {
				size = size + l1.size();
			}
			IOdbList r = new OdbArrayList(size);
			if (l1 != null) {
				r.addAll(l1);
			}
			r.addAll(l2);
			return r;
		}


		return l1;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.neodatis.odb.core.trigger.ITriggerManager#manageInsertTriggerBefore
	 * (java.lang.Object)
	 */
	public boolean manageInsertTriggerBefore(String className, Object object) {
		if (hasInsertTriggersFor(className)) {
			InsertTrigger trigger = null;
			Iterator iterator = getListOfInsertTriggersFor(className).iterator();
			while (iterator.hasNext()) {
				trigger = (InsertTrigger) iterator.next();
				if (trigger.getOdb() == null) {
					trigger.setOdb(new ODBForTrigger(storageEngine));
				}
				try {
					if(!isNull(object)){
						trigger.beforeInsert(transform(object));
					}
				} catch (Exception e) {
					IError warning = NeoDatisError.BEFORE_INSERT_TRIGGER_HAS_THROWN_EXCEPTION.addParameter(trigger.getClass().getName())
							.addParameter(OdbString.exceptionToString(e, false));
					if (OdbConfiguration.displayWarnings()) {
						DLogger.info(warning);
					}
				}
			}
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.neodatis.odb.core.trigger.ITriggerManager#manageInsertTriggerAfter
	 * (java.lang.Object, org.neodatis.odb.core.OID, long)
	 */
	public void manageInsertTriggerAfter(String className, Object object, OID oid) {
		if (hasInsertTriggersFor(className)) {
			InsertTrigger trigger = null;
			Iterator iterator = getListOfInsertTriggersFor(className).iterator();

			while (iterator.hasNext()) {
				trigger = (InsertTrigger) iterator.next();
				if (trigger.getOdb() == null) {
					trigger.setOdb(new ODBForTrigger(storageEngine));
				}
				try {
					trigger.afterInsert(transform(object), oid);
				} catch (Exception e) {
					IError warning = NeoDatisError.AFTER_INSERT_TRIGGER_HAS_THROWN_EXCEPTION.addParameter(trigger.getClass().getName())
							.addParameter(OdbString.exceptionToString(e, false));
					if (OdbConfiguration.displayWarnings()) {
						DLogger.info(warning);
					}
				}
			}
		}
	}


	public boolean manageOidTrigger(NonNativeObjectInfo nnoi, OID oid) {
		String className = nnoi.getClassInfo().getFullClassName();
		if (hasOidTriggersFor(className)) {
			OIDTrigger trigger = null;
			Iterator iterator = getListOfOidTriggersFor(className).iterator();
			while (iterator.hasNext()) {
				trigger = (OIDTrigger) iterator.next();
				if (trigger.getOdb() == null) {
					trigger.setOdb(new ODBForTrigger(storageEngine));
				}
				try {
					if(!isNull(nnoi)){
						DefaultObjectRepresentation or = new DefaultObjectRepresentation(nnoi);
						or.addObserver(storageEngine.getSession(true));
						trigger.setOid(or,oid);
					}
				} catch (Exception e) {
					IError warning = NeoDatisError.BEFORE_INSERT_TRIGGER_HAS_THROWN_EXCEPTION.addParameter(trigger.getClass().getName())
							.addParameter(OdbString.exceptionToString(e, false));
					if (OdbConfiguration.displayWarnings()) {
						DLogger.info(warning);
					}
				}
			}
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.neodatis.odb.core.trigger.ITriggerManager#manageUpdateTriggerBefore
	 * (java.lang.Object, java.lang.Object, org.neodatis.odb.core.OID)
	 */
	public boolean manageUpdateTriggerBefore(String className, NonNativeObjectInfo oldNnoi, Object newObject, OID oid) {
		if (hasUpdateTriggersFor(className)) {
			UpdateTrigger trigger = null;
			Iterator iterator = getListOfUpdateTriggersFor(className).iterator();
			while (iterator.hasNext()) {
				trigger = (UpdateTrigger) iterator.next();
				if (trigger.getOdb() == null) {
					trigger.setOdb(new ODBForTrigger(storageEngine));
				}
				try {
					trigger.beforeUpdate(new DefaultObjectRepresentation(oldNnoi), transform(newObject), oid);
				} catch (Exception e) {
					IError warning = NeoDatisError.BEFORE_UPDATE_TRIGGER_HAS_THROWN_EXCEPTION.addParameter(trigger.getClass().getName())
							.addParameter(OdbString.exceptionToString(e, false));
					if (OdbConfiguration.displayWarnings()) {
						DLogger.info(warning);
					}
				}
			}
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.neodatis.odb.core.trigger.ITriggerManager#manageUpdateTriggerAfter
	 * (java.lang.Object, java.lang.Object, org.neodatis.odb.core.OID)
	 */
	public void manageUpdateTriggerAfter(String className, NonNativeObjectInfo oldNnoi, Object newObject, OID oid) {
		if (hasUpdateTriggersFor(className)) {
			UpdateTrigger trigger = null;
			Iterator iterator = getListOfUpdateTriggersFor(className).iterator();
			while (iterator.hasNext()) {
				trigger = (UpdateTrigger) iterator.next();
				if (trigger.getOdb() == null) {
					trigger.setOdb(new ODBForTrigger(storageEngine));
				}
				try {
					trigger.afterUpdate(new DefaultObjectRepresentation(oldNnoi), transform(newObject), oid);
				} catch (Exception e) {
					IError warning = NeoDatisError.AFTER_UPDATE_TRIGGER_HAS_THROWN_EXCEPTION.addParameter(trigger.getClass().getName())
							.addParameter(OdbString.exceptionToString(e, false));
					if (OdbConfiguration.displayWarnings()) {
						DLogger.info(warning);
					}
				}
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.neodatis.odb.core.trigger.ITriggerManager#manageDeleteTriggerBefore
	 * (java.lang.Object, org.neodatis.odb.core.OID)
	 */
	public boolean manageDeleteTriggerBefore(String className, Object object, OID oid) {
		if (hasDeleteTriggersFor(className)) {
			DeleteTrigger trigger = null;
			Iterator iterator = getListOfDeleteTriggersFor(className).iterator();
			while (iterator.hasNext()) {
				trigger = (DeleteTrigger) iterator.next();
				if (trigger.getOdb() == null) {
					trigger.setOdb(new ODBForTrigger(storageEngine));
				}
				try {
					trigger.beforeDelete(transform(object), oid);
				} catch (Exception e) {
					IError warning = NeoDatisError.BEFORE_DELETE_TRIGGER_HAS_THROWN_EXCEPTION.addParameter(trigger.getClass().getName())
							.addParameter(OdbString.exceptionToString(e, true));
					if (OdbConfiguration.displayWarnings()) {
						DLogger.info(warning);
					}
				}
			}
		}
		return true;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.neodatis.odb.core.trigger.ITriggerManager#manageDeleteTriggerAfter
	 * (java.lang.Object, org.neodatis.odb.core.OID)
	 */
	public void manageDeleteTriggerAfter(String className, Object object, OID oid) {
		if (hasDeleteTriggersFor(className)) {
			DeleteTrigger trigger = null;
			Iterator iterator = getListOfDeleteTriggersFor(className).iterator();
			while (iterator.hasNext()) {
				trigger = (DeleteTrigger) iterator.next();
				if (trigger.getOdb() == null) {
					trigger.setOdb(new ODBForTrigger(storageEngine));
				}
				try {
					trigger.afterDelete(transform(object), oid);
				} catch (Exception e) {
					IError warning = NeoDatisError.AFTER_DELETE_TRIGGER_HAS_THROWN_EXCEPTION.addParameter(trigger.getClass().getName())
							.addParameter(OdbString.exceptionToString(e, false));
					if (OdbConfiguration.displayWarnings()) {
						DLogger.info(warning);
					}
				}
			}
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.neodatis.odb.core.trigger.ITriggerManager#manageSelectTriggerAfter
	 * (java.lang.Object, org.neodatis.odb.core.OID)
	 */
	public void manageSelectTriggerAfter(String className, Object object, OID oid) {
		if (hasSelectTriggersFor(className)) {
			SelectTrigger trigger = null;
			Iterator iterator = getListOfSelectTriggersFor(className).iterator();
			while (iterator.hasNext()) {
				trigger = (SelectTrigger) iterator.next();
				if (trigger.getOdb() == null) {
					trigger.setOdb(new ODBForTrigger(storageEngine));
				}
				if(!isNull(object)){
					trigger.afterSelect(transform(object), oid);
				}
			}
		}
	}
	protected boolean isNull(Object object){
		return object == null;
	}

	/**
	 * For the default object trigger, no transformation is needed
	 */
	public Object transform(Object object) {
		return object;
	}

	public IStorageEngine getStorageEngine() {
		return storageEngine;
	}

}

 

Ads help maintain this website.