001: /* ====================================================================
002: * The Jcorporate Apache Style Software License, Version 1.2 05-07-2002
003: *
004: * Copyright (c) 1995-2002 Jcorporate Ltd. All rights reserved.
005: *
006: * Redistribution and use in source and binary forms, with or without
007: * modification, are permitted provided that the following conditions
008: * are met:
009: *
010: * 1. Redistributions of source code must retain the above copyright
011: * notice, this list of conditions and the following disclaimer.
012: *
013: * 2. Redistributions in binary form must reproduce the above copyright
014: * notice, this list of conditions and the following disclaimer in
015: * the documentation and/or other materials provided with the
016: * distribution.
017: *
018: * 3. The end-user documentation included with the redistribution,
019: * if any, must include the following acknowledgment:
020: * "This product includes software developed by Jcorporate Ltd.
021: * (http://www.jcorporate.com/)."
022: * Alternately, this acknowledgment may appear in the software itself,
023: * if and wherever such third-party acknowledgments normally appear.
024: *
025: * 4. "Jcorporate" and product names such as "Expresso" must
026: * not be used to endorse or promote products derived from this
027: * software without prior written permission. For written permission,
028: * please contact info@jcorporate.com.
029: *
030: * 5. Products derived from this software may not be called "Expresso",
031: * or other Jcorporate product names; nor may "Expresso" or other
032: * Jcorporate product names appear in their name, without prior
033: * written permission of Jcorporate Ltd.
034: *
035: * 6. No product derived from this software may compete in the same
036: * market space, i.e. framework, without prior written permission
037: * of Jcorporate Ltd. For written permission, please contact
038: * partners@jcorporate.com.
039: *
040: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
041: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
042: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
043: * DISCLAIMED. IN NO EVENT SHALL JCORPORATE LTD OR ITS CONTRIBUTORS
044: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
045: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
046: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
047: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
048: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
049: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
050: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
051: * SUCH DAMAGE.
052: * ====================================================================
053: *
054: * This software consists of voluntary contributions made by many
055: * individuals on behalf of the Jcorporate Ltd. Contributions back
056: * to the project(s) are encouraged when you make modifications.
057: * Please send them to support@jcorporate.com. For more information
058: * on Jcorporate Ltd. and its products, please see
059: * <http://www.jcorporate.com/>.
060: *
061: * Portions of this software are based upon other open source
062: * products and are subject to their respective licenses.
063: */
064:
065: package com.jcorporate.expresso.core.dataobjects;
066:
067: import java.io.Externalizable;
068: import java.io.IOException;
069: import java.util.HashMap;
070: import java.util.Map;
071:
072: /**
073: * Basic HashMap wrapper for the Data Transfer Object pattern. The goal of this
074: * class is to provide efficient serialization over the wire of DBOBjects and
075: * or the up and coming DataObjects. By encapsulating the 'data guts' of the
076: * data objects into this class, routing programs that don't have to know anything
077: * about a particular instance of a DBObject/DataObject don't have to have any
078: * large code base installed on them.
079: * <p>The other advantage of DataTransferObject is serialization size. On
080: * tests conducted 3/17/04, the size of com.jcorporate.expresso.services.dbobj.MimeTypes
081: * was 1310 bytes. The size of the same item converted into a DataTransfer
082: * object was 293 bytes. For in-memory serialization alone, this translates
083: * to twice as fast. For slower connections such as sockets, this speed translation
084: * will be more pronounced.</p>
085: *
086: * @author Michael Rimov
087: * @since Expresso 5.0
088: */
089:
090: public final class DataTransferObject implements Externalizable {
091: transient private static final String EMPTY_STRING = "";
092:
093: private java.util.HashMap tableFields = new HashMap();
094: private String dataContext;
095: private String objectClassName;
096:
097: public DataTransferObject() {
098: }
099:
100: /**
101: * Optimized Deserialization
102: *
103: * @param ois The Object Input object
104: * @throws java.lang.ClassNotFoundException
105: * for reading subobjects
106: * @throws IOException upon I/O error
107: */
108: public void readExternal(java.io.ObjectInput ois)
109: throws ClassNotFoundException, IOException {
110: tableFields = (HashMap) ois.readObject();
111: dataContext = ois.readUTF();
112: objectClassName = ois.readUTF();
113: }
114:
115: /**
116: * Optimized Serialization implementation that does not utilize any
117: * reflection
118: *
119: * @param oos The Object Output Stream
120: */
121: public void writeExternal(java.io.ObjectOutput oos)
122: throws IOException {
123: oos.writeObject(tableFields);
124: if (dataContext == null) {
125: oos.writeUTF(EMPTY_STRING);
126: } else {
127: oos.writeUTF(dataContext);
128: }
129:
130: if (objectClassName == null) {
131: oos.writeUTF(EMPTY_STRING);
132: } else {
133: oos.writeUTF(objectClassName);
134: }
135:
136: }
137:
138: /**
139: * Sets the data fields in bulk. Does not perform a data copy
140: * unless the passed in type is not a HashMap
141: *
142: * @param tableFields the new set of table fields to use
143: */
144: public void setTableFields(Map tableFields) {
145: if (tableFields instanceof HashMap) {
146: this .tableFields = (HashMap) tableFields;
147: } else {
148: this .tableFields = new HashMap(tableFields);
149: }
150: }
151:
152: /**
153: * Gets the table fields in bulk
154: *
155: * @return java.util.HashMap
156: */
157: public java.util.Map getTableFields() {
158: return tableFields;
159: }
160:
161: /**
162: * @param dataContext The new data context to use
163: */
164: public void setDataContext(String dataContext) {
165: this .dataContext = dataContext;
166: }
167:
168: /**
169: * @return the currently set data context.
170: */
171: public String getDataContext() {
172: return dataContext;
173: }
174:
175: /**
176: * Sets the classname of the DataObject we're attached to so that we can
177: * instantiate it at the far end of the wire.
178: *
179: * @param objectClassName the full classname
180: */
181: public void setObjectClassName(String objectClassName) {
182: this .objectClassName = objectClassName;
183: }
184:
185: public String getObjectClassName() {
186: return objectClassName;
187: }
188:
189: }
|