package railo.runtime.orm.hibernate.event; import org.hibernate.event.PreUpdateEvent; import railo.runtime.Component; import railo.runtime.PageContext; import railo.runtime.component.Property; import railo.runtime.engine.ThreadLocalPageContext; import railo.runtime.exp.PageException; import railo.runtime.exp.PageRuntimeException; import railo.runtime.orm.hibernate.CommonUtil; import railo.runtime.orm.hibernate.HibernateUtil; import railo.runtime.type.Collection; import railo.runtime.type.Collection.Key; import railo.runtime.type.Struct; import railo.runtime.type.UDF; public abstract class EventListener { private static final long serialVersionUID = -4842481789634140033L; protected Component component; private boolean allEvents; private Key eventType; public EventListener(Component component, Key eventType, boolean allEvents) { this.component=component; this.allEvents=allEvents; this.eventType=eventType; } protected boolean preUpdate(PreUpdateEvent event) { Struct oldData=CommonUtil.createStruct(); Property[] properties = HibernateUtil.getProperties(component,HibernateUtil.FIELDTYPE_COLUMN,null); Object[] data = event.getOldState(); if(data!=null && properties!=null && data.length==properties.length) { for(int i=0;i<data.length;i++){ oldData.setEL(CommonUtil.createKey(properties[i].getName()), data[i]); } } invoke(CommonUtil.PRE_UPDATE, event.getEntity(),oldData); return false; } public Component getCFC() { return component; } protected void invoke(Collection.Key name, Object obj) { invoke(name, obj,null); } protected void invoke(Collection.Key name, Object obj, Struct data) { if(eventType!=null && !eventType.equals(name)) return; //print.e(name); Component caller = CommonUtil.toComponent(obj,null); Component c=allEvents?component:caller; if(c==null) return; if(!allEvents &&!caller.getPageSource().equals(component.getPageSource())) return; invoke(name, c, data, allEvents?obj:null); } public static void invoke(Key name, Component cfc, Struct data, Object arg) { if(cfc==null) return; try { PageContext pc = ThreadLocalPageContext.get(); Object[] args; if(data==null) { args=arg!=null?new Object[]{arg}:new Object[]{}; } else { args=arg!=null?new Object[]{arg,data}:new Object[]{data}; } cfc.call(pc, name, args); } catch (PageException pe) { throw new PageRuntimeException(pe); } } public static boolean hasEventType(Component cfc, Collection.Key eventType) { return cfc.get(eventType,null) instanceof UDF; } }