You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@aries.apache.org by David Jencks <da...@yahoo.com> on 2012/01/28 01:08:36 UTC

Re: svn commit: r1236823 - in /aries/trunk/proxy/proxy-impl: ./ src/main/java/org/apache/aries/proxy/impl/common/ src/main/java/org/apache/aries/proxy/impl/gen/ src/main/java/org/apache/aries/proxy/impl/interfaces/ src/main/java/org/apache/aries/proxy/impl...

I doubt you meant to commit EmptyVisitor?

I also don't think it's a good idea to copy the ASM4 constant.  Why not just use it from asm Opcodes directly?  Copying it makes it look like it might have a different meaning.

david jencks
On Jan 27, 2012, at 10:58 AM, ejiang@apache.org wrote:

> Author: ejiang
> Date: Fri Jan 27 18:58:20 2012
> New Revision: 1236823
> 
> URL: http://svn.apache.org/viewvc?rev=1236823&view=rev
> Log:
> ARIES-817: Upgrade to ASM4
> 
> Added:
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java
> Modified:
>    aries/trunk/proxy/proxy-impl/pom.xml
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java
>    aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java
>    aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties
>    aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java
> 
> Modified: aries/trunk/proxy/proxy-impl/pom.xml
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/pom.xml?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/pom.xml (original)
> +++ aries/trunk/proxy/proxy-impl/pom.xml Fri Jan 27 18:58:20 2012
> @@ -70,10 +70,10 @@
> 
>     <dependencies>
>         <dependency>
> -            <groupId>asm</groupId>
> +            <groupId>org.ow2.asm</groupId>
>             <artifactId>asm-all</artifactId>
>             <optional>true</optional>
> -            <version>3.2</version>
> +            <version>4.0</version>
>         </dependency>
>         <dependency>
>             <groupId>org.slf4j</groupId>
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/AbstractWovenProxyAdapter.java Fri Jan 27 18:58:20 2012
> @@ -21,7 +21,6 @@ package org.apache.aries.proxy.impl.comm
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.Serializable;
> -import java.lang.reflect.Modifier;
> import java.math.BigDecimal;
> import java.util.ArrayList;
> import java.util.Arrays;
> @@ -29,9 +28,9 @@ import java.util.HashMap;
> import java.util.HashSet;
> import java.util.List;
> import java.util.Map;
> -import java.util.Map.Entry;
> import java.util.Set;
> import java.util.UUID;
> +import java.util.Map.Entry;
> import java.util.concurrent.Callable;
> 
> import org.apache.aries.proxy.InvocationListener;
> @@ -39,7 +38,6 @@ import org.apache.aries.proxy.UnableToPr
> import org.apache.aries.proxy.impl.NLS;
> import org.apache.aries.proxy.impl.gen.Constants;
> import org.apache.aries.proxy.weaving.WovenProxy;
> -import org.objectweb.asm.ClassAdapter;
> import org.objectweb.asm.ClassReader;
> import org.objectweb.asm.ClassVisitor;
> import org.objectweb.asm.FieldVisitor;
> @@ -63,7 +61,7 @@ import org.slf4j.LoggerFactory;
>  * used to weave classes being loaded by the framework, and InterfaceCombiningClassAdapter
>  * which is used to dynamically create objects that implement multiple interfaces
>  */
> -public abstract class AbstractWovenProxyAdapter extends ClassAdapter implements Opcodes {
> +public abstract class AbstractWovenProxyAdapter extends ClassVisitor implements Opcodes {
>   private static final Logger LOGGER = LoggerFactory
>       .getLogger(AbstractWovenProxyAdapter.class);
> 
> @@ -200,7 +198,7 @@ public abstract class AbstractWovenProxy
>    */
>   public AbstractWovenProxyAdapter(ClassVisitor writer, String className,
>       ClassLoader loader) {
> -    super(writer);
> +    super(Constants.ASM4, writer);
>     typeBeingWoven = Type.getType("L" + className.replace('.', '/') + ";");
>     this.loader = loader;
>   }
> @@ -345,7 +343,7 @@ public abstract class AbstractWovenProxy
>       //to write our init code to static_init_UUID instead
>       staticInitMethod = new Method("static_init_" + UU_ID, Type.VOID_TYPE, NO_ARGS);
>       staticInitMethodFlags = staticInitMethodFlags | ACC_FINAL;
> -      methodVisitorToReturn = new AdviceAdapter(cv.visitMethod(access, name, desc, signature,
> +      methodVisitorToReturn = new AdviceAdapter(Constants.ASM4, cv.visitMethod(access, name, desc, signature,
>           exceptions), access, name, desc){
>         @Override
>         protected void onMethodEnter()
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/ConstructorFinder.java Fri Jan 27 18:58:20 2012
> @@ -18,14 +18,17 @@
>  */
> package org.apache.aries.proxy.impl.common;
> 
> -import org.objectweb.asm.ClassAdapter;
> +import org.apache.aries.proxy.impl.gen.Constants;
> +import org.apache.aries.proxy.impl.weaving.EmptyVisitor;
> +
> +import org.objectweb.asm.ClassVisitor;
> import org.objectweb.asm.MethodVisitor;
> import org.objectweb.asm.Type;
> -import org.objectweb.asm.commons.EmptyVisitor;
> +
> 
> import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
> 
> -public class ConstructorFinder extends ClassAdapter
> +public class ConstructorFinder extends ClassVisitor
> {
> 
>   private boolean hasNoArgsConstructor = false;
> @@ -37,7 +40,7 @@ public class ConstructorFinder extends C
> 
>   public ConstructorFinder()
>   {
> -    super(new EmptyVisitor());
> +    super(Constants.ASM4, new EmptyVisitor(Constants.ASM4));
>   }
> 
>   @Override
> 
> Added: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java?rev=1236823&view=auto
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java (added)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassVisitor.java Fri Jan 27 18:58:20 2012
> @@ -0,0 +1,57 @@
> +/*
> + * 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.common;
> +
> +import org.apache.aries.proxy.impl.gen.Constants;
> +import org.objectweb.asm.ClassVisitor;
> +import org.objectweb.asm.ClassWriter;
> +import org.objectweb.asm.MethodVisitor;
> +import org.objectweb.asm.commons.JSRInlinerAdapter;
> +/**
> + * We need to override ASM's default behaviour in {@link #getCommonSuperClass(String, String)}
> + * so that it doesn't load classes (which it was doing on the wrong {@link ClassLoader}
> + * anyway...)
> + */
> +public final class OSGiFriendlyClassVisitor extends ClassVisitor {
> +
> + 
> +  private final boolean inlineJSR;
> +  
> +  public OSGiFriendlyClassVisitor(ClassVisitor cv, int arg1) {
> +   
> +    super(Constants.ASM4, cv);
> +
> +    inlineJSR = arg1 == ClassWriter.COMPUTE_FRAMES;
> +  }
> +  
> +  
> +
> +  
> +  @Override
> +  public MethodVisitor visitMethod(int arg0, String arg1, String arg2,
> +      String arg3, String[] arg4) {
> +    MethodVisitor mv =  cv.visitMethod(arg0, arg1, arg2, arg3, arg4);
> +    
> +    if(inlineJSR)
> +      mv = new JSRInlinerAdapter(mv, arg0, arg1, arg2, arg3, arg4);
> +    
> +    return mv;
> +  }
> +
> +}
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/common/OSGiFriendlyClassWriter.java Fri Jan 27 18:58:20 2012
> @@ -27,8 +27,6 @@ import org.apache.aries.proxy.UnableToPr
> import org.apache.aries.proxy.impl.NLS;
> import org.objectweb.asm.ClassReader;
> import org.objectweb.asm.ClassWriter;
> -import org.objectweb.asm.MethodVisitor;
> -import org.objectweb.asm.commons.JSRInlinerAdapter;
> /**
>  * We need to override ASM's default behaviour in {@link #getCommonSuperClass(String, String)}
>  * so that it doesn't load classes (which it was doing on the wrong {@link ClassLoader}
> @@ -40,18 +38,22 @@ public final class OSGiFriendlyClassWrit
>   private final ClassLoader loader;
>   private String currentClassInternalName;
>   private String currentSuperClassInternalName;
> -  private final boolean inlineJSR;
> + 
> 
> -  public OSGiFriendlyClassWriter(ClassReader arg0, int arg1, ClassLoader loader) {
> +  public OSGiFriendlyClassWriter(ClassReader arg0, int arg1, ClassLoader loader, String currentClassInternalName, String currentSuperClassInternalName) {
>     super(arg0, arg1);
> -    inlineJSR = arg1 == COMPUTE_FRAMES;
> +    
>     this.loader = loader;
> +    this.currentClassInternalName = currentClassInternalName;
> +    this.currentSuperClassInternalName = currentSuperClassInternalName;
>   }
> 
> -  public OSGiFriendlyClassWriter(int arg0, ClassLoader loader) {
> +  public OSGiFriendlyClassWriter(int arg0, ClassLoader loader, String currentClassInternalName, String currentSuperClassInternalName) {
>     super(arg0);
> -    inlineJSR = arg0 == COMPUTE_FRAMES;
> +    
>     this.loader = loader;
> +    this.currentClassInternalName = currentClassInternalName;
> +    this.currentSuperClassInternalName = currentSuperClassInternalName;
>   }
> 
>   /**
> @@ -133,23 +135,6 @@ public final class OSGiFriendlyClassWrit
>   /**
>    * We need access to the super's name and our class name
>    */
> -  @Override
> -  public final void visit(int arg0, int arg1, String arg2, String arg3, String arg4,
> -      String[] arg5) {
> -    currentClassInternalName = arg2;
> -    currentSuperClassInternalName = arg4;
> -    super.visit(arg0, arg1, arg2, arg3, arg4, arg5);
> -  }
> -
> -  @Override
> -  public MethodVisitor visitMethod(int arg0, String arg1, String arg2,
> -      String arg3, String[] arg4) {
> -    MethodVisitor mv =  super.visitMethod(arg0, arg1, arg2, arg3, arg4);
> -    
> -    if(inlineJSR)
> -      mv = new JSRInlinerAdapter(mv, arg0, arg1, arg2, arg3, arg4);
> -    
> -    return mv;
> -  }
> +  
> 
> }
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/Constants.java Fri Jan 27 18:58:20 2012
> @@ -18,9 +18,12 @@
>  */
> package org.apache.aries.proxy.impl.gen;
> 
> +import org.objectweb.asm.Opcodes;
> +
> public interface Constants 
> {
>   final static String LOG_ENTRY = "Method entry: {}, args {}";
>   final static String LOG_EXIT = "Method exit: {}, returning {}";
>   final static String LOG_EXCEPTION = "Caught exception";
> +  final static int ASM4 = Opcodes.ASM4;
> }
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassAdapter.java Fri Jan 27 18:58:20 2012
> @@ -23,7 +23,6 @@ import java.lang.reflect.InvocationHandl
> 
> import org.objectweb.asm.AnnotationVisitor;
> import org.objectweb.asm.Attribute;
> -import org.objectweb.asm.ClassAdapter;
> import org.objectweb.asm.ClassReader;
> import org.objectweb.asm.ClassVisitor;
> import org.objectweb.asm.FieldVisitor;
> @@ -35,7 +34,7 @@ import org.objectweb.asm.commons.Method;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> 
> -public class ProxySubclassAdapter extends ClassAdapter implements Opcodes
> +public class ProxySubclassAdapter extends ClassVisitor implements Opcodes
> {
> 
>   private static final Type STRING_TYPE = Type.getType(String.class);
> @@ -62,7 +61,7 @@ public class ProxySubclassAdapter extend
>   public ProxySubclassAdapter(ClassVisitor writer, String newClassName, ClassLoader loader)
>   {
>     // call the superclass constructor
> -    super(writer);
> +    super(Constants.ASM4, writer);
>     // the writer is now the cv in the superclass of ClassAdapter
> 
>     LOGGER.debug(Constants.LOG_ENTRY, "ProxySubclassAdapter", new Object[] { this, writer,
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/gen/ProxySubclassHierarchyAdapter.java Fri Jan 27 18:58:20 2012
> @@ -37,7 +37,7 @@ import org.slf4j.LoggerFactory;
>  *
>  *
>  */
> -public class ProxySubclassHierarchyAdapter implements ClassVisitor, Opcodes
> +public class ProxySubclassHierarchyAdapter extends ClassVisitor implements Opcodes
> {
> 
>   private ProxySubclassAdapter adapter = null;
> @@ -47,6 +47,7 @@ public class ProxySubclassHierarchyAdapt
> 
>   ProxySubclassHierarchyAdapter(ProxySubclassAdapter adapter, Collection<String> methodsToImplement)
>   {
> +    super(Constants.ASM4);
>     LOGGER.debug(Constants.LOG_ENTRY, "ProxySubclassHeirarchyAdapter", new Object[] {
>         this, adapter, methodsToImplement });
> 
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceCombiningClassAdapter.java Fri Jan 27 18:58:20 2012
> @@ -26,13 +26,17 @@ import java.util.List;
> 
> import org.apache.aries.proxy.UnableToProxyException;
> import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
> +import org.apache.aries.proxy.impl.common.OSGiFriendlyClassVisitor;
> import org.apache.aries.proxy.impl.common.OSGiFriendlyClassWriter;
> +import org.apache.aries.proxy.impl.gen.Constants;
> +import org.apache.aries.proxy.impl.weaving.EmptyVisitor;
> import org.apache.aries.proxy.weaving.WovenProxy;
> +import org.objectweb.asm.ClassVisitor;
> import org.objectweb.asm.ClassWriter;
> import org.objectweb.asm.MethodVisitor;
> import org.objectweb.asm.Opcodes;
> import org.objectweb.asm.Type;
> -import org.objectweb.asm.commons.EmptyVisitor;
> +
> import org.objectweb.asm.commons.Method;
> 
> /**
> @@ -60,8 +64,10 @@ final class InterfaceCombiningClassAdapt
>    */
>    InterfaceCombiningClassAdapter(String className,
>       ClassLoader loader, Class<? extends WovenProxy> superclass, Collection<Class<?>> interfaces) {
> -    writer = new OSGiFriendlyClassWriter(ClassWriter.COMPUTE_FRAMES, loader);
> -    adapter = new InterfaceUsingWovenProxyAdapter(writer, className, loader);
> +     super(Constants.ASM4);
> +    writer = new OSGiFriendlyClassWriter(ClassWriter.COMPUTE_FRAMES, loader, className, (superclass!=null)? superclass.getName(): null);
> +    ClassVisitor cv = new OSGiFriendlyClassVisitor(writer, ClassWriter.COMPUTE_FRAMES);
> +    adapter = new InterfaceUsingWovenProxyAdapter(cv, className, loader);
> 
>     this.interfaces = interfaces;
>     this.superclass = superclass;
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/interfaces/InterfaceProxyGenerator.java Fri Jan 27 18:58:20 2012
> @@ -23,7 +23,6 @@ import java.lang.reflect.Constructor;
> import java.util.Arrays;
> import java.util.Collection;
> import java.util.Comparator;
> -import java.util.LinkedHashSet;
> import java.util.Map;
> import java.util.SortedSet;
> import java.util.TreeSet;
> @@ -32,9 +31,10 @@ import java.util.concurrent.Callable;
> 
> import org.apache.aries.proxy.InvocationListener;
> import org.apache.aries.proxy.UnableToProxyException;
> +import org.apache.aries.proxy.impl.gen.Constants;
> +import org.apache.aries.proxy.impl.weaving.EmptyVisitor;
> import org.apache.aries.proxy.weaving.WovenProxy;
> import org.objectweb.asm.Opcodes;
> -import org.objectweb.asm.commons.EmptyVisitor;
> import org.osgi.framework.Bundle;
> 
> /**
> @@ -45,6 +45,12 @@ import org.osgi.framework.Bundle;
>  */
> public final class InterfaceProxyGenerator extends EmptyVisitor implements Opcodes {
> 
> +  public InterfaceProxyGenerator()
> +  {
> +    super(Constants.ASM4);
> +    
> +  }
> +
>   private static final Map<Bundle, WeakReference<ProxyClassLoader>> cache = 
>             new WeakHashMap<Bundle, WeakReference<ProxyClassLoader>>(128);
> 
> 
> Added: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java?rev=1236823&view=auto
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java (added)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/EmptyVisitor.java Fri Jan 27 18:58:20 2012
> @@ -0,0 +1,32 @@
> +/*
> + * @start_prolog@
> + * ============================================================================
> + * IBM Confidential OCO Source Materials
> + *
> + * 5724-J08, 5724-I63, 5724-H88, 5724-H89, 5655-N02, 5733-W70 Copyright IBM Corp. 2010
> + *
> + * The source code for this program is not published or otherwise divested
> + * of its trade secrets, irrespective of what has been deposited with the
> + * U.S. Copyright Office.
> + * ============================================================================
> + * @end_prolog@
> + * 
> + * Change activity:
> + * 
> + * Issue       Date        Name        Description
> + * ----------- ----------- --------    ------------------------------------
> + */
> +package org.apache.aries.proxy.impl.weaving;
> +
> +import org.objectweb.asm.ClassVisitor;
> +
> +public class EmptyVisitor extends ClassVisitor
> +{
> +
> +  public EmptyVisitor(int asmVersion)
> +  {
> +    super(asmVersion);
> +    
> +  }
> +
> +}
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/MethodCopyingClassAdapter.java Fri Jan 27 18:58:20 2012
> @@ -26,6 +26,7 @@ import org.apache.aries.proxy.UnableToPr
> import org.apache.aries.proxy.impl.NLS;
> import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
> import org.apache.aries.proxy.impl.common.TypeMethod;
> +import org.apache.aries.proxy.impl.gen.Constants;
> import org.objectweb.asm.AnnotationVisitor;
> import org.objectweb.asm.Attribute;
> import org.objectweb.asm.ClassReader;
> @@ -33,7 +34,7 @@ import org.objectweb.asm.ClassVisitor;
> import org.objectweb.asm.MethodVisitor;
> import org.objectweb.asm.Opcodes;
> import org.objectweb.asm.Type;
> -import org.objectweb.asm.commons.EmptyVisitor;
> +
> import org.objectweb.asm.commons.Method;
> 
> /**
> @@ -65,6 +66,7 @@ final class MethodCopyingClassAdapter ex
>   public MethodCopyingClassAdapter(ClassVisitor cv, Class<?> superToCopy,
>       Type overridingClassType, Set<Method> knownMethods, 
>       Map<String, TypeMethod> transformedMethods) {
> +    super(Constants.ASM4);
>     this.cv = cv;
>     this.superToCopy = superToCopy;
>     this.overridingClassType = overridingClassType;
> @@ -132,7 +134,7 @@ final class MethodCopyingClassAdapter ex
>    * the body with a call to the super-types implementation. The original annotations
>    * attributes etc are all copied.
>    */
> -  private static final class CopyingMethodAdapter extends EmptyVisitor {
> +  private static final class CopyingMethodAdapter extends MethodVisitor {
>     /** The visitor to delegate to */
>     private final MethodVisitor mv;
>     /** The type that declares this method (not the one that will override it) */
> @@ -142,11 +144,13 @@ final class MethodCopyingClassAdapter ex
> 
>     public CopyingMethodAdapter(MethodVisitor mv, Type superType, 
>         Method currentTransformMethod) {
> +      super(Constants.ASM4);
>       this.mv = mv;
>       this.superType = superType;
>       this.currentTransformMethod = currentTransformMethod;
>     }
> 
> +    //TODO might not work for attributes
>     @Override
>     public final AnnotationVisitor visitAnnotation(String arg0, boolean arg1) {
>       return mv.visitAnnotation(arg0, arg1);
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/SyntheticSerialVerUIDAdder.java Fri Jan 27 18:58:20 2012
> @@ -18,10 +18,17 @@
>  */
> package org.apache.aries.proxy.impl.weaving;
> 
> +import java.io.IOException;
> +
> +import org.apache.aries.proxy.impl.gen.Constants;
> import org.objectweb.asm.commons.SerialVersionUIDAdder;
> +import org.slf4j.Logger;
> +import org.slf4j.LoggerFactory;
> 
> class SyntheticSerialVerUIDAdder extends SerialVersionUIDAdder {
> 
> +  private static Logger LOGGER = LoggerFactory.getLogger(SyntheticSerialVerUIDAdder.class);
> +
>   private WovenProxyAdapter wpa;
> 
>   public SyntheticSerialVerUIDAdder(WovenProxyAdapter cv) {
> @@ -31,7 +38,26 @@ class SyntheticSerialVerUIDAdder extends
> 
>   @Override
>   public void visitEnd() {
> -    wpa.setSVUIDGenerated(!!!hasSVUID);
> +   
> +    wpa.setSVUIDGenerated(!!!isHasSVUID());
>     super.visitEnd();
>   }
> +  
> +  private boolean isHasSVUID() {
> +    try {
> +      if (computeSVUID() == 0 ) {
> +        // This means the class has a serial id already
> +        return true;      
> +      } else {
> +        return false;
> +      }
> +    } catch (IOException ioe) {
> +   
> +      LOGGER.debug(Constants.LOG_ENTRY, "cannot.compute.serial.id", new Object[] { ioe });
> +
> +    } finally {
> +      return false;
> +    }
> +
> +  }
> }
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/impl/weaving/WovenProxyGenerator.java Fri Jan 27 18:58:20 2012
> @@ -23,6 +23,7 @@ import static org.objectweb.asm.Opcodes.
> import static org.objectweb.asm.Opcodes.ACC_INTERFACE;
> 
> import org.apache.aries.proxy.impl.common.AbstractWovenProxyAdapter;
> +import org.apache.aries.proxy.impl.common.OSGiFriendlyClassVisitor;
> import org.apache.aries.proxy.impl.common.OSGiFriendlyClassWriter;
> import org.objectweb.asm.ClassReader;
> import org.objectweb.asm.ClassVisitor;
> @@ -41,12 +42,13 @@ public final class WovenProxyGenerator
> 
>     //If we are Java 1.6 + compiled then we need to compute stack frames, otherwise
>     //maxs are fine (and faster)
> -    ClassWriter cWriter = new OSGiFriendlyClassWriter(cReader, AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6 ? 
> -            ClassWriter.COMPUTE_FRAMES : ClassWriter.COMPUTE_MAXS, loader);
> -    
> +    int computeVal = AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6 ? 
> +        ClassWriter.COMPUTE_FRAMES : ClassWriter.COMPUTE_MAXS;
> +    ClassWriter cWriter = new OSGiFriendlyClassWriter(cReader, computeVal, loader, cReader.getClassName(), cReader.getSuperName());
> +    ClassVisitor cv = new OSGiFriendlyClassVisitor(cWriter, computeVal );
>     //Wrap our outer layer to add the original SerialVersionUID if it was previously being defaulted
>     ClassVisitor weavingAdapter = new SyntheticSerialVerUIDAdder(
> -                               new WovenProxyAdapter(cWriter, className, loader));
> +                               new WovenProxyAdapter(cv, className, loader));
> 
>     // If we are Java 1.6 + then we need to skip frames as they will be recomputed
>     cReader.accept(weavingAdapter, AbstractWovenProxyAdapter.IS_AT_LEAST_JAVA_6 ? ClassReader.SKIP_FRAMES : 0);
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/java/org/apache/aries/proxy/synthesizer/Synthesizer.java Fri Jan 27 18:58:20 2012
> @@ -22,7 +22,9 @@ package org.apache.aries.proxy.synthesiz
> import java.io.FileInputStream;
> import java.io.FileOutputStream;
> 
> +import org.apache.aries.proxy.impl.gen.Constants;
> import org.objectweb.asm.ClassReader;
> +import org.objectweb.asm.ClassVisitor;
> import org.objectweb.asm.ClassWriter;
> import org.objectweb.asm.Opcodes;
> 
> @@ -46,6 +48,7 @@ public class Synthesizer
>     for (String arg : args) {
>       FileInputStream classInStream = null;
>       ClassWriter writer = null;
> +     
>       try {
>         //read in the class
>         classInStream = new FileInputStream(arg);
> @@ -55,18 +58,11 @@ public class Synthesizer
>         //we just need to override the visit method so we can add
>         //the synthetic modifier, otherwise we use the methods in
>         //a standard writer
> -        writer = new ClassWriter(reader, 0) {
> -          @Override
> -          public void visit(int version, int access, String name, String signature,
> -              String superName, String[] interfaces)
> -          {
> -            super.visit(version, access | Opcodes.ACC_SYNTHETIC, name, signature, superName,
> -                interfaces);
> -          }
> -        };
> +        writer =   new ClassWriter(reader, 0) ;
> +        ClassVisitor cv = new CustomClassVisitor((ClassVisitor)writer);
>         //call accept on the reader to start the visits
>         //using the writer we created as the visitor
> -        reader.accept(writer, 0);
> +        reader.accept(cv, 0);
>       } finally {
>         //close the InputStream if it is hanging around
>         if (classInStream != null) classInStream.close();
> @@ -82,4 +78,22 @@ public class Synthesizer
>       }
>     }
>   }
> +  
> +  public static class CustomClassVisitor extends ClassVisitor
> +  {
> +
> +    public CustomClassVisitor( ClassVisitor cv)
> +    {
> +      super(Constants.ASM4, cv);
> +      
> +    }
> +    @Override
> +    public void visit(int version, int access, String name, String signature,
> +        String superName, String[] interfaces)
> +    {
> +      cv.visit(version, access | Opcodes.ACC_SYNTHETIC, name, signature, superName,
> +          interfaces);
> +    }
> +
> +  }
> }
> 
> Modified: aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties (original)
> +++ aries/trunk/proxy/proxy-impl/src/main/resources/org/apache/aries/proxy/nls/ProxyImplMessages.properties Fri Jan 27 18:58:20 2012
> @@ -47,3 +47,4 @@ no.common.superclass=The class {0} and {
> cannot.weave=The class {0} cannot be woven, it may not be possible for the runtime to proxy this class.
> # {0} The class that could not be woven.
> fatal.weaving.failure=There was a serious error trying to weave the class {0}. See the associated exception for more information.
> +cannot.compute.serial.id=An internal error occurred while computing serial id. {0}
> 
> Modified: aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java
> URL: http://svn.apache.org/viewvc/aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java?rev=1236823&r1=1236822&r2=1236823&view=diff
> ==============================================================================
> --- aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java (original)
> +++ aries/trunk/proxy/proxy-impl/src/test/java/org/apache/aries/blueprint/proxy/InterfaceProxyingTest.java Fri Jan 27 18:58:20 2012
> @@ -53,7 +53,7 @@ public class InterfaceProxyingTest {
> 
>     private Object list = new Callable<Object>() {
> 
> -      @Override
> +
>       public Object call() throws Exception {
>         return null;
>       }
> @@ -127,7 +127,7 @@ public class InterfaceProxyingTest {
> 
>     tc.setReturn(new Callable<Object>() {
> 
> -      @Override
> + 
>       public Object call() throws Exception {
>         throw new RuntimeException();
>       }
> @@ -145,7 +145,7 @@ public class InterfaceProxyingTest {
> 
>     tc.setReturn(new Callable<Object>() {
> 
> -      @Override
> +     
>       public Object call() throws Exception {
>         try {
>           throw new RuntimeException();
> 
>