2 * SequentialFactory.java
4 * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, Santa
5 * Clara, California 95054, U.S.A. All rights reserved.
7 * Sun Microsystems, Inc. has intellectual property rights relating to
8 * technology embodied in the product that is described in this
9 * document. In particular, and without limitation, these
10 * intellectual property rights may include one or more of the
11 * U.S. patents listed at http://www.sun.com/patents and one or more
12 * additional patents or pending patent applications in the U.S. and
15 * U.S. Government Rights - Commercial software.
16 * Government users are subject to the Sun Microsystems, Inc. standard
17 * license agreement and applicable provisions of the FAR and its
18 * supplements. Use is subject to license terms. Sun, Sun
19 * Microsystems, the Sun logo and Java are trademarks or registered
20 * trademarks of Sun Microsystems, Inc. in the U.S. and other
23 * This product is covered and controlled by U.S. Export Control laws
24 * and may be subject to the export or import laws in other countries.
25 * Nuclear, missile, chemical biological weapons or nuclear maritime
26 * end uses or end users, whether direct or indirect, are strictly
27 * prohibited. Export or reexport to countries subject to
28 * U.S. embargo or to entities identified on U.S. export exclusion
29 * lists, including, but not limited to, the denied persons and
30 * specially designated nationals lists is strictly prohibited.
33 package dstm2.factory;
34 import TransactionalIO.exceptions.PanicException;
35 import dstm2.Transaction;
36 import dstm2.factory.BaseFactory;
37 import dstm2.factory.ClassLoader;
38 import dstm2.factory.Property;
39 import java.lang.reflect.Constructor;
40 import java.lang.reflect.InvocationTargetException;
41 import org.apache.bcel.Constants;
42 import org.apache.bcel.classfile.Method;
43 import org.apache.bcel.generic.*;
46 * Simple factory that implements properties declared in an interface.
47 * Ignores all non-property methods.
48 * @author Maurice Herlihy
50 public class SequentialFactory<T> extends BaseFactory<T> {
53 * Creates a new instance of SequentialFactory
54 * @param _class Run-time class of interface being implemented.
56 public SequentialFactory(Class<T> _class) {
59 className = _class.getName() + "$";
60 int constants = Constants.ACC_PUBLIC | Constants.ACC_SUPER;
61 String[] interfaces = new String[] {_class.getName()};
62 _cg = new ClassGen(className, "java.lang.Object", null, constants, interfaces);
63 _cp = _cg.getConstantPool();
64 _factory = new InstructionFactory(_cg, _cp);
66 for (Property p : properties) {
67 createField(p.type, p.name);
82 return theClass.newInstance();
84 } catch (Exception ex) {
85 throw new PanicException(ex);
90 * Create constructor for new class.
92 private void createCtor() {
93 InstructionList il = new InstructionList();
94 MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] { }, "<init>", className, il, _cp);
96 InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0));
97 il.append(_factory.createInvoke("java.lang.Object", "<init>", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL));
98 InstructionHandle ih_4 = il.append(_factory.createReturn(Type.VOID));
100 method.setMaxLocals();
101 _cg.addMethod(method.getMethod());
106 * Create getter for property.
107 * @param p Property to implement.
109 private void createGetMethod(Property p) {
110 InstructionList il = new InstructionList();
111 MethodGen method = new MethodGen(Constants.ACC_PUBLIC, p.type, Type.NO_ARGS, new String[] { }, p.getMethod.getName(), className, il, _cp);
113 InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0));
114 il.append(_factory.createFieldAccess(className, p.name, p.type, Constants.GETFIELD));
115 InstructionHandle ih_4 = il.append(_factory.createReturn(p.type));
116 method.setMaxStack();
117 method.setMaxLocals();
118 _cg.addMethod(method.getMethod());
123 * create setter for new class
124 * @param p Property to implement
126 private void createSetMethod(Property p) {
127 InstructionList il = new InstructionList();
128 MethodGen method = new MethodGen(Constants.ACC_PUBLIC, Type.VOID, new Type[] { p.type }, new String[] { "value" }, p.setMethod.getName(), className, il, _cp);
130 InstructionHandle ih_0 = il.append(_factory.createLoad(Type.OBJECT, 0));
131 il.append(_factory.createLoad(p.type, 1));
132 il.append(_factory.createFieldAccess(className, p.name, p.type, Constants.PUTFIELD));
133 InstructionHandle ih_5 = il.append(_factory.createReturn(Type.VOID));
134 method.setMaxStack();
135 method.setMaxLocals();
136 _cg.addMethod(method.getMethod());