blob: fdbc856a7e731bebee946560cb4ac6da6b3720f6 [file] [log] [blame]
/*
* 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
}
}