View Javadoc
1   /**
2    * Copyright 2014 Internet2
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *   http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  /*
17    Copyright (C) 2007 University Corporation for Advanced Internet Development, Inc.
18    Copyright (C) 2007 The University Of Chicago
19  
20    Licensed under the Apache License, Version 2.0 (the "License");
21    you may not use this file except in compliance with the License.
22    You may obtain a copy of the License at
23  
24      http://www.apache.org/licenses/LICENSE-2.0
25  
26    Unless required by applicable law or agreed to in writing, software
27    distributed under the License is distributed on an "AS IS" BASIS,
28    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29    See the License for the specific language governing permissions and
30    limitations under the License.
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   * Base Grouper API class.
55   * <p/>
56   * @author  blair christensen.
57   * @version $Id: GrouperAPI.java,v 1.23 2009-11-01 14:57:22 mchyzer Exp $
58   * @since   1.2.0
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    /** column */
70    public static final String COLUMN_HIBERNATE_VERSION_NUMBER = "hibernate_version_number";
71  
72    
73    /** save the state when retrieving from DB */
74    @GrouperIgnoreDbVersion
75    @GrouperIgnoreFieldConstant
76    protected Object dbVersion = null;
77  
78    /** field name for db version */
79    public static final String FIELD_DB_VERSION = "dbVersion";
80    
81    /**
82     * call this method to get the field value (e.g. from dbVersionDifferentFields).
83     * some objects have different interpretations (e.g. Group will process attribute__whatever)
84     * @param fieldName
85     * @return the value
86     */
87    public Object fieldValue(String fieldName) {
88      //dont consider field value since we are already in fieldValue
89      return GrouperUtil.fieldValue(null, this, fieldName, true, true, false);
90    }
91    
92    /**
93     * version of this object in the database
94     * @return the db version
95     */
96    public Object dbVersion() {
97      return this.dbVersion;
98    }
99  
100   /**
101    * see if the state of this object has changed compared to the DB state (last known)
102    * @return true if changed, false if not
103    */
104   public boolean dbVersionIsDifferent() {
105     Set<String> differentFields = dbVersionDifferentFields();
106     return differentFields.size() > 0;
107   }
108 
109   /**
110    * see which fields have changed compared to the DB state (last known)
111    * note that attributes will print out: attribute__attributeName
112    * @return a set of attributes changed, or empty set if none
113    */
114   public Set<String> dbVersionDifferentFields() {
115     throw new RuntimeException("Not implemented");
116   }
117 
118   /**
119    * take a snapshot of the data since this is what is in the db
120    */
121   public void dbVersionReset() {
122   }
123 
124   /**
125    * set to null (e.g. on delete)
126    */
127   public void dbVersionClear() {
128     this.dbVersion = null;
129   }
130 
131   /**
132    * @see org.hibernate.classic.Lifecycle#onDelete(org.hibernate.Session)
133    */
134   public boolean onDelete(Session s) throws CallbackException {
135     return Lifecycle.NO_VETO;
136   }
137 
138 
139   /**
140    * @see org.hibernate.classic.Lifecycle#onLoad(org.hibernate.Session, java.io.Serializable)
141    */
142   public void onLoad(Session s, Serializable id) {
143     this.dbVersionReset();
144   }
145 
146 
147   /**
148    * @see edu.internet2.middleware.grouper.hibernate.HibGrouperLifecycle#onPostDelete(edu.internet2.middleware.grouper.hibernate.HibernateSession)
149    */
150   public void onPostDelete(HibernateSession hibernateSession) {
151   }
152 
153 
154   /**
155    * @see edu.internet2.middleware.grouper.hibernate.HibGrouperLifecycle#onPostSave(edu.internet2.middleware.grouper.hibernate.HibernateSession)
156    */
157   public void onPostSave(HibernateSession hibernateSession) {
158     if (GrouperConfig.retrieveConfig().propertyValueBoolean("resetOnPostSave", true)) {
159       this.dbVersionReset();
160     }
161   }
162 
163 
164   /**
165    * @see edu.internet2.middleware.grouper.hibernate.HibGrouperLifecycle#onPostUpdate(edu.internet2.middleware.grouper.hibernate.HibernateSession)
166    */
167   public void onPostUpdate(HibernateSession hibernateSession) {
168     if (GrouperConfig.retrieveConfig().propertyValueBoolean("resetOnPostUpdate", true)) {
169       this.dbVersionReset();
170     }
171   }
172 
173 
174   /**
175    * @see edu.internet2.middleware.grouper.hibernate.HibGrouperLifecycle#onPreDelete(edu.internet2.middleware.grouper.hibernate.HibernateSession)
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    * @see edu.internet2.middleware.grouper.hibernate.HibGrouperLifecycle#onPreSave(edu.internet2.middleware.grouper.hibernate.HibernateSession)
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    * @see edu.internet2.middleware.grouper.hibernate.HibGrouperLifecycle#onPreUpdate(edu.internet2.middleware.grouper.hibernate.HibernateSession)
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    * @see org.hibernate.classic.Lifecycle#onSave(org.hibernate.Session)
207    */
208   public boolean onSave(Session s) throws CallbackException {
209     return Lifecycle.NO_VETO;
210   }
211 
212 
213   /**
214    * @see org.hibernate.classic.Lifecycle#onUpdate(org.hibernate.Session)
215    */
216   public boolean onUpdate(Session s) throws CallbackException {
217     return Lifecycle.NO_VETO;
218   } 
219 
220   /**
221    * deep clone the fields in this object
222    */
223   @Override
224   public abstract GrouperAPI clone();
225 
226   /**
227    * hibernate increments with each insert/update (-1 means insert, 0+ means update, null means 0)
228    */
229   @GrouperIgnoreDbVersion @GrouperIgnoreFieldConstant
230   private Long hibernateVersionNumber = INITIAL_VERSION_NUMBER;
231 
232   /** constant name of field (and javabean property) for hibernateVersion */
233   public static final String FIELD_HIBERNATE_VERSION_NUMBER = "hibernateVersionNumber";
234   
235   /**
236    * hibernate increments with each insert/update (-1 means insert, 0+ means update, null means 0)
237    * @return the hibernateVersion
238    */
239   public Long getHibernateVersionNumber() {
240     return this.hibernateVersionNumber;
241   }
242 
243   /**
244    * hibernate increments with each insert/update (-1 means insert, 0+ means update, null means 0)
245    * @param hibernateVersionNumber the hibernateVersion to set
246    */
247   public void setHibernateVersionNumber(Long hibernateVersionNumber) {
248     
249     //no nulls, set to 0
250     hibernateVersionNumber = hibernateVersionNumber == null ? 0 : hibernateVersionNumber;
251     
252     this.hibernateVersionNumber = hibernateVersionNumber;
253     
254   }
255 
256 } 
257