169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage sample.duplicate;
269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport javassist.tools.reflect.*;
469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic class DuplicatedObject extends Metaobject {
669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    private DuplicatedObject backup;
769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    // if a base-level object is created, this metaobject creates
969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    // a copy of the base-level object.
1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public DuplicatedObject(Object self, Object[] args) {
1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	super(self, args);
1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	ClassMetaobject clazz = getClassMetaobject();
1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	if (clazz.isInstance(args[0]))
1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	    backup = null;	// self is a backup object.
1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	else {
1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	    Object[] args2 = new Object[1];
1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	    args2[0] = self;
1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	    try {
2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal		Metalevel m = (Metalevel)clazz.newInstance(args2);
2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal		backup = (DuplicatedObject)m._getMetaobject();
2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	    }
2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	    catch (CannotCreateException e) {
2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal		backup = null;
2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	    }
2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	}
2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public Object trapMethodcall(int identifier, Object[] args)
3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	throws Throwable
3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    {
3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	Object obj = super.trapMethodcall(identifier, args);
3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	if (backup != null)
3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	    backup.trapMethodcall(identifier, args);
3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal	return obj;
3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
39