Project

General

Profile

Download (6.28 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 */
9

    
10
package eu.etaxonomy.cdm.persistence.hibernate;
11

    
12
import java.io.Serializable;
13
import java.util.Set;
14

    
15
import org.apache.log4j.Logger;
16
import org.hibernate.event.spi.AbstractEvent;
17
import org.hibernate.event.spi.EventSource;
18
import org.hibernate.event.spi.PostDeleteEvent;
19
import org.hibernate.event.spi.PostInsertEvent;
20
import org.hibernate.event.spi.PostLoadEvent;
21
import org.hibernate.event.spi.PostUpdateEvent;
22
import org.hibernate.persister.entity.EntityPersister;
23

    
24
import eu.etaxonomy.cdm.model.common.CdmBase;
25

    
26
/**
27
 * The CrudEvent unifies all CRUD events into one interface.
28
 * Crud as in Create, Retrieve, Update, Delete. This event will only hold CdmBase objects.
29
 *
30
 *
31
 * @author n.hoffmann
32
 * @since 24.03.2009
33
 */
34
public class CdmDataChangeEvent extends AbstractEvent{
35
    private static final long serialVersionUID = 9113025682352080372L;
36
    private static final Logger logger = Logger.getLogger(CdmDataChangeEvent.class);
37

    
38
    /**
39
     * The event types currently implemented
40
     *
41
     * @author n.hoffmann
42
     * @since 25.03.2009
43
     * @version 1.0
44
     */
45
    public enum EventType {
46
        INSERT, LOAD, UPDATE, DELETE
47
    }
48

    
49
    private final CdmBase entity;
50
    private final EntityPersister persister;
51
    private final Set<CdmBase> affectedObjects;
52

    
53

    
54
    private final Object[] state;
55
    // for update only
56
    private Object[] oldState;
57
    private final Serializable id;
58
    protected final EventType eventType;
59

    
60
    /**
61
     * @param source
62
     */
63
    private CdmDataChangeEvent(
64
            CdmBase entity,
65
            Serializable id,
66
            Object[] state,
67
            Object[] oldState,
68
            EntityPersister persister,
69
            EventSource source,
70
            EventType eventType
71
            ) {
72
        super(source);
73
        this.entity = entity;
74
        this.id = id;
75
        this.state = state;
76
        this.oldState = oldState;
77
        this.persister = persister;
78
        this.eventType = eventType;
79
        this.affectedObjects = null;
80
    }
81
    /**
82
     * @param source
83
     */
84
    private CdmDataChangeEvent(
85
            CdmBase entity,
86
            Set<CdmBase> affectedObjects,
87
            EventType eventType
88
            ) {
89
        super(null);
90
        this.entity = entity;
91
        this.persister = null;
92
        this.affectedObjects = affectedObjects;
93
        this.state = null;
94
        this.oldState = null;
95
        this.id = null;
96
        this.eventType = eventType;
97
    }
98

    
99
    public CdmBase getEntity() {
100
        return entity;
101
    }
102
    public Serializable getId() {
103
        return id;
104
    }
105
    public EntityPersister getPersister() {
106
        return persister;
107
    }
108
    public Object[] getState() {
109
        return state;
110
    }
111
    public Object[] getOldState() {
112
        if(oldState == null){
113
            oldState = state;
114
        }
115
        return oldState;
116
    }
117

    
118
    public Set<CdmBase> getAffectedObjects() {
119
        return affectedObjects;
120
    }
121

    
122
    public EventType getEventType(){
123
        return eventType;
124
    }
125

    
126
    public boolean isInsert(){
127
        return eventType == EventType.INSERT;
128
    }
129

    
130
    public boolean isLoad(){
131
        return eventType == EventType.LOAD;
132
    }
133

    
134
    public boolean isUpdate(){
135
        return eventType == EventType.UPDATE;
136
    }
137

    
138
    public boolean isDelete(){
139
        return eventType == EventType.DELETE;
140
    }
141

    
142
    /**
143
     * @param event
144
     * @return
145
     */
146
    public static CdmDataChangeEvent NewInstance(AbstractEvent event) {
147

    
148
        CdmDataChangeEvent mediationEvent = null;
149
        try{
150
            if(event instanceof PostInsertEvent){
151
                PostInsertEvent postEvent = (PostInsertEvent) event;
152
                mediationEvent = new CdmDataChangeEvent(
153
                        (CdmBase)postEvent.getEntity(),
154
                        postEvent.getId(),
155
                        postEvent.getState(),
156
                        null,
157
                        postEvent.getPersister(),
158
                        postEvent.getSession(),
159
                        EventType.INSERT
160
                        );
161
            }
162
            if(event instanceof PostLoadEvent){
163
                PostLoadEvent updateEvent = (PostLoadEvent) event;
164
                mediationEvent = new CdmDataChangeEvent(
165
                        (CdmBase)updateEvent.getEntity(),
166
                        updateEvent.getId(),
167
                        null,
168
                        null,
169
                        updateEvent.getPersister(),
170
                        updateEvent.getSession(),
171
                        EventType.LOAD
172
                        );
173
            }
174
            if(event instanceof PostUpdateEvent){
175
                PostUpdateEvent updateEvent = (PostUpdateEvent) event;
176
                mediationEvent = new CdmDataChangeEvent(
177
                        (CdmBase)updateEvent.getEntity(),
178
                        updateEvent.getId(),
179
                        updateEvent.getState(),
180
                        updateEvent.getOldState(),
181
                        updateEvent.getPersister(),
182
                        updateEvent.getSession(),
183
                        EventType.UPDATE
184
                        );
185
            }
186
            if(event instanceof PostDeleteEvent){
187
                PostDeleteEvent deleteEvent = (PostDeleteEvent) event;
188
                mediationEvent = new CdmDataChangeEvent(
189
                        (CdmBase)deleteEvent.getEntity(),
190
                        deleteEvent.getId(),
191
                        deleteEvent.getDeletedState(),
192
                        null,
193
                        deleteEvent.getPersister(),
194
                        deleteEvent.getSession(),
195
                        EventType.DELETE
196
                        );
197
            }
198
        }catch(ClassCastException e){
199
            // we are only interested in CdmBase entities, we have the try/catch block in case another entity slips through
200
            logger.warn("tried to instantiate event for non CdmBase entity");
201
        }
202

    
203
        return mediationEvent;
204
    }
205

    
206
    public static CdmDataChangeEvent NewInstance(CdmBase entity, Set<CdmBase> affectedObjects, EventType eventType) {
207

    
208
        return new CdmDataChangeEvent(entity, affectedObjects, eventType);
209
    }
210

    
211
}
(2-2/21)