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    }