Project

General

Profile

Download (6.31 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
//$Id$
27
/**
28
 * The CrudEvent unifies all CRUD events into one interface.
29
 * Crud as in Create, Retrieve, Update, Delete. This event will only hold CdmBase objects.
30
 *
31
 *
32
 * @author n.hoffmann
33
 * @created 24.03.2009
34
 * @version 1.0
35
 */
36
public class CdmDataChangeEvent extends AbstractEvent{
37
    private static final long serialVersionUID = 9113025682352080372L;
38
    private static final Logger logger = Logger.getLogger(CdmDataChangeEvent.class);
39

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

    
51
    private final CdmBase entity;
52
    private final EntityPersister persister;
53
    private final Set<CdmBase> affectedObjects;
54

    
55

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

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

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

    
120
    public Set<CdmBase> getAffectedObjects() {
121
        return affectedObjects;
122
    }
123

    
124
    public EventType getEventType(){
125
        return eventType;
126
    }
127

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

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

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

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

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

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

    
205
        return mediationEvent;
206
    }
207

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

    
210
        return new CdmDataChangeEvent(entity, affectedObjects, eventType);
211
    }
212

    
213
}
(2-2/17)