Package net.sourceforge.javautil.interceptor.type.cjcw

Source Code of net.sourceforge.javautil.interceptor.type.cjcw.InterceptorProxyConstructor

package net.sourceforge.javautil.interceptor.type.cjcw;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sourceforge.javautil.bytecode.api.IBytecodeField;
import net.sourceforge.javautil.bytecode.api.IBytecodeReferenceable;
import net.sourceforge.javautil.bytecode.api.IBytecodeResolvable;
import net.sourceforge.javautil.bytecode.api.LiteralValue;
import net.sourceforge.javautil.bytecode.api.TypeDescriptor;
import net.sourceforge.javautil.bytecode.api.type.method.BytecodeBlock;
import net.sourceforge.javautil.bytecode.api.type.method.BytecodeContextMethod;
import net.sourceforge.javautil.bytecode.api.type.method.BytecodeLocalVariableDeclaration;
import net.sourceforge.javautil.bytecode.api.type.method.IBytecodeWriterMethod.ComparisonOperator;
import net.sourceforge.javautil.bytecode.api.type.method.instructions.LoopBase;
import net.sourceforge.javautil.bytecode.api.type.method.invocation.MethodInvocation;
import net.sourceforge.javautil.interceptor.InterceptorCompiler;
import net.sourceforge.javautil.interceptor.IInterceptorManipulator;
import net.sourceforge.javautil.interceptor.asm.InterceptorHelper;
import net.sourceforge.javautil.interceptor.type.InterceptorProxyTypeInterceptor;

/**
* The generated constructors for concrete class interceptor proxies.
*
* @author elponderador
* @author $Author$
* @version $Id$
*
* @see InterceptorCompiler
*/
public class InterceptorProxyConstructor extends BytecodeBlock {
 
  protected final List<IInterceptorManipulator> abilities;

  public InterceptorProxyConstructor(List<IInterceptorManipulator> abilities) {
    this.abilities = abilities;
  }

  @Override protected void writeInstructions(BytecodeContextMethod context) {
    List<IBytecodeReferenceable> sp = new ArrayList<IBytecodeReferenceable>();
   
    for (int i=2; i<context.getDeclaredParameterCount(); i++) {
      sp.add(context.getDeclaredParameter(i));
    }
   
    context.superConstruct(sp.toArray(new IBytecodeReferenceable[sp.size()]));
   
    context.set("this", InterceptorProxyTypeInterceptor.CACHE_FIELD_NAME, context.createNewInstanceInvocation(context.resolve(HashMap.class)));
    context.set("this", InterceptorProxyTypeInterceptor.INTERCEPTOR_FIELD_NAME, context.getDeclaredParameter(0));
    context.set("this", InterceptorProxyTypeCJCW.TARGET_FIELD_NAME, context.getDeclaredParameter(1));
   
    if (abilities != null && abilities.size() > 0) {
      BytecodeLocalVariableDeclaration interceptor = context.getDeclaredParameter(0);
      IBytecodeField state = context.getEnclosingType().getField(context.getResolutionPool(), InterceptorProxyTypeInterceptor.ABILITIES_FIELD_NAME);
     
      context.set("this", InterceptorProxyTypeInterceptor.ABILITIES_FIELD_NAME, context.createNewInstanceInvocation(context.resolve(HashMap.class)));
     
      for (IInterceptorManipulator ability : abilities) {
        ability.manipulate(context, interceptor, state);
      }
    }
  }

}
TOP

Related Classes of net.sourceforge.javautil.interceptor.type.cjcw.InterceptorProxyConstructor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.