01: /*
02: This source file is part of Smyle, a database library.
03: For up-to-date information, see http://www.drjava.de/smyle
04: Copyright (C) 2001 Stefan Reich (doc@drjava.de)
05:
06: This library is free software; you can redistribute it and/or
07: modify it under the terms of the GNU Lesser General Public
08: License as published by the Free Software Foundation; either
09: version 2.1 of the License, or (at your option) any later version.
10:
11: This library is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: Lesser General Public License for more details.
15:
16: You should have received a copy of the GNU Lesser General Public
17: License along with this library; if not, write to the Free Software
18: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:
20: For full license text, see doc/license/lgpl.txt in this distribution
21: */
22:
23: package drjava.smyle.core;
24:
25: import org.artsProject.mcop.*;
26: import drjava.smyle.*;
27: import drjava.smyle.meta.*;
28:
29: public class FunctionMarDemar<T extends Struct<T>> implements
30: MarDemar<Function> {
31: private StructInfo<T> structInfo;
32:
33: private static final byte CASCADE = 1, FIELD = 2, TOLOWERCASE = 3;
34:
35: public FunctionMarDemar(StructInfo<T> structInfo) {
36: this .structInfo = structInfo;
37: }
38:
39: public void marshal(Buffer b, Function f) {
40: ((Marshallable) f).marshal(b);
41: }
42:
43: public Function read(Buffer b) {
44: byte type = b.readByte();
45: switch (type) {
46: case CASCADE: {
47: Function f = read(b);
48: Function g = read(b);
49: return new Cascade(f, g);
50: }
51: case FIELD: {
52: return getField(b.readLong());
53: }
54: case TOLOWERCASE: {
55: return ToLowerCase.INSTANCE;
56: }
57: }
58: throw new InternalSmyleError("Unknown function type " + type);
59: }
60:
61: public static void marshalCascade(Buffer b, Function f, Function g) {
62: b.writeByte(CASCADE);
63: ((Marshallable) f).marshal(b);
64: ((Marshallable) g).marshal(b);
65: }
66:
67: public static void marshalField(Buffer b, int nr) {
68: b.writeByte(FIELD);
69: b.writeLong(nr);
70: }
71:
72: public static void marshalToLowerCase(Buffer b) {
73: b.writeByte(TOLOWERCASE);
74: }
75:
76: public Field getField(int nr) {
77: if (structInfo.structClass == null)
78: // untyped
79: return new Field(nr);
80: else
81: try {
82: // typed
83: return (Field) structInfo.structClass
84: .getField(
85: "f_"
86: + structInfo.typeDef.contents
87: .get(nr).name)
88: .get(null);
89: } catch (Exception e) {
90: throw new InternalSmyleError(e);
91: }
92: }
93: }
|