1 /*
2 * The SmartWeb Framework
3 * Copyright (C) 2004-2006
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 *
19 * For further informations on the SmartWeb Framework please visit
20 *
21 * http://smartweb.sourceforge.net
22 */
23 package net.smartlab.web;
24
25 import java.io.IOException;
26 import java.io.ObjectInputStream;
27 import java.lang.reflect.Field;
28
29 import org.apache.commons.logging.Log;
30 import org.apache.commons.logging.LogFactory;
31
32 /**
33 * TODO documentation
34 *
35 * @author rlogiacco
36 * @uml.dependency supplier="net.smartlab.web.Enumeration"
37 * @uml.dependency supplier="net.smartlab.web.StringEnumeration"
38 */
39 public abstract class BusinessObject implements DataTransferObject {
40
41 private final static long serialVersionUID = 8960870409825593855L;
42
43 /**
44 * Allows for business operations logging.
45 */
46 protected final transient Log logger = LogFactory.getLog(this.getClass());
47
48 /**
49 * This number stores the object version and is used for optimistical
50 * locking.
51 *
52 * @uml.property name="version"
53 */
54 private long version;
55
56
57 /**
58 * Returns the object version. This property ensures optimistical locking
59 * support to every subclass.
60 *
61 * @return returns the version.
62 * @hibernate.version
63 * @uml.property name="version"
64 */
65 public long getVersion() {
66 return version;
67 }
68
69 /**
70 * Sets the object version. This property ensures optimistical locking
71 * support to every subclass.
72 *
73 * @param version the version to set.
74 * @uml.property name="version"
75 */
76 public void setVersion(long version) {
77 this.version = version;
78 }
79
80 /**
81 * Custom deserialization. We need to re-initialize a logger instance as loggers
82 * can't be serialized.
83 */
84 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
85 try {
86 Class type = BusinessObject.class;
87 Field logger = type.getDeclaredField("logger");
88 logger.setAccessible(true);
89 logger.set(this, LogFactory.getLog(type));
90 logger.setAccessible(false);
91 } catch (Exception e) {
92 LogFactory.getLog(this.getClass())
93 .warn("unable to recover the logger after deserialization: logging statements will cause null pointer exceptions", e);
94 }
95 in.defaultReadObject();
96 }
97 }