Project

General

Profile

Download (6.3 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.logging.log4j.LogManager;import org.apache.logging.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 = LogManager.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
    private CdmDataChangeEvent(
62
            CdmBase entity,
63
            Serializable id,
64
            Object[] state,
65
            Object[] oldState,
66
            EntityPersister persister,
67
            EventSource source,
68
            EventType eventType
69
            ) {
70
        super(source);
71
        this.entity = entity;
72
        this.id = id;
73
        this.state = state;
74
        this.oldState = oldState;
75
        this.persister = persister;
76
        this.eventType = eventType;
77
        this.affectedObjects = null;
78
    }
79
    /**
80
     * @param source
81
     */
82
    private CdmDataChangeEvent(
83
            CdmBase entity,
84
            Set<CdmBase> affectedObjects,
85
            EventType eventType
86
            ) {
87
        super(null);
88
        this.entity = entity;
89
        this.persister = null;
90
        this.affectedObjects = affectedObjects;
91
        this.state = null;
92
        this.oldState = null;
93
        this.id = null;
94
        this.eventType = eventType;
95
    }
96

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

    
116
    public Set<CdmBase> getAffectedObjects() {
117
        return affectedObjects;
118
    }
119

    
120
    public EventType getEventType(){
121
        return eventType;
122
    }
123

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

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

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

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

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

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

    
201
        return mediationEvent;
202
    }
203

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

    
206
        return new CdmDataChangeEvent(entity, affectedObjects, eventType);
207
    }
208

    
209
}
(2-2/21)