001 package railo.runtime.orm.hibernate.event; 002 003 import java.io.Serializable; 004 005 import org.hibernate.EmptyInterceptor; 006 import org.hibernate.type.Type; 007 008 import railo.runtime.Component; 009 import railo.runtime.exp.PageException; 010 import railo.runtime.op.Caster; 011 import railo.runtime.op.Operator; 012 import railo.runtime.orm.ORMUtil; 013 import railo.runtime.orm.hibernate.HibernateCaster; 014 import railo.runtime.type.Collection; 015 import railo.runtime.type.KeyImpl; 016 import railo.runtime.type.Struct; 017 import railo.runtime.type.StructImpl; 018 019 public class InterceptorImpl extends EmptyInterceptor { 020 021 private static final long serialVersionUID = 7992972603422833660L; 022 023 private final AllEventListener listener; 024 private final boolean hasPreInsert; 025 private final boolean hasPreUpdate; 026 027 public InterceptorImpl(AllEventListener listener) { 028 this.listener=listener; 029 if(listener!=null) { 030 Component cfc = listener.getCFC(); 031 hasPreInsert=EventListener.hasEventType(cfc, EventListener.PRE_INSERT); 032 hasPreUpdate=EventListener.hasEventType(cfc, EventListener.PRE_UPDATE); 033 } 034 else { 035 hasPreInsert=false; 036 hasPreUpdate=false; 037 } 038 } 039 040 @Override 041 public boolean onSave(Object entity, Serializable id, Object[] state, 042 String[] propertyNames, Type[] types) { 043 044 return on(entity, id, state, null, propertyNames, types, EventListener.PRE_INSERT, hasPreInsert); 045 //return super.onSave(entity, id, state, propertyNames, types); 046 } 047 048 @Override 049 public boolean onFlushDirty(Object entity, Serializable id, 050 Object[] currentState, Object[] previousState, 051 String[] propertyNames, Type[] types) { 052 return on(entity, id, currentState, toStruct(propertyNames, previousState), propertyNames, types, EventListener.PRE_UPDATE, hasPreUpdate); 053 //return super.onFlushDirty(entity, id, currentState, previousState, propertyNames, types); 054 } 055 056 057 private boolean on(Object entity, Serializable id, 058 Object[] state, Struct data, 059 String[] propertyNames, Type[] types, Collection.Key eventType, boolean hasMethod) { 060 061 Component cfc = Caster.toComponent(entity,null); 062 if(cfc!=null && EventListener.hasEventType(cfc, eventType)){ 063 EventListener.invoke(eventType, cfc, data, null); 064 } 065 if(hasMethod) 066 EventListener.invoke(eventType, listener.getCFC(), data, entity); 067 068 069 boolean rtn=false; 070 String prop; 071 Object before,current; 072 /* jira2049 073 ORMSession session = null; 074 try { 075 session=ORMUtil.getSession(ThreadLocalPageContext.get()); 076 } catch (PageException pe) {}*/ 077 078 for(int i = 0; i < propertyNames.length; i++) { 079 prop = propertyNames[i]; 080 before = state[i]; 081 current = ORMUtil.getPropertyValue(/* jira2049 session,*/cfc, prop,null); 082 083 if(before != current && (current == null || !Operator.equalsComplexEL(before, current, false,true))) { 084 try { 085 state[i] = HibernateCaster.toSQL(null, types[i], current,null); 086 } catch (PageException e) { 087 state[i] = current; 088 } 089 rtn = true; 090 } 091 } 092 return rtn; 093 } 094 095 096 097 098 099 100 private static Struct toStruct(String propertyNames[], Object state[]) { 101 Struct sct = new StructImpl(); 102 if(state!=null && propertyNames!=null){ 103 for(int i = 0; i < propertyNames.length; i++) { 104 sct.setEL(KeyImpl.init(propertyNames[i]), state[i]); 105 } 106 } 107 return sct; 108 } 109 }