001: /*
002: * $Id: AnyAbstractClass.java,v 1.11 2002/09/16 08:05:02 jkl Exp $
003: *
004: * Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
005: *
006: * Use is subject to license terms, as defined in
007: * Anvil Sofware License, Version 1.1. See LICENSE
008: * file, or http://njet.org/license-1.1.txt
009: */
010: package anvil.core;
011:
012: import anvil.script.Context;
013: import anvil.script.Type;
014: import anvil.script.Function;
015: import anvil.script.Module;
016: import anvil.server.Address;
017: import anvil.java.util.BindingEnumeration;
018: import java.lang.reflect.Method;
019: import java.lang.reflect.Modifier;
020: import java.lang.reflect.Modifier;
021: import java.io.ByteArrayInputStream;
022: import java.io.ByteArrayOutputStream;
023: import java.io.InvalidClassException;
024: import java.io.IOException;
025: import java.io.NotSerializableException;
026: import java.io.ObjectInputStream;
027: import java.io.ObjectOutputStream;
028: import java.io.OptionalDataException;
029: import java.io.OutputStream;
030: import java.io.StreamCorruptedException;
031: import java.io.Writer;
032:
033: /**
034: * class AnyAbstractClass
035: *
036: * @author Jani Lehtimäki
037: * @version $Revision: 1.11 $
038: */
039: public abstract class AnyAbstractClass extends Any {
040:
041: public int typeOf() {
042: return IS_CLASS;
043: }
044:
045: public boolean isMutable() {
046: return true;
047: }
048:
049: public boolean isClass() {
050: return true;
051: }
052:
053: public abstract anvil.script.ClassType classOf();
054:
055: public Object clone() {
056: return this ;
057: }
058:
059: public Any copy() {
060: return this ;
061: }
062:
063: public boolean toBoolean() {
064: return true;
065: }
066:
067: public Object toObject() {
068: return null;
069: }
070:
071: public String toString() {
072: return classNameOf() + '(' + toObject() + ')';
073: }
074:
075: public AnyClass toClass() {
076: return null;
077: }
078:
079: public int hashCode() {
080: return System.identityHashCode(this );
081: }
082:
083: public void serialize(Serializer serializer) throws IOException {
084: serializer.write('x');
085: serializer.write(getClass().getName());
086: doSerialize(serializer);
087: }
088:
089: public void doSerialize(Serializer serializer) throws IOException {
090: serializeObject(serializer, toObject());
091: }
092:
093: public static Any unserialize(Unserializer unserializer)
094: throws UnserializationException {
095: unserializer.consume('s');
096: String classname = unserializer.getUTF16String();
097: Any rv = null;
098: try {
099: Class cls = Class.forName(classname);
100: Method method = cls.getDeclaredMethod("unserialize",
101: new Class[] { Unserializer.class });
102: if (method != null) {
103: int mod = method.getModifiers();
104: if (Modifier.isStatic(mod) && Modifier.isPublic(mod)) {
105: rv = (Any) method.invoke(null,
106: new Object[] { unserializer });
107: }
108: }
109: } catch (NoSuchMethodException e) {
110: } catch (SecurityException e) {
111: } catch (Throwable t) {
112: throw new UnserializationException(t.toString());
113: }
114: if (rv == null) {
115: rv = Any.create(unserializeObject(unserializer));
116: }
117: if (rv == null) {
118: throw new UnserializationException();
119: }
120: return rv;
121: }
122:
123: public static Object unserializeObject(Unserializer unserializer)
124: throws UnserializationException {
125: try {
126: int size = (int) unserializer.getLong();
127: ByteArrayInputStream byteInput = new ByteArrayInputStream(
128: unserializer._data, unserializer._pos, size);
129: ObjectInputStream objectInput = new ObjectInputStream(
130: byteInput);
131: Object object = objectInput.readObject();
132: byteInput.close();
133: unserializer._pos += size;
134: byte[] data = unserializer._data;
135: if (unserializer._pos >= data.length + 1) {
136: throw new UnserializationException();
137: }
138: return object;
139:
140: } catch (OptionalDataException e) {
141: throw new UnserializationException(e.toString());
142: } catch (StreamCorruptedException e) {
143: throw new UnserializationException(e.toString());
144: } catch (InvalidClassException e) {
145: throw new UnserializationException(e.toString());
146: } catch (ClassNotFoundException e) {
147: throw new UnserializationException(e.toString());
148: } catch (IOException e) {
149: throw new UnserializationException(e.toString());
150: }
151: }
152:
153: public static void serializeObject(Serializer serializer,
154: Object object) throws IOException {
155: try {
156:
157: ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
158: ObjectOutputStream objectOutput = new ObjectOutputStream(
159: byteOutputStream);
160: objectOutput.writeObject(object);
161: objectOutput.flush();
162: byteOutputStream.close();
163: serializer.write(byteOutputStream.size());
164: serializer.write(':');
165: byteOutputStream.writeTo(serializer.getOutput());
166: } catch (InvalidClassException e) {
167: throw new IOException("Object not serializable: "
168: + e.getMessage());
169: } catch (NotSerializableException e) {
170: throw new IOException("Object not serializable: "
171: + e.getMessage());
172: }
173: }
174:
175: }
|