001: /*
002: * Copyright (c) 2001-2004 Caucho Technology, Inc. All rights reserved.
003: *
004: * The Apache Software License, Version 1.1
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, if
019: * any, must include the following acknowlegement:
020: * "This product includes software developed by the
021: * Caucho Technology (http://www.caucho.com/)."
022: * Alternately, this acknowlegement may appear in the software itself,
023: * if and wherever such third-party acknowlegements normally appear.
024: *
025: * 4. The names "Hessian", "Resin", and "Caucho" must not be used to
026: * endorse or promote products derived from this software without prior
027: * written permission. For written permission, please contact
028: * info@caucho.com.
029: *
030: * 5. Products derived from this software may not be called "Resin"
031: * nor may "Resin" appear in their names without prior written
032: * permission of Caucho Technology.
033: *
034: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
035: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
036: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
037: * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS
038: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
039: * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
040: * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
041: * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
042: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
043: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
044: * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
045: *
046: * @author Scott Ferguson
047: */
048:
049: package com.caucho.hessian.io;
050:
051: import java.io.IOException;
052: import java.util.HashMap;
053:
054: /**
055: * Deserializing a JDK 1.2 Class.
056: */
057: public class ClassDeserializer extends AbstractMapDeserializer {
058: private static final HashMap<String, Class> _primClasses = new HashMap<String, Class>();
059:
060: public ClassDeserializer() {
061: }
062:
063: public Class getType() {
064: return Class.class;
065: }
066:
067: public Object readMap(AbstractHessianInput in) throws IOException {
068: int ref = in.addRef(null);
069:
070: String name = null;
071:
072: while (!in.isEnd()) {
073: String key = in.readString();
074:
075: if (key.equals("name"))
076: name = in.readString();
077: else
078: in.readObject();
079: }
080:
081: in.readMapEnd();
082:
083: Object value = create(name);
084:
085: in.setRef(ref, value);
086:
087: return value;
088: }
089:
090: public Object readObject(AbstractHessianInput in,
091: String[] fieldNames) throws IOException {
092: int ref = in.addRef(null);
093:
094: String name = null;
095:
096: for (int i = 0; i < fieldNames.length; i++) {
097: if ("name".equals(fieldNames[i]))
098: name = in.readString();
099: else
100: in.readObject();
101: }
102:
103: Object value = create(name);
104:
105: in.setRef(ref, value);
106:
107: return value;
108: }
109:
110: Object create(String name) throws IOException {
111: if (name == null)
112: throw new IOException("Serialized Class expects name.");
113:
114: Class cl = _primClasses.get(name);
115:
116: if (cl != null)
117: return cl;
118:
119: ClassLoader loader = Thread.currentThread()
120: .getContextClassLoader();
121:
122: try {
123: if (loader != null)
124: return Class.forName(name, false, loader);
125: else
126: return Class.forName(name);
127: } catch (Exception e) {
128: throw new IOExceptionWrapper(e);
129: }
130: }
131:
132: static {
133: _primClasses.put("void", void.class);
134: _primClasses.put("boolean", boolean.class);
135: _primClasses.put("java.lang.Boolean", Boolean.class);
136: _primClasses.put("byte", byte.class);
137: _primClasses.put("java.lang.Byte", Byte.class);
138: _primClasses.put("char", char.class);
139: _primClasses.put("java.lang.Character", Character.class);
140: _primClasses.put("short", short.class);
141: _primClasses.put("java.lang.Short", Short.class);
142: _primClasses.put("int", int.class);
143: _primClasses.put("java.lang.Integer", Integer.class);
144: _primClasses.put("long", long.class);
145: _primClasses.put("java.lang.Long", Long.class);
146: _primClasses.put("float", float.class);
147: _primClasses.put("java.lang.Float", Float.class);
148: _primClasses.put("double", double.class);
149: _primClasses.put("java.lang.Double", Double.class);
150: _primClasses.put("java.lang.String", String.class);
151: }
152: }
|