/* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
*/ | |
package org.apache.aries.proxy.impl.gen; | |
import java.util.Collection; | |
import org.objectweb.asm.AnnotationVisitor; | |
import org.objectweb.asm.Attribute; | |
import org.objectweb.asm.ClassVisitor; | |
import org.objectweb.asm.FieldVisitor; | |
import org.objectweb.asm.MethodVisitor; | |
import org.objectweb.asm.Opcodes; | |
import org.objectweb.asm.Type; | |
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
/* | |
* Although we implement ClassVisitor we are only interested in the methods of | |
* the superclasses in the hierarchy. For this reason although visitMethod is | |
* implemented the other methods of ClassVisitor are currently no-op. | |
* | |
* | |
*/ | |
public class ProxySubclassHierarchyAdapter extends ClassVisitor implements Opcodes | |
{ | |
private ProxySubclassAdapter adapter = null; | |
private Collection<String> methodsToImplement = null; | |
private static Logger LOGGER = LoggerFactory.getLogger(ProxySubclassHierarchyAdapter.class); | |
ProxySubclassHierarchyAdapter(ProxySubclassAdapter adapter, Collection<String> methodsToImplement) | |
{ | |
super(Opcodes.ASM9); | |
LOGGER.debug(Constants.LOG_ENTRY, "ProxySubclassHeirarchyAdapter", new Object[] { | |
this, adapter, methodsToImplement }); | |
this.methodsToImplement = methodsToImplement; | |
this.adapter = adapter; | |
LOGGER.debug(Constants.LOG_EXIT, "ProxySubclassHeirarchyAdapter", this); | |
} | |
public MethodVisitor visitMethod(int access, String name, String desc, String signature, | |
String[] exceptions) | |
{ | |
LOGGER.debug(Constants.LOG_ENTRY, "visitMethod", new Object[] { access, name, desc, | |
signature, exceptions }); | |
// if the method we find in the superclass is one that is available on | |
// the class | |
// we are dynamically subclassing then we need to implement an | |
// invocation for it | |
String argDesc = ProxySubclassMethodHashSet.typeArrayToStringArgDescriptor(Type | |
.getArgumentTypes(desc)); | |
if (methodsToImplement.contains(name + argDesc)) { | |
// create the method in bytecode | |
adapter.visitMethod(access, name, desc, signature, exceptions); | |
} | |
LOGGER.debug(Constants.LOG_EXIT, "visitMethod"); | |
// always return null because we don't want to copy any method code | |
return null; | |
} | |
public void visit(int arg0, int arg1, String arg2, String arg3, String arg4, String[] arg5) | |
{ | |
// no-op | |
} | |
public AnnotationVisitor visitAnnotation(String arg0, boolean arg1) | |
{ | |
// don't process any annotations at this stage | |
return null; | |
} | |
public void visitAttribute(Attribute arg0) | |
{ | |
// no-op | |
} | |
public void visitEnd() | |
{ | |
// no-op | |
} | |
public FieldVisitor visitField(int arg0, String arg1, String arg2, String arg3, Object arg4) | |
{ | |
// don't process fields | |
return null; | |
} | |
public void visitInnerClass(String arg0, String arg1, String arg2, int arg3) | |
{ | |
// no-op | |
} | |
public void visitOuterClass(String arg0, String arg1, String arg2) | |
{ | |
// no-op | |
} | |
public void visitSource(String arg0, String arg1) | |
{ | |
// no-op | |
} | |
} |