1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 package edu.internet2.middleware.grouper;
34 import java.io.Serializable;
35 import java.util.Set;
36
37 import org.hibernate.CallbackException;
38 import org.hibernate.Session;
39 import org.hibernate.classic.Lifecycle;
40
41 import edu.internet2.middleware.grouper.annotations.GrouperIgnoreDbVersion;
42 import edu.internet2.middleware.grouper.annotations.GrouperIgnoreFieldConstant;
43 import edu.internet2.middleware.grouper.cfg.GrouperConfig;
44 import edu.internet2.middleware.grouper.hibernate.GrouperContext;
45 import edu.internet2.middleware.grouper.hibernate.HibGrouperLifecycle;
46 import edu.internet2.middleware.grouper.hibernate.HibernateSession;
47 import edu.internet2.middleware.grouper.misc.GrouperCloneable;
48 import edu.internet2.middleware.grouper.misc.GrouperHasContext;
49 import edu.internet2.middleware.grouper.util.GrouperUtil;
50 import edu.internet2.middleware.grouper.util.GrouperUtil.FieldValuable;
51
52
53
54
55
56
57
58
59
60 @SuppressWarnings("serial")
61 public abstract class GrouperAPI implements FieldValuable, Serializable, HibGrouperLifecycle, Lifecycle, GrouperCloneable {
62
63
64
65
66 public static final long INITIAL_VERSION_NUMBER = -1L;
67
68
69
70 public static final String COLUMN_HIBERNATE_VERSION_NUMBER = "hibernate_version_number";
71
72
73
74 @GrouperIgnoreDbVersion
75 @GrouperIgnoreFieldConstant
76 protected Object dbVersion = null;
77
78
79 public static final String FIELD_DB_VERSION = "dbVersion";
80
81
82
83
84
85
86
87 public Object fieldValue(String fieldName) {
88
89 return GrouperUtil.fieldValue(null, this, fieldName, true, true, false);
90 }
91
92
93
94
95
96 public Object dbVersion() {
97 return this.dbVersion;
98 }
99
100
101
102
103
104 public boolean dbVersionIsDifferent() {
105 Set<String> differentFields = dbVersionDifferentFields();
106 return differentFields.size() > 0;
107 }
108
109
110
111
112
113
114 public Set<String> dbVersionDifferentFields() {
115 throw new RuntimeException("Not implemented");
116 }
117
118
119
120
121 public void dbVersionReset() {
122 }
123
124
125
126
127 public void dbVersionClear() {
128 this.dbVersion = null;
129 }
130
131
132
133
134 public boolean onDelete(Session s) throws CallbackException {
135 return Lifecycle.NO_VETO;
136 }
137
138
139
140
141
142 public void onLoad(Session s, Serializable id) {
143 this.dbVersionReset();
144 }
145
146
147
148
149
150 public void onPostDelete(HibernateSession hibernateSession) {
151 }
152
153
154
155
156
157 public void onPostSave(HibernateSession hibernateSession) {
158 if (GrouperConfig.retrieveConfig().propertyValueBoolean("resetOnPostSave", true)) {
159 this.dbVersionReset();
160 }
161 }
162
163
164
165
166
167 public void onPostUpdate(HibernateSession hibernateSession) {
168 if (GrouperConfig.retrieveConfig().propertyValueBoolean("resetOnPostUpdate", true)) {
169 this.dbVersionReset();
170 }
171 }
172
173
174
175
176
177 public void onPreDelete(HibernateSession hibernateSession) {
178
179 if (this instanceof GrouperHasContext) {
180 ((GrouperHasContext)this).setContextId(GrouperContext.retrieveContextId(true));
181 }
182 }
183
184
185
186
187
188 public void onPreSave(HibernateSession hibernateSession) {
189 if (this instanceof GrouperHasContext) {
190 ((GrouperHasContext)this).setContextId(GrouperContext.retrieveContextId(true));
191 }
192 }
193
194
195
196
197
198 public void onPreUpdate(HibernateSession hibernateSession) {
199 if (this instanceof GrouperHasContext) {
200 ((GrouperHasContext)this).setContextId(GrouperContext.retrieveContextId(true));
201 }
202 }
203
204
205
206
207
208 public boolean onSave(Session s) throws CallbackException {
209 return Lifecycle.NO_VETO;
210 }
211
212
213
214
215
216 public boolean onUpdate(Session s) throws CallbackException {
217 return Lifecycle.NO_VETO;
218 }
219
220
221
222
223 @Override
224 public abstract GrouperAPI clone();
225
226
227
228
229 @GrouperIgnoreDbVersion @GrouperIgnoreFieldConstant
230 private Long hibernateVersionNumber = INITIAL_VERSION_NUMBER;
231
232
233 public static final String FIELD_HIBERNATE_VERSION_NUMBER = "hibernateVersionNumber";
234
235
236
237
238
239 public Long getHibernateVersionNumber() {
240 return this.hibernateVersionNumber;
241 }
242
243
244
245
246
247 public void setHibernateVersionNumber(Long hibernateVersionNumber) {
248
249
250 hibernateVersionNumber = hibernateVersionNumber == null ? 0 : hibernateVersionNumber;
251
252 this.hibernateVersionNumber = hibernateVersionNumber;
253
254 }
255
256 }
257