1 package com.quadcap.sql.io; 2 3 40 41 import java.io.Externalizable ; 42 import java.io.InvalidClassException ; 43 import java.io.IOException ; 44 import java.io.ObjectInput ; 45 import java.io.ObjectOutput ; 46 47 import java.util.Hashtable ; 48 import java.util.Vector ; 49 50 import com.quadcap.util.Debug; 51 52 58 public class Extern { 59 static Extern[] classes = new Extern[256]; 60 static Hashtable classNames = new Hashtable (); 61 62 static void add(String name, int code, 63 ExternalizeProxy proxy) { 64 add(name, code, proxy, null); 65 } 66 67 public static void add(String name, int code, 68 ExternalizeProxy proxy, Object obj) 69 { 70 Extern ext = new Extern(name, code, proxy); 71 if (obj instanceof Externable) { 72 Class cl = obj.getClass(); 76 try { 77 if (cl.getDeclaredMethod("getExtern", new Class [0]) == null) { 78 throw new RuntimeException ("Not Externable: " + 79 cl.getName()); 80 } 81 } catch (NoSuchMethodException e) { 82 throw new RuntimeException ("Not Externable: " + 83 cl.getName()); 84 } 85 ((Externable)obj).setExtern(ext); 86 } 87 classes[code] = ext; 88 classNames.put(name, ext); 89 } 90 91 static void add(String name, int code) { 92 ExternalizeProxy p = null; 93 Object obj = null; 94 try { 95 Class c = Class.forName(name); 96 obj = c.newInstance(); 97 if (obj instanceof ExternalizeProxy) { 98 p = (ExternalizeProxy)obj; 99 } 100 } catch (Throwable t) { 101 Debug.println(t.toString()); 102 } 103 add(name, code, p, obj); 104 } 105 106 static { 107 add("com.quadcap.sql.Column", 1); 109 add("com.quadcap.sql.DatabaseRoot", 2); 110 add("com.quadcap.sql.file.LogEntry", 3); 111 add("com.quadcap.sql.types.TypeBinary", 4); 112 add("com.quadcap.sql.AddTable", 5); 113 add("com.quadcap.sql.Table", 6); 114 add("com.quadcap.sql.types.TypeInt", 7); 115 add("com.quadcap.sql.types.TypeVarChar", 8); 116 add("com.quadcap.sql.types.ValueType", 9); 117 add("com.quadcap.sql.QuantifiedCompare", 10); 118 add("com.quadcap.sql.PrimaryKeyConstraint", 11); 119 add("com.quadcap.sql.types.TypeBlob", 12); 120 add("com.quadcap.sql.InsertRow", 13); 121 add("com.quadcap.sql.AddIndexEntry", 14); 122 add("com.quadcap.sql.types.ValueInteger", 15); 123 add("com.quadcap.sql.types.ValueString", 16); 124 add("com.quadcap.sql.NotNullConstraint", 17); 125 add("com.quadcap.sql.types.TypeDecimal", 18); 126 add("com.quadcap.sql.UniqueConstraint", 19); 127 add("com.quadcap.sql.types.ValueNull", 20); 128 add("com.quadcap.sql.CheckConstraint", 21); 129 add("com.quadcap.sql.BinaryExpression", 22); 130 add("com.quadcap.sql.NameExpression", 23); 131 add("com.quadcap.sql.ValueExpression", 24); 132 add("com.quadcap.sql.DefaultTableConstraint", 25); 133 add("com.quadcap.sql.types.ValueBlob", 26); 134 add("com.quadcap.sql.View", 27); 135 add("com.quadcap.sql.StmtCreateView", 28); 136 add("com.quadcap.sql.SelectExpression", 29); 137 add("com.quadcap.sql.SelectFromTable", 30); 138 add("com.quadcap.sql.InsertBlob", 31); 139 add("com.quadcap.sql.DeleteIndexEntry", 32); 140 add("com.quadcap.sql.ExportedKeyConstraint", 33); 141 add("com.quadcap.sql.DeleteRow", 34); 142 add("com.quadcap.sql.types.ValueScaledInteger", 35); 143 add("com.quadcap.sql.types.TypeReal", 36); 144 add("com.quadcap.sql.types.ValueDouble", 37); 145 add("com.quadcap.sql.types.TypeVarBinary", 38); 146 add("com.quadcap.sql.types.ValueOctets", 39); 147 add("com.quadcap.sql.types.TypeChar", 40); 148 add("com.quadcap.sql.types.TypeSmallInt", 41); 149 add("com.quadcap.sql.DropTable", 42); 150 add("com.quadcap.sql.SelectItem", 43); 151 add("com.quadcap.sql.UnaryExpression", 44); 152 add("com.quadcap.sql.AutoNumberConstraint", 45); 153 add("com.quadcap.sql.InExpression", 46); 154 add("com.quadcap.sql.TernaryExpression", 47); 155 add("com.quadcap.sql.StmtNull", 48); 156 add("com.quadcap.sql.AggregateExpression", 49); 157 add("com.quadcap.sql.VectorExpression", 50); 158 add("com.quadcap.sql.types.TypeTime", 51); 159 add("com.quadcap.sql.types.TypeTimestamp", 52); 160 add("com.quadcap.sql.types.TypeDate", 53); 161 add("com.quadcap.sql.types.ValueDate", 54); 162 add("com.quadcap.sql.types.ValueTime", 55); 163 add("com.quadcap.sql.types.ValueTimestamp", 56); 164 add("com.quadcap.sql.types.ValueInterval", 57); 165 add("com.quadcap.sql.types.TypeInterval", 58); 166 add("com.quadcap.sql.types.ValueShort", 59); 167 add("com.quadcap.sql.types.ValuePattern", 60); 168 add("com.quadcap.sql.UpdateRow", 61); 169 add("com.quadcap.sql.types.ValueBoolean", 62); 170 add("com.quadcap.sql.ImportedKeyConstraint", 63); 171 add("com.quadcap.sql.StmtRenameTable", 64); 172 add("com.quadcap.sql.RefcountBlob", 65); 173 add("com.quadcap.sql.AutoNumberStep", 66); 174 add("com.quadcap.sql.types.ValueLong", 67); 175 add("com.quadcap.sql.DeleteConstraint", 68); 176 add("com.quadcap.sql.AddConstraint", 69); 177 add("com.quadcap.sql.NonUniqueIndexConstraint", 70); 178 add("com.quadcap.sql.types.TypeBigInt", 71); 179 add("com.quadcap.sql.types.TypeTinyInt", 72); 180 add("com.quadcap.sql.types.ValueFloat", 73); 181 add("com.quadcap.sql.types.ValueByte", 74); 182 add("com.quadcap.sql.types.TypeBoolean", 75); 183 add("com.quadcap.sql.types.TypeAny", 76); 184 add("com.quadcap.sql.JoinedTable", 77); 185 add("com.quadcap.sql.AddColumn", 78); 186 add("com.quadcap.sql.FunctionExpression", 79); 187 add("com.quadcap.sql.AlterColumn", 80); 188 add("com.quadcap.sql.types.TypeClob", 81); 189 add("com.quadcap.sql.types.ValueClob", 82); 190 add("com.quadcap.sql.types.ValueUnknown", 83); 191 add("com.quadcap.sql.SelectFromItem", 84); 192 add("com.quadcap.sql.MergeExpression", 85); 193 add("com.quadcap.sql.types.ValueDefault", 86); 194 add("com.quadcap.sql.DropColumn", 87); 195 196 add("java.math.BigDecimal", 251, 197 new ExternProxyBigDecimal()); 198 add("java.lang.Integer", 252, 199 new ExternProxyInteger()); 200 add("java.lang.String", 253, 201 new ExternProxyString()); 202 add("java.util.Vector", 254, 203 new ExternProxyVector()); 204 } 205 206 public static Extern get(int code) { 207 try { 208 return classes[code]; 209 } catch (Throwable t) { 210 return null; 211 } 212 } 213 214 public String toString() { return "[" + code + "]: " + className; } 216 218 static Extern get(String className) { 219 return (Extern)classNames.get(className); 220 } 221 222 int code; 223 String className; 224 ExternalizeProxy proxy; 225 Class eclass; 226 227 public Extern(String className, int code, ExternalizeProxy proxy) { 228 this.className = className; 229 this.code = code; 230 this.proxy = proxy; 231 if (proxy == null) { 232 try { 233 eclass = Class.forName(className); 234 } catch (Exception e) { 235 Debug.print(e); 236 throw new RuntimeException (e.toString()); 237 } 238 } 239 } 240 241 public Object readObject(ObjectInput in) 242 throws IOException , ClassNotFoundException 243 { 244 if (proxy != null) { 245 return proxy.readObject(in); 246 } else { 247 try { 248 Object obj = eclass.newInstance(); 249 ((Externalizable )obj).readExternal(in); 250 return obj; 251 } catch (IllegalAccessException e) { 252 throw new InvalidClassException (className, 253 "IllegalAccessException"); 254 } catch (InstantiationException e) { 255 throw new InvalidClassException (className, 256 "InstantiationException"); 257 } 258 } 259 } 260 261 public void writeObject(ObjectOutput out, Object obj) 262 throws IOException 263 { 264 out.write(code); 268 if (proxy != null) { 269 proxy.writeObject(out, obj); 270 } else { 271 ((Externalizable )obj).writeExternal(out); 272 } 273 } 274 } 275 | Popular Tags |