Add iPOJO Extender and solve a bug on LogService delegation. This commit is a part of the iPOJO new version issue (Felix-311).

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@552471 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/core/pom.xml b/ipojo/core/pom.xml
index 0dd9e15..42707fb 100644
--- a/ipojo/core/pom.xml
+++ b/ipojo/core/pom.xml
@@ -42,6 +42,7 @@
             <Bundle-Name>iPOJO</Bundle-Name>
             <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
             <Bundle-Description> iPOJO </Bundle-Description>
+            <Bundle-Activator>org.apache.felix.ipojo.Extender</Bundle-Activator>
             <Import-Package>
               org.osgi.framework, 
               org.osgi.service.cm,
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/Activator.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/Activator.java
deleted file mode 100644
index abc6a50..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/Activator.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/* 
- * 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.felix.ipojo;
-
-import java.io.IOException;
-import java.util.Dictionary;
-
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.parser.ManifestMetadataParser;
-import org.apache.felix.ipojo.parser.ParseException;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-
-/**
- * iPOJO generic activator. 
- * All iPOJO bundle (bundle containing iPOJO components) must used this activator to be able to start the component management.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class Activator implements BundleActivator {
-    /**
-     * The m_bundle context.
-     * m_bundleContext : BundleContext
-     */
-    private BundleContext m_bundleContext = null;
-
-    /**
-     * Component Factories managed by the current bundle.
-     * m_handler : ComponentFactory
-     */
-    private ComponentFactory[] m_factories = new ComponentFactory[0];
-    
-    /**
-     * The instance creator aims to manage instance from outside factory.
-     */
-    private InstanceCreator m_creator;
-
-    /**
-     * The configurations to create.
-     * m_configuration : Array of Dictionary (each dictionary represents one configuration)
-     */
-    private Dictionary[] m_configurations;
-
-    /**
-     * Return the bundle context.
-     * @return the bundle context.
-     */
-    BundleContext getBundleContext() { return m_bundleContext; }
-
-    /**
-     * Add a component factory to the factory list.
-     * @param cm : the new component metadata.
-     */
-    private void addComponentFactory(Element cm) {
-        ComponentFactory factory = new ComponentFactory(m_bundleContext, cm);
-
-        // If the factory array is not empty add the new factory at the end
-        if (m_factories.length != 0) {
-            ComponentFactory[] newFactory = new ComponentFactory[m_factories.length + 1];
-            System.arraycopy(m_factories, 0, newFactory, 0, m_factories.length);
-            newFactory[m_factories.length] = factory;
-            m_factories = newFactory;
-        } else { m_factories = new ComponentFactory[] {factory}; }         // Else create an array of size one with the new Factory
-    }
-
-    /**
-     * Start method.
-     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
-     * @param bc : the m_bundle context to use to manage the component.
-     * @throws Exception : when a problem occurs
-     */
-    public void start(final BundleContext bc) throws Exception {
-        m_bundleContext = bc;
-
-        try {
-            parse();
-        } catch (IOException e) {
-            System.err.println("IO error for the bundle " + m_bundleContext.getBundle().getBundleId() + " : " + e.getMessage());
-            return;
-        } catch (ParseException e) {
-            System.err.println("Parse error for the bundle " + m_bundleContext.getBundle().getBundleId() + " : " + e.getMessage());
-        }
-
-        start(); // Call the internal start method
-
-    }
-
-    /**
-     * Stop method.
-     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
-     * @param arg0 : the m_bundle context
-     * @throws Exception : ???
-     */
-    public void stop(BundleContext arg0) throws Exception {
-        for (int i = 0; i < m_factories.length; i++) {
-            ComponentFactory factory = m_factories[i];
-            factory.stop();
-        }
-        if (m_creator != null) { m_creator.stop(); }
-        m_factories = new ComponentFactory[0]; // Release all factories
-    }
-
-    /**
-     * Parse the internal metadata (from the manifest (in the iPOJO-Components property)).
-     * @throws IOException : the manisfest could not be found
-     * @throws ParseException : the parsing process failed
-     */
-    private void parse() throws IOException, ParseException {
-
-        String componentClasses = (String) m_bundleContext.getBundle().getHeaders().get("iPOJO-Components");
-        if (componentClasses != null) {
-            ManifestMetadataParser parser = new ManifestMetadataParser();
-            parser.parse(m_bundleContext.getBundle().getHeaders());
-            
-            Element[] componentsMetadata = parser.getComponentsMetadata(); // Get the component type declaration
-            for (int i = 0; i < componentsMetadata.length; i++) { addComponentFactory(componentsMetadata[i]); }
-            m_configurations = parser.getInstances(); // Get the component instances declaration
-        } else {
-            throw new ParseException("[Bundle" + m_bundleContext.getBundle().getBundleId() + "] iPOJO-Components are not in the manifest");
-        }
-    }
-
-    /**
-     * Start the management factories and create instances.
-     */
-    private void start() {
-        // Start the factories
-        for (int j = 0; j < m_factories.length; j++) {
-            m_factories[j].start();
-        }
-
-        Dictionary[] outsiders = new Dictionary[0];
-        for (int i = 0; i < m_configurations.length; i++) {
-            Dictionary conf = m_configurations[i];
-            boolean created = false;
-            for (int j = 0; j < m_factories.length; j++) {
-                String componentClass = m_factories[j].getComponentClassName();
-                String factoryName = m_factories[j].getName();
-                String componentName = m_factories[j].getComponentTypeName();
-                if (conf.get("component") != null && (conf.get("component").equals(componentClass) || conf.get("component").equals(factoryName)) || conf.get("component").equals(componentName)) {
-                    try {
-                        m_factories[j].createComponentInstance(conf);
-                        created = true;
-                    } catch (UnacceptableConfiguration e) {
-                        System.err.println("Cannot create the instance " + conf.get("name") + " : " + e.getMessage());
-                    }
-                }
-            }
-            if (!created && conf.get("component") != null) {
-                if (outsiders.length != 0) {
-                    Dictionary[] newList = new Dictionary[outsiders.length + 1];
-                    System.arraycopy(outsiders, 0, newList, 0, outsiders.length);
-                    newList[outsiders.length] = conf;
-                    outsiders = newList;
-                } else {
-                    outsiders = new Dictionary[] { conf };
-                }
-            }
-        }
-
-        // Create the instance creator if needed.
-        if (outsiders.length > 0) {
-            m_creator = new InstanceCreator(m_bundleContext, outsiders);
-        }
-    }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
index fb8a514..bb7f2a3 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
@@ -339,8 +339,6 @@
             }
             m_instancesName.remove(ci.getInstanceName());
         }
-
-        m_logger.stop();
         
         m_componentInstances.clear();
         if (m_sr != null) {
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/Extender.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/Extender.java
new file mode 100644
index 0000000..84895c9
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/Extender.java
@@ -0,0 +1,286 @@
+/* 

+ * 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.felix.ipojo;

+

+import java.io.IOException;

+import java.util.Dictionary;

+import java.util.Enumeration;

+import java.util.Hashtable;

+

+import org.apache.felix.ipojo.metadata.Element;

+import org.apache.felix.ipojo.parser.ManifestMetadataParser;

+import org.apache.felix.ipojo.parser.ParseException;

+import org.osgi.framework.Bundle;

+import org.osgi.framework.BundleActivator;

+import org.osgi.framework.BundleContext;

+import org.osgi.framework.BundleEvent;

+import org.osgi.framework.ServiceReference;

+import org.osgi.framework.SynchronousBundleListener;

+import org.osgi.service.log.LogService;

+

+/**

+ * iPOJO Extender.

+ * Looks for iPOJO Bundle and start the management of these bundles if needed.

+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>

+ */

+public class Extender implements SynchronousBundleListener, BundleActivator {

+

+    /**

+     * iPOJO Manifest header.

+     */

+    private static final String IPOJO_HEADER = "iPOJO-Components";

+    

+    /**

+     * iPOJO Bundle Context.

+     */

+    private BundleContext m_context;

+    

+    /**

+     * Dictionary of [BundleId, Factory List]. 

+     */

+    private Dictionary m_components;

+    

+    /**

+     * Dictionary of [BundleId, Instance Creator]. 

+     */

+    private Dictionary m_creators;

+    

+    /**

+     * iPOJO Bundle Id.

+     */

+    private long m_bundleId;

+    

+    

+    /**

+     * Bundle Listener Notification.

+     * @param event : the bundle event.

+     * @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent)

+     */

+    public void bundleChanged(BundleEvent event) {

+        if (event.getBundle().getBundleId() == m_bundleId) {

+            return;

+        }

+

+        switch (event.getType()) {

+            case BundleEvent.STARTED:

+                startManagementFor(event.getBundle());

+                break;

+            case BundleEvent.STOPPING:

+                closeManagementFor(event.getBundle());

+                break;

+        }

+

+    }

+

+    /**

+     * Ends the iPOJO Management for the given bundle.

+     * @param bundle : the bundle.

+     */

+    private void closeManagementFor(Bundle bundle) {

+        ComponentFactory[] cfs = (ComponentFactory[]) m_components.get(bundle);

+        InstanceCreator creator = (InstanceCreator) m_creators.get(bundle);

+        if (cfs == null && creator == null) { return; }

+        for (int i = 0; cfs != null && i < cfs.length; i++) {

+            ComponentFactory factory = cfs[i];

+            factory.stop();

+        }

+        if (creator != null) { creator.stop(); }

+        

+        m_components.remove(bundle);

+        m_creators.remove(bundle);

+        

+    }

+

+    /**

+     * Check if the given bundle is an iPOJO bundle, and begin the iPOJO management is true. 

+     * @param bundle : the bundle to check.

+     */

+    private void startManagementFor(Bundle bundle) {

+        // Check bundle

+        Dictionary dict = bundle.getHeaders();

+        String header = (String) dict.get(IPOJO_HEADER);

+        if (header == null) {

+            return;

+        } else {

+            try {

+                parse(bundle, header);

+            } catch (IOException e) {

+                err("An exception occurs during the parsing of the bundle " + bundle.getBundleId(), e);

+            } catch (ParseException e) {

+                err("A parse exception occurs during the parsing of the bundle " + bundle.getBundleId(), e);

+            }

+        }

+        

+    }

+    

+    /**

+     * Parse the internal metadata (from the manifest (in the iPOJO-Components property)).

+     * @param bundle : the owner bundle.

+     * @param components : iPOJO Header String.

+     * @throws IOException : the manifest could not be found

+     * @throws ParseException : the parsing process failed

+     */

+    private void parse(Bundle bundle, String components) throws IOException, ParseException {

+        ManifestMetadataParser parser = new ManifestMetadataParser();

+        parser.parseHeader(components);

+          

+        Element[] componentsMetadata = parser.getComponentsMetadata(); // Get the component type declaration

+        for (int i = 0; i < componentsMetadata.length; i++) { addComponentFactory(bundle, componentsMetadata[i]); }

+        

+        start(bundle, parser.getInstances());

+    }

+

+    /** 

+     * iPOJO Starting method.

+     * @param bc : iPOJO bundle context.

+     * @throws Exception : the start method failed.

+     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)

+     */

+    public void start(BundleContext bc) throws Exception {

+        m_context = bc;

+        m_bundleId = bc.getBundle().getBundleId();

+        m_components = new Hashtable();

+        m_creators = new Hashtable();

+        

+        synchronized (this) {

+            for (int i = 0; i < bc.getBundles().length; i++) {

+                if (bc.getBundles()[i].getState() == Bundle.ACTIVE) {

+                    startManagementFor(bc.getBundles()[i]);

+                }

+            }

+        }

+

+        // listen to any changes in bundles

+        m_context.addBundleListener(this);

+    }

+

+    /**

+     * Stop the iPOJO Management.

+     * @param bc : bundle context.

+     * @throws Exception : the stop method failed.

+     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)

+     */

+    public void stop(BundleContext bc) throws Exception {

+        m_context.removeBundleListener(this);

+        Enumeration e = m_components.keys();

+        while (e.hasMoreElements()) {

+            ComponentFactory[] cfs = (ComponentFactory[]) m_components.get(e.nextElement());

+            for (int i = 0; i < cfs.length; i++) {

+                cfs[i].stop();

+            }

+        }

+        m_components = null;

+        Enumeration e2 = m_creators.keys();

+        while (e2.hasMoreElements()) {

+            InstanceCreator creator = (InstanceCreator) m_creators.get(e2.nextElement());

+            creator.stop();

+        }

+    }

+    

+    /**

+     * Add a component factory to the factory list.

+     * @param cm : the new component metadata.

+     * @param bundle : the bundle.

+     */

+    private void addComponentFactory(Bundle bundle, Element cm) {        

+        ComponentFactory factory = new ComponentFactory(bundle.getBundleContext(), cm);

+        

+        ComponentFactory[] cfs = (ComponentFactory[]) m_components.get(bundle);

+        

+        // If the factory array is not empty add the new factory at the end

+        if (cfs != null && cfs.length != 0) {

+            ComponentFactory[] newFactory = new ComponentFactory[cfs.length + 1];

+            System.arraycopy(cfs, 0, newFactory, 0, cfs.length);

+            newFactory[cfs.length] = factory;

+            cfs = newFactory;

+            m_components.put(bundle, cfs);

+        } else {

+            m_components.put(bundle, new ComponentFactory[] {factory}); // Else create an array of size one with the new Factory 

+        }

+    }

+    

+    /**

+     * Start the management factories and create instances.

+     * @param bundle : the bundle. 

+     * @param confs : the instances to create.

+     */

+    private void start(Bundle bundle, Dictionary[] confs) {

+        ComponentFactory[] cfs = (ComponentFactory[]) m_components.get(bundle);

+        

+        // Start the factories

+        for (int j = 0; cfs != null && j < cfs.length; j++) {

+            cfs[j].start();

+        }

+

+        Dictionary[] outsiders = new Dictionary[0];

+        

+        for (int i = 0; confs != null && i < confs.length; i++) {

+            Dictionary conf = confs[i];

+            boolean created = false;

+            for (int j = 0; cfs != null && j < cfs.length; j++) {

+                String componentClass = cfs[j].getComponentClassName();

+                String factoryName = cfs[j].getName();

+                String componentName = cfs[j].getComponentTypeName();

+                if (conf.get("component") != null && (conf.get("component").equals(componentClass) || conf.get("component").equals(factoryName)) || conf.get("component").equals(componentName)) {

+                    try {

+                        cfs[j].createComponentInstance(conf);

+                        created = true;

+                    } catch (UnacceptableConfiguration e) {

+                        System.err.println("Cannot create the instance " + conf.get("name") + " : " + e.getMessage());

+                    }

+                }

+            }

+            if (!created && conf.get("component") != null) {

+                if (outsiders.length != 0) {

+                    Dictionary[] newList = new Dictionary[outsiders.length + 1];

+                    System.arraycopy(outsiders, 0, newList, 0, outsiders.length);

+                    newList[outsiders.length] = conf;

+                    outsiders = newList;

+                } else {

+                    outsiders = new Dictionary[] { conf };

+                }

+            }

+        }

+

+        // Create the instance creator if needed.

+        if (outsiders.length > 0) {

+            m_creators.put(bundle, new InstanceCreator(bundle.getBundleContext(), outsiders));

+        }

+    }

+    

+    /**

+     * Log an error message in a log service (if available) and display the message in the console.

+     * @param message : the message to log

+     * @param t : an attached error (can be null)

+     */

+    private void err(String message, Throwable t) {

+        ServiceReference ref = m_context.getServiceReference(LogService.class.getName());

+        if (ref != null) {

+            LogService log = (LogService) m_context.getService(ref);

+            log.log(LogService.LOG_ERROR, message, t);

+            m_context.ungetService(ref);

+        }

+        if (t != null) {

+            System.err.println("[iPOJO-Core] " + message + " : " + t.getMessage());

+        } else {

+            System.err.println("[iPOJO-Core] " + message);

+        }

+    }

+

+}

diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
index 7e9e0f1..e3e46b5 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
@@ -555,21 +555,16 @@
 
         } catch (InstantiationException e) {
             m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance cannot be instancied : " + e.getMessage());
-            e.printStackTrace();
         } catch (IllegalAccessException e) {
             m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance is not accessible : " + e.getMessage());
-            e.printStackTrace();
         } catch (SecurityException e) {
             m_factory.getLogger().log(Logger.ERROR,
                     "[" + m_name + "] createInstance -> The Component Instance is not accessible (security reason) : " + e.getMessage());
-            e.printStackTrace();
         } catch (InvocationTargetException e) {
             m_factory.getLogger().log(Logger.ERROR,
                     "[" + m_name + "] createInstance -> Cannot invoke the constructor method (illegal target) : " + e.getMessage());
-            e.printStackTrace();
         } catch (NoSuchMethodException e) {
             m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the constructor (method not found) : " + e.getMessage());
-            e.printStackTrace();
         }
 
         // Register the new instance
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
index 7eade4d..a736115 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
@@ -182,6 +182,18 @@
         addElement(new Element("iPOJO", ""));
         parseElements(componentClassesStr.trim());
     }
+    
+    /**
+     * Parse the given header and create the instance managers.
+     * 
+     * @param header : the given header of the manifest file
+     * @throws ParseException : if any error occurs
+     */
+    public void parseHeader(String header) throws ParseException {
+        // Add the ipojo element inside the element list
+        addElement(new Element("iPOJO", ""));
+        parseElements(header.trim());
+    }
 
     /**
      * Parse the metadata from the string given in argument.
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Logger.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Logger.java
index 68880cc..93f4daa 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Logger.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Logger.java
@@ -19,9 +19,6 @@
 package org.apache.felix.ipojo.util;
 
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.log.LogService;
 
@@ -30,7 +27,7 @@
  * 
  * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
  */
-public class Logger implements ServiceListener {
+public class Logger {
 
     /**
      * Log Level ERROR.
@@ -58,16 +55,6 @@
     private BundleContext m_context;
 
     /**
-     * Service Reference of the log service is available.
-     */
-    private ServiceReference m_ref;
-
-    /**
-     * Log service object.
-     */
-    private LogService m_log;
-
-    /**
      * Name of the logger.
      */
     private String m_name;
@@ -89,16 +76,6 @@
         m_level = level;
         m_context = bc;
 
-        m_ref = m_context.getServiceReference(LogService.class.getName());
-        if (m_ref != null) {
-            m_log = (LogService) m_context.getService(m_ref);
-        }
-
-        try {
-            m_context.addServiceListener(this, "(objectClass=" + LogService.class.getName() + ")");
-        } catch (InvalidSyntaxException e) {
-            e.printStackTrace();
-        }
     }
 
     /**
@@ -142,33 +119,40 @@
         if (ex != null) {
             s += " (" + ex.getMessage() + ")";
         }
-        String message;
+        
+        ServiceReference ref = m_context.getServiceReference(LogService.class.getName());
+        LogService log = null;
+        if (ref != null) {
+            log = (LogService) m_context.getService(ref);
+        }
+        
+        String message = null;
         switch (level) {
             case DEBUG:
                 message = "[" + m_name + "] DEBUG: " + s;
-                if (m_log != null) {
-                    m_log.log(LogService.LOG_DEBUG, message);
+                if (log != null) {
+                    log.log(LogService.LOG_DEBUG, message);
                 }
                 System.err.println(message);
                 break;
             case ERROR:
                 message = "[" + m_name + "] ERROR: " + s;
-                if (m_log != null) {
-                    m_log.log(LogService.LOG_ERROR, message);
+                if (log != null) {
+                    log.log(LogService.LOG_ERROR, message);
                 }
                 System.err.println(message);
                 break;
             case INFO:
                 message = "[" + m_name + "] INFO: " + s;
-                if (m_log != null) {
-                    m_log.log(LogService.LOG_INFO, message);
+                if (log != null) {
+                    log.log(LogService.LOG_INFO, message);
                 }
                 System.err.println(message);
                 break;
             case WARNING:
                 message = "[" + m_name + "] WARNING: " + s;
-                if (m_log != null) {
-                    m_log.log(LogService.LOG_WARNING, message);
+                if (log != null) {
+                    log.log(LogService.LOG_WARNING, message);
                 }
                 System.err.println(message);
                 break;
@@ -176,38 +160,9 @@
                 System.err.println("[" + m_name + "] UNKNOWN[" + level + "]: " + s);
                 break;
         }
-    }
-
-    /**
-     * Service Listener implementation.
-     * @param ev : the service event
-     * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
-     */
-    public void serviceChanged(ServiceEvent ev) {
-        if (ev.getType() == ServiceEvent.REGISTERED && m_ref == null) {
-            m_ref = ev.getServiceReference();
-            m_log = (LogService) m_context.getService(m_ref);
-        }
-        if (ev.getType() == ServiceEvent.UNREGISTERING && m_ref == ev.getServiceReference()) {
-            m_context.ungetService(m_ref);
-            m_log = null;
-            m_ref = m_context.getServiceReference(LogService.class.getName());
-            if (m_ref != null) {
-                m_log = (LogService) m_context.getService(m_ref);
-            }
-        }
-    }
-    
-    /**
-     * Stop the logger.
-     * This method unget the used log service, and remove stop the service listenning.
-     */
-    public void stop() {
-        m_context.removeServiceListener(this);
-        if (m_ref != null) {
-            m_log = null;
-            m_context.ungetService(m_ref);
-            m_ref = null;
+        
+        if (log != null) {
+            m_context.ungetService(ref);
         }
     }
 }
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
index 9975ee4..4076fb8 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
@@ -260,7 +260,6 @@
             e.printStackTrace();

         }

         Attributes att = mf.getMainAttributes();

-        setBundleActivator(att); // Set the bundle activator

         setImports(att); // Set the imports (add ipojo and handler namespaces

         setPOJOMetadata(att); // Add iPOJO-Component

         setCreatedBy(att); // Add iPOJO to the creators

@@ -350,17 +349,6 @@
     }

 

     /**

-     * Set the bundle activator in the manifest.

-     * @param att : manifest attribute.

-     */

-    private void setBundleActivator(Attributes att) {

-        if (att.containsKey("Bundle-Activator")) {

-            warn("The bundle contains another Bundle-Activator : " + att.getValue("Bundle-Activator") + " - Replace the existing one");

-        }

-        att.putValue("Bundle-Activator", "org.apache.felix.ipojo.Activator");

-    }

-

-    /**

      * Set the create-by in the manifest.

      * @param att : manifest attribute.

      */

diff --git a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/AdviceAdapter.java b/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/AdviceAdapter.java
deleted file mode 100644
index f4edfa4..0000000
--- a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/AdviceAdapter.java
+++ /dev/null
@@ -1,650 +0,0 @@
-/***

- * ASM: a very small and fast Java bytecode manipulation framework

- * Copyright (c) 2000-2005 INRIA, France Telecom

- * All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions

- * are met:

- * 1. Redistributions of source code must retain the above copyright

- *    notice, this list of conditions and the following disclaimer.

- * 2. Redistributions in binary form must reproduce the above copyright

- *    notice, this list of conditions and the following disclaimer in the

- *    documentation and/or other materials provided with the distribution.

- * 3. Neither the name of the copyright holders nor the names of its

- *    contributors may be used to endorse or promote products derived from

- *    this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF

- * THE POSSIBILITY OF SUCH DAMAGE.

- */

-package org.objectweb.asm.commons;

-

-import java.util.ArrayList;

-import java.util.HashMap;

-

-import org.objectweb.asm.Label;

-import org.objectweb.asm.MethodVisitor;

-import org.objectweb.asm.Opcodes;

-import org.objectweb.asm.Type;

-

-/**

- * A {@link org.objectweb.asm.MethodAdapter} to insert before, after and around

- * advices in methods and constructors. <p> The behavior for constructors is

- * like this: <ol>

- * 

- * <li>as long as the INVOKESPECIAL for the object initialization has not been

- * reached, every bytecode instruction is dispatched in the ctor code visitor</li>

- * 

- * <li>when this one is reached, it is only added in the ctor code visitor and

- * a JP invoke is added</li>

- * 

- * <li>after that, only the other code visitor receives the instructions</li>

- * 

- * </ol>

- * 

- * @author Eugene Kuleshov

- * @author Eric Bruneton

- */

-public abstract class AdviceAdapter extends GeneratorAdapter implements Opcodes

-{

-    private static final Object THIS = new Object();

-    private static final Object OTHER = new Object();

-

-    protected int methodAccess;

-    protected String methodDesc;

-

-    private boolean constructor;

-    private boolean superInitialized;

-    private ArrayList stackFrame;

-    private HashMap branches;

-

-    /**

-     * Creates a new {@link AdviceAdapter}.

-     * 

-     * @param mv the method visitor to which this adapter delegates calls.

-     * @param access the method's access flags (see {@link Opcodes}).

-     * @param name the method's name.

-     * @param desc the method's descriptor (see {@link Type Type}).

-     */

-    public AdviceAdapter(

-        final MethodVisitor mv,

-        final int access,

-        final String name,

-        final String desc)

-    {

-        super(mv, access, name, desc);

-        methodAccess = access;

-        methodDesc = desc;

-

-        constructor = "<init>".equals(name);

-    }

-

-    public void visitCode() {

-        mv.visitCode();

-        if (!constructor) {

-            superInitialized = true;

-            onMethodEnter();

-        } else {

-            stackFrame = new ArrayList();

-            branches = new HashMap();

-        }

-    }

-

-    public void visitLabel(final Label label) {

-        mv.visitLabel(label);

-

-        if (constructor && branches != null) {

-            ArrayList frame = (ArrayList) branches.get(label);

-            if (frame != null) {

-                stackFrame = frame;

-                branches.remove(label);

-            }

-        }

-    }

-

-    public void visitInsn(final int opcode) {

-        if (constructor) {

-            switch (opcode) {

-                case RETURN: // empty stack

-                    onMethodExit(opcode);

-                    break;

-

-                case IRETURN: // 1 before n/a after

-                case FRETURN: // 1 before n/a after

-                case ARETURN: // 1 before n/a after

-                case ATHROW: // 1 before n/a after

-                    popValue();

-                    popValue();

-                    onMethodExit(opcode);

-                    break;

-

-                case LRETURN: // 2 before n/a after

-                case DRETURN: // 2 before n/a after

-                    popValue();

-                    popValue();

-                    onMethodExit(opcode);

-                    break;

-

-                case NOP:

-                case LALOAD: // remove 2 add 2

-                case DALOAD: // remove 2 add 2

-                case LNEG:

-                case DNEG:

-                case FNEG:

-                case INEG:

-                case L2D:

-                case D2L:

-                case F2I:

-                case I2B:

-                case I2C:

-                case I2S:

-                case I2F:

-                case Opcodes.ARRAYLENGTH:

-                    break;

-

-                case ACONST_NULL:

-                case ICONST_M1:

-                case ICONST_0:

-                case ICONST_1:

-                case ICONST_2:

-                case ICONST_3:

-                case ICONST_4:

-                case ICONST_5:

-                case FCONST_0:

-                case FCONST_1:

-                case FCONST_2:

-                case F2L: // 1 before 2 after

-                case F2D:

-                case I2L:

-                case I2D:

-                    pushValue(OTHER);

-                    break;

-

-                case LCONST_0:

-                case LCONST_1:

-                case DCONST_0:

-                case DCONST_1:

-                    pushValue(OTHER);

-                    pushValue(OTHER);

-                    break;

-

-                case IALOAD: // remove 2 add 1

-                case FALOAD: // remove 2 add 1

-                case AALOAD: // remove 2 add 1

-                case BALOAD: // remove 2 add 1

-                case CALOAD: // remove 2 add 1

-                case SALOAD: // remove 2 add 1

-                case POP:

-                case IADD:

-                case FADD:

-                case ISUB:

-                case LSHL: // 3 before 2 after

-                case LSHR: // 3 before 2 after

-                case LUSHR: // 3 before 2 after

-                case L2I: // 2 before 1 after

-                case L2F: // 2 before 1 after

-                case D2I: // 2 before 1 after

-                case D2F: // 2 before 1 after

-                case FSUB:

-                case FMUL:

-                case FDIV:

-                case FREM:

-                case FCMPL: // 2 before 1 after

-                case FCMPG: // 2 before 1 after

-                case IMUL:

-                case IDIV:

-                case IREM:

-                case ISHL:

-                case ISHR:

-                case IUSHR:

-                case IAND:

-                case IOR:

-                case IXOR:

-                case MONITORENTER:

-                case MONITOREXIT:

-                    popValue();

-                    break;

-

-                case POP2:

-                case LSUB:

-                case LMUL:

-                case LDIV:

-                case LREM:

-                case LADD:

-                case LAND:

-                case LOR:

-                case LXOR:

-                case DADD:

-                case DMUL:

-                case DSUB:

-                case DDIV:

-                case DREM:

-                    popValue();

-                    popValue();

-                    break;

-

-                case IASTORE:

-                case FASTORE:

-                case AASTORE:

-                case BASTORE:

-                case CASTORE:

-                case SASTORE:

-                case LCMP: // 4 before 1 after

-                case DCMPL:

-                case DCMPG:

-                    popValue();

-                    popValue();

-                    popValue();

-                    break;

-

-                case LASTORE:

-                case DASTORE:

-                    popValue();

-                    popValue();

-                    popValue();

-                    popValue();

-                    break;

-

-                case DUP:

-                    pushValue(peekValue());

-                    break;

-

-                case DUP_X1:

-                    // TODO optimize this

-                {

-                    Object o1 = popValue();

-                    Object o2 = popValue();

-                    pushValue(o1);

-                    pushValue(o2);

-                    pushValue(o1);

-                }

-                    break;

-

-                case DUP_X2:

-                    // TODO optimize this

-                {

-                    Object o1 = popValue();

-                    Object o2 = popValue();

-                    Object o3 = popValue();

-                    pushValue(o1);

-                    pushValue(o3);

-                    pushValue(o2);

-                    pushValue(o1);

-                }

-                    break;

-

-                case DUP2:

-                    // TODO optimize this

-                {

-                    Object o1 = popValue();

-                    Object o2 = popValue();

-                    pushValue(o2);

-                    pushValue(o1);

-                    pushValue(o2);

-                    pushValue(o1);

-                }

-                    break;

-

-                case DUP2_X1:

-                    // TODO optimize this

-                {

-                    Object o1 = popValue();

-                    Object o2 = popValue();

-                    Object o3 = popValue();

-                    pushValue(o2);

-                    pushValue(o1);

-                    pushValue(o3);

-                    pushValue(o2);

-                    pushValue(o1);

-                }

-                    break;

-

-                case DUP2_X2:

-                    // TODO optimize this

-                {

-                    Object o1 = popValue();

-                    Object o2 = popValue();

-                    Object o3 = popValue();

-                    Object o4 = popValue();

-                    pushValue(o2);

-                    pushValue(o1);

-                    pushValue(o4);

-                    pushValue(o3);

-                    pushValue(o2);

-                    pushValue(o1);

-                }

-                    break;

-

-                case SWAP: {

-                    Object o1 = popValue();

-                    Object o2 = popValue();

-                    pushValue(o1);

-                    pushValue(o2);

-                }

-                    break;

-            }

-        } else {

-            switch (opcode) {

-                case RETURN:

-                case IRETURN:

-                case FRETURN:

-                case ARETURN:

-                case LRETURN:

-                case DRETURN:

-                case ATHROW:

-                    onMethodExit(opcode);

-                    break;

-            }

-        }

-        mv.visitInsn(opcode);

-    }

-

-    public void visitVarInsn(final int opcode, final int var) {

-        super.visitVarInsn(opcode, var);

-

-        if (constructor) {

-            switch (opcode) {

-                case ILOAD:

-                case FLOAD:

-                    pushValue(OTHER);

-                    break;

-                case LLOAD:

-                case DLOAD:

-                    pushValue(OTHER);

-                    pushValue(OTHER);

-                    break;

-                case ALOAD:

-                    pushValue(var == 0 ? THIS : OTHER);

-                    break;

-                case ASTORE:

-                case ISTORE:

-                case FSTORE:

-                    popValue();

-                    break;

-                case LSTORE:

-                case DSTORE:

-                    popValue();

-                    popValue();

-                    break;

-            }

-        }

-    }

-

-    public void visitFieldInsn(

-        final int opcode,

-        final String owner,

-        final String name,

-        final String desc)

-    {

-        mv.visitFieldInsn(opcode, owner, name, desc);

-

-        if (constructor) {

-            char c = desc.charAt(0);

-            boolean longOrDouble = c == 'J' || c == 'D';

-            switch (opcode) {

-                case GETSTATIC:

-                    pushValue(OTHER);

-                    if (longOrDouble) {

-                        pushValue(OTHER);

-                    }

-                    break;

-                case PUTSTATIC:

-                    popValue();

-                    if (longOrDouble) {

-                        popValue();

-                    }

-                    break;

-                case PUTFIELD:

-                    popValue();

-                    if (longOrDouble) {

-                        popValue();

-                        popValue();

-                    }

-                    break;

-                // case GETFIELD:

-                default:

-                    if (longOrDouble) {

-                        pushValue(OTHER);

-                    }

-            }

-        }

-    }

-

-    public void visitIntInsn(final int opcode, final int operand) {

-        mv.visitIntInsn(opcode, operand);

-

-        if (constructor && opcode!=NEWARRAY) {

-            pushValue(OTHER);

-        }

-    }

-

-    public void visitLdcInsn(final Object cst) {

-        mv.visitLdcInsn(cst);

-

-        if (constructor) {

-            pushValue(OTHER);

-            if (cst instanceof Double || cst instanceof Long) {

-                pushValue(OTHER);

-            }

-        }

-    }

-

-    public void visitMultiANewArrayInsn(final String desc, final int dims) {

-        mv.visitMultiANewArrayInsn(desc, dims);

-

-        if (constructor) {

-            for (int i = 0; i < dims; i++) {

-                popValue();

-            }

-            pushValue(OTHER);

-        }

-    }

-

-    public void visitTypeInsn(final int opcode, final String name) {

-        mv.visitTypeInsn(opcode, name);

-

-        // ANEWARRAY, CHECKCAST or INSTANCEOF don't change stack

-        if (constructor && opcode == NEW) {

-            pushValue(OTHER);

-        }

-    }

-

-    public void visitMethodInsn(

-        final int opcode,

-        final String owner,

-        final String name,

-        final String desc)

-    {

-        mv.visitMethodInsn(opcode, owner, name, desc);

-

-        if (constructor) {

-            Type[] types = Type.getArgumentTypes(desc);

-            for (int i = 0; i < types.length; i++) {

-                popValue();

-                if (types[i].getSize() == 2) {

-                    popValue();

-                }

-            }

-            switch (opcode) {

-                // case INVOKESTATIC:

-                // break;

-

-                case INVOKEINTERFACE:

-                case INVOKEVIRTUAL:

-                    popValue(); // objectref

-                    break;

-

-                case INVOKESPECIAL:

-                    Object type = popValue(); // objectref

-                    if (type == THIS && !superInitialized) {

-                        onMethodEnter();

-                        superInitialized = true;

-                        // once super has been initialized it is no longer

-                        // necessary to keep track of stack state

-                        constructor = false;

-                    }

-                    break;

-            }

-

-            Type returnType = Type.getReturnType(desc);

-            if (returnType != Type.VOID_TYPE) {

-                pushValue(OTHER);

-                if (returnType.getSize() == 2) {

-                    pushValue(OTHER);

-                }

-            }

-        }

-    }

-

-    public void visitJumpInsn(final int opcode, final Label label) {

-        mv.visitJumpInsn(opcode, label);

-

-        if (constructor) {

-            switch (opcode) {

-                case IFEQ:

-                case IFNE:

-                case IFLT:

-                case IFGE:

-                case IFGT:

-                case IFLE:

-                case IFNULL:

-                case IFNONNULL:

-                    popValue();

-                    break;

-

-                case IF_ICMPEQ:

-                case IF_ICMPNE:

-                case IF_ICMPLT:

-                case IF_ICMPGE:

-                case IF_ICMPGT:

-                case IF_ICMPLE:

-                case IF_ACMPEQ:

-                case IF_ACMPNE:

-                    popValue();

-                    popValue();

-                    break;

-

-                case JSR:

-                    pushValue(OTHER);

-                    break;

-            }

-            addBranch(label);

-        }

-    }

-

-    public void visitLookupSwitchInsn(

-        final Label dflt,

-        final int[] keys,

-        final Label[] labels)

-    {

-        mv.visitLookupSwitchInsn(dflt, keys, labels);

-

-        if (constructor) {

-            popValue();

-            addBranches(dflt, labels);

-        }

-    }

-

-    public void visitTableSwitchInsn(

-        final int min,

-        final int max,

-        final Label dflt,

-        final Label[] labels)

-    {

-        mv.visitTableSwitchInsn(min, max, dflt, labels);

-

-        if (constructor) {

-            popValue();

-            addBranches(dflt, labels);

-        }

-    }

-

-    private void addBranches(final Label dflt, final Label[] labels) {

-        addBranch(dflt);

-        for (int i = 0; i < labels.length; i++) {

-            addBranch(labels[i]);

-        }

-    }

-

-    private void addBranch(final Label label) {

-        if (branches.containsKey(label)) {

-            return;

-        }

-        ArrayList frame = new ArrayList();

-        frame.addAll(stackFrame);

-        branches.put(label, frame);

-    }

-

-    private Object popValue() {

-        return stackFrame.remove(stackFrame.size() - 1);

-    }

-

-    private Object peekValue() {

-        return stackFrame.get(stackFrame.size() - 1);

-    }

-

-    private void pushValue(final Object o) {

-        stackFrame.add(o);

-    }

-

-    /**

-     * Called at the beginning of the method or after super class class call in

-     * the constructor. <br><br>

-     * 

-     * <i>Custom code can use or change all the local variables, but should not

-     * change state of the stack.</i>

-     */

-    protected abstract void onMethodEnter();

-

-    /**

-     * Called before explicit exit from the method using either return or throw.

-     * Top element on the stack contains the return value or exception instance.

-     * For example:

-     * 

-     * <pre>

-     *   public void onMethodExit(int opcode) {

-     *     if(opcode==RETURN) {

-     *         visitInsn(ACONST_NULL);

-     *     } else if(opcode==ARETURN || opcode==ATHROW) {

-     *         dup();

-     *     } else {

-     *         if(opcode==LRETURN || opcode==DRETURN) {

-     *             dup2();

-     *         } else {

-     *             dup();

-     *         }

-     *         box(Type.getReturnType(this.methodDesc));

-     *     }

-     *     visitIntInsn(SIPUSH, opcode);

-     *     visitMethodInsn(INVOKESTATIC, owner, "onExit", "(Ljava/lang/Object;I)V");

-     *   }

-     *

-     *   // an actual call back method

-     *   public static void onExit(int opcode, Object param) {

-     *     ...

-     * </pre>

-     * 

-     * <br><br>

-     * 

-     * <i>Custom code can use or change all the local variables, but should not

-     * change state of the stack.</i>

-     * 

-     * @param opcode one of the RETURN, IRETURN, FRETURN, ARETURN, LRETURN,

-     *        DRETURN or ATHROW

-     * 

-     */

-    protected abstract void onMethodExit(int opcode);

-

-    // TODO onException, onMethodCall

-

-}

diff --git a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/GeneratorAdapter.java b/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/GeneratorAdapter.java
deleted file mode 100644
index 972b2ff..0000000
--- a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/GeneratorAdapter.java
+++ /dev/null
@@ -1,1435 +0,0 @@
-/***

- * ASM: a very small and fast Java bytecode manipulation framework

- * Copyright (c) 2000-2005 INRIA, France Telecom

- * All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions

- * are met:

- * 1. Redistributions of source code must retain the above copyright

- *    notice, this list of conditions and the following disclaimer.

- * 2. Redistributions in binary form must reproduce the above copyright

- *    notice, this list of conditions and the following disclaimer in the

- *    documentation and/or other materials provided with the distribution.

- * 3. Neither the name of the copyright holders nor the names of its

- *    contributors may be used to endorse or promote products derived from

- *    this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF

- * THE POSSIBILITY OF SUCH DAMAGE.

- */

-package org.objectweb.asm.commons;

-

-import java.util.ArrayList;

-import java.util.Arrays;

-import java.util.List;

-

-import org.objectweb.asm.ClassVisitor;

-import org.objectweb.asm.Label;

-import org.objectweb.asm.MethodVisitor;

-import org.objectweb.asm.Opcodes;

-import org.objectweb.asm.Type;

-

-/**

- * A {@link org.objectweb.asm.MethodAdapter} with convenient methods to generate

- * code. For example, using this adapter, the class below

- * 

- * <pre>

- * public class Example {

- *     public static void main(String[] args) {

- *         System.out.println(&quot;Hello world!&quot;);

- *     }

- * }

- * </pre>

- * 

- * can be generated as follows:

- * 

- * <pre>

- * ClassWriter cw = new ClassWriter(true);

- * cw.visit(V1_1, ACC_PUBLIC, &quot;Example&quot;, null, &quot;java/lang/Object&quot;, null);

- * 

- * Method m = Method.getMethod(&quot;void &lt;init&gt; ()&quot;);

- * GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, null, null, cw);

- * mg.loadThis();

- * mg.invokeConstructor(Type.getType(Object.class), m);

- * mg.returnValue();

- * mg.endMethod();

- * 

- * m = Method.getMethod(&quot;void main (String[])&quot;);

- * mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw);

- * mg.getStatic(Type.getType(System.class), &quot;out&quot;, Type.getType(PrintStream.class));

- * mg.push(&quot;Hello world!&quot;);

- * mg.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod(&quot;void println (String)&quot;));

- * mg.returnValue();

- * mg.endMethod();

- * 

- * cw.visitEnd();

- * </pre>

- * 

- * @author Juozas Baliuka

- * @author Chris Nokleberg

- * @author Eric Bruneton

- */

-public class GeneratorAdapter extends LocalVariablesSorter {

-

-    private final static Type BYTE_TYPE = Type.getObjectType("java/lang/Byte");

-

-    private final static Type BOOLEAN_TYPE = Type.getObjectType("java/lang/Boolean");

-

-    private final static Type SHORT_TYPE = Type.getObjectType("java/lang/Short");

-

-    private final static Type CHARACTER_TYPE = Type.getObjectType("java/lang/Character");

-

-    private final static Type INTEGER_TYPE = Type.getObjectType("java/lang/Integer");

-

-    private final static Type FLOAT_TYPE = Type.getObjectType("java/lang/Float");

-

-    private final static Type LONG_TYPE = Type.getObjectType("java/lang/Long");

-

-    private final static Type DOUBLE_TYPE = Type.getObjectType("java/lang/Double");

-

-    private final static Type NUMBER_TYPE = Type.getObjectType("java/lang/Number");

-

-    private final static Type OBJECT_TYPE = Type.getObjectType("java/lang/Object");

-

-    private final static Method BOOLEAN_VALUE = Method.getMethod("boolean booleanValue()");

-

-    private final static Method CHAR_VALUE = Method.getMethod("char charValue()");

-

-    private final static Method INT_VALUE = Method.getMethod("int intValue()");

-

-    private final static Method FLOAT_VALUE = Method.getMethod("float floatValue()");

-

-    private final static Method LONG_VALUE = Method.getMethod("long longValue()");

-

-    private final static Method DOUBLE_VALUE = Method.getMethod("double doubleValue()");

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int ADD = Opcodes.IADD;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int SUB = Opcodes.ISUB;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int MUL = Opcodes.IMUL;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int DIV = Opcodes.IDIV;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int REM = Opcodes.IREM;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int NEG = Opcodes.INEG;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int SHL = Opcodes.ISHL;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int SHR = Opcodes.ISHR;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int USHR = Opcodes.IUSHR;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int AND = Opcodes.IAND;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int OR = Opcodes.IOR;

-

-    /**

-     * Constant for the {@link #math math} method.

-     */

-    public final static int XOR = Opcodes.IXOR;

-

-    /**

-     * Constant for the {@link #ifCmp ifCmp} method.

-     */

-    public final static int EQ = Opcodes.IFEQ;

-

-    /**

-     * Constant for the {@link #ifCmp ifCmp} method.

-     */

-    public final static int NE = Opcodes.IFNE;

-

-    /**

-     * Constant for the {@link #ifCmp ifCmp} method.

-     */

-    public final static int LT = Opcodes.IFLT;

-

-    /**

-     * Constant for the {@link #ifCmp ifCmp} method.

-     */

-    public final static int GE = Opcodes.IFGE;

-

-    /**

-     * Constant for the {@link #ifCmp ifCmp} method.

-     */

-    public final static int GT = Opcodes.IFGT;

-

-    /**

-     * Constant for the {@link #ifCmp ifCmp} method.

-     */

-    public final static int LE = Opcodes.IFLE;

-

-    /**

-     * Access flags of the method visited by this adapter.

-     */

-    private final int access;

-

-    /**

-     * Return type of the method visited by this adapter.

-     */

-    private final Type returnType;

-

-    /**

-     * Argument types of the method visited by this adapter.

-     */

-    private final Type[] argumentTypes;

-

-    /**

-     * Types of the local variables of the method visited by this adapter.

-     */

-    private final List localTypes = new ArrayList();

-

-    /**

-     * Creates a new {@link GeneratorAdapter}.

-     * 

-     * @param mv the method visitor to which this adapter delegates calls.

-     * @param access the method's access flags (see {@link Opcodes}).

-     * @param name the method's name.

-     * @param desc the method's descriptor (see {@link Type Type}).

-     */

-    public GeneratorAdapter(

-        final MethodVisitor mv,

-        final int access,

-        final String name,

-        final String desc)

-    {

-        super(access, desc, mv);

-        this.access = access;

-        this.returnType = Type.getReturnType(desc);

-        this.argumentTypes = Type.getArgumentTypes(desc);

-    }

-

-    /**

-     * Creates a new {@link GeneratorAdapter}.

-     * 

-     * @param access access flags of the adapted method.

-     * @param method the adapted method.

-     * @param mv the method visitor to which this adapter delegates calls.

-     */

-    public GeneratorAdapter(

-        final int access,

-        final Method method,

-        final MethodVisitor mv)

-    {

-        super(access, method.getDescriptor(), mv);

-        this.access = access;

-        this.returnType = method.getReturnType();

-        this.argumentTypes = method.getArgumentTypes();

-    }

-

-    /**

-     * Creates a new {@link GeneratorAdapter}.

-     * 

-     * @param access access flags of the adapted method.

-     * @param method the adapted method.

-     * @param signature the signature of the adapted method (may be

-     *        <tt>null</tt>).

-     * @param exceptions the exceptions thrown by the adapted method (may be

-     *        <tt>null</tt>).

-     * @param cv the class visitor to which this adapter delegates calls.

-     */

-    public GeneratorAdapter(

-        final int access,

-        final Method method,

-        final String signature,

-        final Type[] exceptions,

-        final ClassVisitor cv)

-    {

-        this(access, method, cv.visitMethod(access,

-                method.getName(),

-                method.getDescriptor(),

-                signature,

-                getInternalNames(exceptions)));

-    }

-

-    /**

-     * Returns the internal names of the given types.

-     * 

-     * @param types a set of types.

-     * @return the internal names of the given types.

-     */

-    private static String[] getInternalNames(final Type[] types) {

-        if (types == null) {

-            return null;

-        }

-        String[] names = new String[types.length];

-        for (int i = 0; i < names.length; ++i) {

-            names[i] = types[i].getInternalName();

-        }

-        return names;

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to push constants on the stack

-    // ------------------------------------------------------------------------

-

-    /**

-     * Generates the instruction to push the given value on the stack.

-     * 

-     * @param value the value to be pushed on the stack.

-     */

-    public void push(final boolean value) {

-        push(value ? 1 : 0);

-    }

-

-    /**

-     * Generates the instruction to push the given value on the stack.

-     * 

-     * @param value the value to be pushed on the stack.

-     */

-    public void push(final int value) {

-        if (value >= -1 && value <= 5) {

-            mv.visitInsn(Opcodes.ICONST_0 + value);

-        } else if (value >= Byte.MIN_VALUE && value <= Byte.MAX_VALUE) {

-            mv.visitIntInsn(Opcodes.BIPUSH, value);

-        } else if (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE) {

-            mv.visitIntInsn(Opcodes.SIPUSH, value);

-        } else {

-            mv.visitLdcInsn(new Integer(value));

-        }

-    }

-

-    /**

-     * Generates the instruction to push the given value on the stack.

-     * 

-     * @param value the value to be pushed on the stack.

-     */

-    public void push(final long value) {

-        if (value == 0L || value == 1L) {

-            mv.visitInsn(Opcodes.LCONST_0 + (int) value);

-        } else {

-            mv.visitLdcInsn(new Long(value));

-        }

-    }

-

-    /**

-     * Generates the instruction to push the given value on the stack.

-     * 

-     * @param value the value to be pushed on the stack.

-     */

-    public void push(final float value) {

-        int bits = Float.floatToIntBits(value);

-        if (bits == 0L || bits == 0x3f800000 || bits == 0x40000000) { // 0..2

-            mv.visitInsn(Opcodes.FCONST_0 + (int) value);

-        } else {

-            mv.visitLdcInsn(new Float(value));

-        }

-    }

-

-    /**

-     * Generates the instruction to push the given value on the stack.

-     * 

-     * @param value the value to be pushed on the stack.

-     */

-    public void push(final double value) {

-        long bits = Double.doubleToLongBits(value);

-        if (bits == 0L || bits == 0x3ff0000000000000L) { // +0.0d and 1.0d

-            mv.visitInsn(Opcodes.DCONST_0 + (int) value);

-        } else {

-            mv.visitLdcInsn(new Double(value));

-        }

-    }

-

-    /**

-     * Generates the instruction to push the given value on the stack.

-     * 

-     * @param value the value to be pushed on the stack. May be <tt>null</tt>.

-     */

-    public void push(final String value) {

-        if (value == null) {

-            mv.visitInsn(Opcodes.ACONST_NULL);

-        } else {

-            mv.visitLdcInsn(value);

-        }

-    }

-

-    /**

-     * Generates the instruction to push the given value on the stack.

-     * 

-     * @param value the value to be pushed on the stack.

-     */

-    public void push(final Type value) {

-        if (value == null) {

-            mv.visitInsn(Opcodes.ACONST_NULL);

-        } else {

-            mv.visitLdcInsn(value);

-        }

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to load and store method arguments

-    // ------------------------------------------------------------------------

-

-    /**

-     * Returns the index of the given method argument in the frame's local

-     * variables array.

-     * 

-     * @param arg the index of a method argument.

-     * @return the index of the given method argument in the frame's local

-     *         variables array.

-     */

-    private int getArgIndex(final int arg) {

-        int index = (access & Opcodes.ACC_STATIC) == 0 ? 1 : 0;

-        for (int i = 0; i < arg; i++) {

-            index += argumentTypes[i].getSize();

-        }

-        return index;

-    }

-

-    /**

-     * Generates the instruction to push a local variable on the stack.

-     * 

-     * @param type the type of the local variable to be loaded.

-     * @param index an index in the frame's local variables array.

-     */

-    private void loadInsn(final Type type, final int index) {

-        mv.visitVarInsn(type.getOpcode(Opcodes.ILOAD), index);

-    }

-

-    /**

-     * Generates the instruction to store the top stack value in a local

-     * variable.

-     * 

-     * @param type the type of the local variable to be stored.

-     * @param index an index in the frame's local variables array.

-     */

-    private void storeInsn(final Type type, final int index) {

-        mv.visitVarInsn(type.getOpcode(Opcodes.ISTORE), index);

-    }

-

-    /**

-     * Generates the instruction to load 'this' on the stack.

-     */

-    public void loadThis() {

-        if ((access & Opcodes.ACC_STATIC) != 0) {

-            throw new IllegalStateException("no 'this' pointer within static method");

-        }

-        mv.visitVarInsn(Opcodes.ALOAD, 0);

-    }

-

-    /**

-     * Generates the instruction to load the given method argument on the stack.

-     * 

-     * @param arg the index of a method argument.

-     */

-    public void loadArg(final int arg) {

-        loadInsn(argumentTypes[arg], getArgIndex(arg));

-    }

-

-    /**

-     * Generates the instructions to load the given method arguments on the

-     * stack.

-     * 

-     * @param arg the index of the first method argument to be loaded.

-     * @param count the number of method arguments to be loaded.

-     */

-    public void loadArgs(final int arg, final int count) {

-        int index = getArgIndex(arg);

-        for (int i = 0; i < count; ++i) {

-            Type t = argumentTypes[arg + i];

-            loadInsn(t, index);

-            index += t.getSize();

-        }

-    }

-

-    /**

-     * Generates the instructions to load all the method arguments on the stack.

-     */

-    public void loadArgs() {

-        loadArgs(0, argumentTypes.length);

-    }

-

-    /**

-     * Generates the instructions to load all the method arguments on the stack,

-     * as a single object array.

-     */

-    public void loadArgArray() {

-        push(argumentTypes.length);

-        newArray(OBJECT_TYPE);

-        for (int i = 0; i < argumentTypes.length; i++) {

-            dup();

-            push(i);

-            loadArg(i);

-            box(argumentTypes[i]);

-            arrayStore(OBJECT_TYPE);

-        }

-    }

-

-    /**

-     * Generates the instruction to store the top stack value in the given

-     * method argument.

-     * 

-     * @param arg the index of a method argument.

-     */

-    public void storeArg(final int arg) {

-        storeInsn(argumentTypes[arg], getArgIndex(arg));

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to load and store local variables

-    // ------------------------------------------------------------------------

-

-    /**

-     * Returns the type of the given local variable.

-     * 

-     * @param local a local variable identifier, as returned by

-     *        {@link LocalVariablesSorter#newLocal(Type) newLocal()}.

-     * @return the type of the given local variable.

-     */

-    public Type getLocalType(final int local) {

-        return (Type) localTypes.get(local - firstLocal);

-    }

-

-    protected void setLocalType(final int local, final Type type) {

-        int index = local - firstLocal;

-        while (localTypes.size() < index + 1) {

-            localTypes.add(null);

-        }

-        localTypes.set(index, type);

-    }

-

-    /**

-     * Generates the instruction to load the given local variable on the stack.

-     * 

-     * @param local a local variable identifier, as returned by

-     *        {@link LocalVariablesSorter#newLocal(Type) newLocal()}.

-     */

-    public void loadLocal(final int local) {

-        loadInsn(getLocalType(local), local);

-    }

-

-    /**

-     * Generates the instruction to load the given local variable on the stack.

-     * 

-     * @param local a local variable identifier, as returned by

-     *        {@link LocalVariablesSorter#newLocal(Type) newLocal()}.

-     * @param type the type of this local variable.

-     */

-    public void loadLocal(final int local, final Type type) {

-        setLocalType(local, type);

-        loadInsn(type, local);

-    }

-

-    /**

-     * Generates the instruction to store the top stack value in the given local

-     * variable.

-     * 

-     * @param local a local variable identifier, as returned by

-     *        {@link LocalVariablesSorter#newLocal(Type) newLocal()}.

-     */

-    public void storeLocal(final int local) {

-        storeInsn(getLocalType(local), local);

-    }

-

-    /**

-     * Generates the instruction to store the top stack value in the given local

-     * variable.

-     * 

-     * @param local a local variable identifier, as returned by

-     *        {@link LocalVariablesSorter#newLocal(Type) newLocal()}.

-     * @param type the type of this local variable.

-     */

-    public void storeLocal(final int local, final Type type) {

-        setLocalType(local, type);

-        storeInsn(type, local);

-    }

-

-    /**

-     * Generates the instruction to load an element from an array.

-     * 

-     * @param type the type of the array element to be loaded.

-     */

-    public void arrayLoad(final Type type) {

-        mv.visitInsn(type.getOpcode(Opcodes.IALOAD));

-    }

-

-    /**

-     * Generates the instruction to store an element in an array.

-     * 

-     * @param type the type of the array element to be stored.

-     */

-    public void arrayStore(final Type type) {

-        mv.visitInsn(type.getOpcode(Opcodes.IASTORE));

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to manage the stack

-    // ------------------------------------------------------------------------

-

-    /**

-     * Generates a POP instruction.

-     */

-    public void pop() {

-        mv.visitInsn(Opcodes.POP);

-    }

-

-    /**

-     * Generates a POP2 instruction.

-     */

-    public void pop2() {

-        mv.visitInsn(Opcodes.POP2);

-    }

-

-    /**

-     * Generates a DUP instruction.

-     */

-    public void dup() {

-        mv.visitInsn(Opcodes.DUP);

-    }

-

-    /**

-     * Generates a DUP2 instruction.

-     */

-    public void dup2() {

-        mv.visitInsn(Opcodes.DUP2);

-    }

-

-    /**

-     * Generates a DUP_X1 instruction.

-     */

-    public void dupX1() {

-        mv.visitInsn(Opcodes.DUP_X1);

-    }

-

-    /**

-     * Generates a DUP_X2 instruction.

-     */

-    public void dupX2() {

-        mv.visitInsn(Opcodes.DUP_X2);

-    }

-

-    /**

-     * Generates a DUP2_X1 instruction.

-     */

-    public void dup2X1() {

-        mv.visitInsn(Opcodes.DUP2_X1);

-    }

-

-    /**

-     * Generates a DUP2_X2 instruction.

-     */

-    public void dup2X2() {

-        mv.visitInsn(Opcodes.DUP2_X2);

-    }

-

-    /**

-     * Generates a SWAP instruction.

-     */

-    public void swap() {

-        mv.visitInsn(Opcodes.SWAP);

-    }

-

-    /**

-     * Generates the instructions to swap the top two stack values.

-     * 

-     * @param prev type of the top - 1 stack value.

-     * @param type type of the top stack value.

-     */

-    public void swap(final Type prev, final Type type) {

-        if (type.getSize() == 1) {

-            if (prev.getSize() == 1) {

-                swap(); // same as dupX1(), pop();

-            } else {

-                dupX2();

-                pop();

-            }

-        } else {

-            if (prev.getSize() == 1) {

-                dup2X1();

-                pop2();

-            } else {

-                dup2X2();

-                pop2();

-            }

-        }

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to do mathematical and logical operations

-    // ------------------------------------------------------------------------

-

-    /**

-     * Generates the instruction to do the specified mathematical or logical

-     * operation.

-     * 

-     * @param op a mathematical or logical operation. Must be one of ADD, SUB,

-     *        MUL, DIV, REM, NEG, SHL, SHR, USHR, AND, OR, XOR.

-     * @param type the type of the operand(s) for this operation.

-     */

-    public void math(final int op, final Type type) {

-        mv.visitInsn(type.getOpcode(op));

-    }

-

-    /**

-     * Generates the instructions to compute the bitwise negation of the top

-     * stack value.

-     */

-    public void not() {

-        mv.visitInsn(Opcodes.ICONST_1);

-        mv.visitInsn(Opcodes.IXOR);

-    }

-

-    /**

-     * Generates the instruction to increment the given local variable.

-     * 

-     * @param local the local variable to be incremented.

-     * @param amount the amount by which the local variable must be incremented.

-     */

-    public void iinc(final int local, final int amount) {

-        mv.visitIincInsn(local, amount);

-    }

-

-    /**

-     * Generates the instructions to cast a numerical value from one type to

-     * another.

-     * 

-     * @param from the type of the top stack value

-     * @param to the type into which this value must be cast.

-     */

-    public void cast(final Type from, final Type to) {

-        if (from != to) {

-            if (from == Type.DOUBLE_TYPE) {

-                if (to == Type.FLOAT_TYPE) {

-                    mv.visitInsn(Opcodes.D2F);

-                } else if (to == Type.LONG_TYPE) {

-                    mv.visitInsn(Opcodes.D2L);

-                } else {

-                    mv.visitInsn(Opcodes.D2I);

-                    cast(Type.INT_TYPE, to);

-                }

-            } else if (from == Type.FLOAT_TYPE) {

-                if (to == Type.DOUBLE_TYPE) {

-                    mv.visitInsn(Opcodes.F2D);

-                } else if (to == Type.LONG_TYPE) {

-                    mv.visitInsn(Opcodes.F2L);

-                } else {

-                    mv.visitInsn(Opcodes.F2I);

-                    cast(Type.INT_TYPE, to);

-                }

-            } else if (from == Type.LONG_TYPE) {

-                if (to == Type.DOUBLE_TYPE) {

-                    mv.visitInsn(Opcodes.L2D);

-                } else if (to == Type.FLOAT_TYPE) {

-                    mv.visitInsn(Opcodes.L2F);

-                } else {

-                    mv.visitInsn(Opcodes.L2I);

-                    cast(Type.INT_TYPE, to);

-                }

-            } else {

-                if (to == Type.BYTE_TYPE) {

-                    mv.visitInsn(Opcodes.I2B);

-                } else if (to == Type.CHAR_TYPE) {

-                    mv.visitInsn(Opcodes.I2C);

-                } else if (to == Type.DOUBLE_TYPE) {

-                    mv.visitInsn(Opcodes.I2D);

-                } else if (to == Type.FLOAT_TYPE) {

-                    mv.visitInsn(Opcodes.I2F);

-                } else if (to == Type.LONG_TYPE) {

-                    mv.visitInsn(Opcodes.I2L);

-                } else if (to == Type.SHORT_TYPE) {

-                    mv.visitInsn(Opcodes.I2S);

-                }

-            }

-        }

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to do boxing and unboxing operations

-    // ------------------------------------------------------------------------

-

-    /**

-     * Generates the instructions to box the top stack value. This value is

-     * replaced by its boxed equivalent on top of the stack.

-     * 

-     * @param type the type of the top stack value.

-     */

-    public void box(final Type type) {

-        if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {

-            return;

-        }

-        if (type == Type.VOID_TYPE) {

-            push((String) null);

-        } else {

-            Type boxed = type;

-            switch (type.getSort()) {

-                case Type.BYTE:

-                    boxed = BYTE_TYPE;

-                    break;

-                case Type.BOOLEAN:

-                    boxed = BOOLEAN_TYPE;

-                    break;

-                case Type.SHORT:

-                    boxed = SHORT_TYPE;

-                    break;

-                case Type.CHAR:

-                    boxed = CHARACTER_TYPE;

-                    break;

-                case Type.INT:

-                    boxed = INTEGER_TYPE;

-                    break;

-                case Type.FLOAT:

-                    boxed = FLOAT_TYPE;

-                    break;

-                case Type.LONG:

-                    boxed = LONG_TYPE;

-                    break;

-                case Type.DOUBLE:

-                    boxed = DOUBLE_TYPE;

-                    break;

-            }

-            newInstance(boxed);

-            if (type.getSize() == 2) {

-                // Pp -> Ppo -> oPpo -> ooPpo -> ooPp -> o

-                dupX2();

-                dupX2();

-                pop();

-            } else {

-                // p -> po -> opo -> oop -> o

-                dupX1();

-                swap();

-            }

-            invokeConstructor(boxed, new Method("<init>",

-                    Type.VOID_TYPE,

-                    new Type[] { type }));

-        }

-    }

-

-    /**

-     * Generates the instructions to unbox the top stack value. This value is

-     * replaced by its unboxed equivalent on top of the stack.

-     * 

-     * @param type the type of the top stack value.

-     */

-    public void unbox(final Type type) {

-        Type t = NUMBER_TYPE;

-        Method sig = null;

-        switch (type.getSort()) {

-            case Type.VOID:

-                return;

-            case Type.CHAR:

-                t = CHARACTER_TYPE;

-                sig = CHAR_VALUE;

-                break;

-            case Type.BOOLEAN:

-                t = BOOLEAN_TYPE;

-                sig = BOOLEAN_VALUE;

-                break;

-            case Type.DOUBLE:

-                sig = DOUBLE_VALUE;

-                break;

-            case Type.FLOAT:

-                sig = FLOAT_VALUE;

-                break;

-            case Type.LONG:

-                sig = LONG_VALUE;

-                break;

-            case Type.INT:

-            case Type.SHORT:

-            case Type.BYTE:

-                sig = INT_VALUE;

-        }

-        if (sig == null) {

-            checkCast(type);

-        } else {

-            checkCast(t);

-            invokeVirtual(t, sig);

-        }

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to jump to other instructions

-    // ------------------------------------------------------------------------

-

-    /**

-     * Creates a new {@link Label}.

-     * 

-     * @return a new {@link Label}.

-     */

-    public Label newLabel() {

-        return new Label();

-    }

-

-    /**

-     * Marks the current code position with the given label.

-     * 

-     * @param label a label.

-     */

-    public void mark(final Label label) {

-        mv.visitLabel(label);

-    }

-

-    /**

-     * Marks the current code position with a new label.

-     * 

-     * @return the label that was created to mark the current code position.

-     */

-    public Label mark() {

-        Label label = new Label();

-        mv.visitLabel(label);

-        return label;

-    }

-

-    /**

-     * Generates the instructions to jump to a label based on the comparison of

-     * the top two stack values.

-     * 

-     * @param type the type of the top two stack values.

-     * @param mode how these values must be compared. One of EQ, NE, LT, GE, GT,

-     *        LE.

-     * @param label where to jump if the comparison result is <tt>true</tt>.

-     */

-    public void ifCmp(final Type type, final int mode, final Label label) {

-        int intOp = -1;

-        switch (type.getSort()) {

-            case Type.LONG:

-                mv.visitInsn(Opcodes.LCMP);

-                break;

-            case Type.DOUBLE:

-                mv.visitInsn(Opcodes.DCMPG);

-                break;

-            case Type.FLOAT:

-                mv.visitInsn(Opcodes.FCMPG);

-                break;

-            case Type.ARRAY:

-            case Type.OBJECT:

-                switch (mode) {

-                    case EQ:

-                        mv.visitJumpInsn(Opcodes.IF_ACMPEQ, label);

-                        return;

-                    case NE:

-                        mv.visitJumpInsn(Opcodes.IF_ACMPNE, label);

-                        return;

-                }

-                throw new IllegalArgumentException("Bad comparison for type "

-                        + type);

-            default:

-                switch (mode) {

-                    case EQ:

-                        intOp = Opcodes.IF_ICMPEQ;

-                        break;

-                    case NE:

-                        intOp = Opcodes.IF_ICMPNE;

-                        break;

-                    case GE:

-                        intOp = Opcodes.IF_ICMPGE;

-                        break;

-                    case LT:

-                        intOp = Opcodes.IF_ICMPLT;

-                        break;

-                    case LE:

-                        intOp = Opcodes.IF_ICMPLE;

-                        break;

-                    case GT:

-                        intOp = Opcodes.IF_ICMPGT;

-                        break;

-                }

-                mv.visitJumpInsn(intOp, label);

-                return;

-        }

-        int jumpMode = mode;

-        switch (mode) {

-            case GE:

-                jumpMode = LT;

-                break;

-            case LE:

-                jumpMode = GT;

-                break;

-        }

-        mv.visitJumpInsn(jumpMode, label);

-    }

-

-    /**

-     * Generates the instructions to jump to a label based on the comparison of

-     * the top two integer stack values.

-     * 

-     * @param mode how these values must be compared. One of EQ, NE, LT, GE, GT,

-     *        LE.

-     * @param label where to jump if the comparison result is <tt>true</tt>.

-     */

-    public void ifICmp(final int mode, final Label label) {

-        ifCmp(Type.INT_TYPE, mode, label);

-    }

-

-    /**

-     * Generates the instructions to jump to a label based on the comparison of

-     * the top integer stack value with zero.

-     * 

-     * @param mode how these values must be compared. One of EQ, NE, LT, GE, GT,

-     *        LE.

-     * @param label where to jump if the comparison result is <tt>true</tt>.

-     */

-    public void ifZCmp(final int mode, final Label label) {

-        mv.visitJumpInsn(mode, label);

-    }

-

-    /**

-     * Generates the instruction to jump to the given label if the top stack

-     * value is null.

-     * 

-     * @param label where to jump if the condition is <tt>true</tt>.

-     */

-    public void ifNull(final Label label) {

-        mv.visitJumpInsn(Opcodes.IFNULL, label);

-    }

-

-    /**

-     * Generates the instruction to jump to the given label if the top stack

-     * value is not null.

-     * 

-     * @param label where to jump if the condition is <tt>true</tt>.

-     */

-    public void ifNonNull(final Label label) {

-        mv.visitJumpInsn(Opcodes.IFNONNULL, label);

-    }

-

-    /**

-     * Generates the instruction to jump to the given label.

-     * 

-     * @param label where to jump if the condition is <tt>true</tt>.

-     */

-    public void goTo(final Label label) {

-        mv.visitJumpInsn(Opcodes.GOTO, label);

-    }

-

-    /**

-     * Generates a RET instruction.

-     * 

-     * @param local a local variable identifier, as returned by

-     *        {@link LocalVariablesSorter#newLocal(Type) newLocal()}.

-     */

-    public void ret(final int local) {

-        mv.visitVarInsn(Opcodes.RET, local);

-    }

-

-    /**

-     * Generates the instructions for a switch statement.

-     * 

-     * @param keys the switch case keys.

-     * @param generator a generator to generate the code for the switch cases.

-     */

-    public void tableSwitch(

-        final int[] keys,

-        final TableSwitchGenerator generator)

-    {

-        float density;

-        if (keys.length == 0) {

-            density = 0;

-        } else {

-            density = (float) keys.length

-                    / (keys[keys.length - 1] - keys[0] + 1);

-        }

-        tableSwitch(keys, generator, density >= 0.5f);

-    }

-

-    /**

-     * Generates the instructions for a switch statement.

-     * 

-     * @param keys the switch case keys.

-     * @param generator a generator to generate the code for the switch cases.

-     * @param useTable <tt>true</tt> to use a TABLESWITCH instruction, or

-     *        <tt>false</tt> to use a LOOKUPSWITCH instruction.

-     */

-    public void tableSwitch(

-        final int[] keys,

-        final TableSwitchGenerator generator,

-        final boolean useTable)

-    {

-        for (int i = 1; i < keys.length; ++i) {

-            if (keys[i] < keys[i - 1]) {

-                throw new IllegalArgumentException("keys must be sorted ascending");

-            }

-        }

-        Label def = newLabel();

-        Label end = newLabel();

-        if (keys.length > 0) {

-            int len = keys.length;

-            int min = keys[0];

-            int max = keys[len - 1];

-            int range = max - min + 1;

-            if (useTable) {

-                Label[] labels = new Label[range];

-                Arrays.fill(labels, def);

-                for (int i = 0; i < len; ++i) {

-                    labels[keys[i] - min] = newLabel();

-                }

-                mv.visitTableSwitchInsn(min, max, def, labels);

-                for (int i = 0; i < range; ++i) {

-                    Label label = labels[i];

-                    if (label != def) {

-                        mark(label);

-                        generator.generateCase(i + min, end);

-                    }

-                }

-            } else {

-                Label[] labels = new Label[len];

-                for (int i = 0; i < len; ++i) {

-                    labels[i] = newLabel();

-                }

-                mv.visitLookupSwitchInsn(def, keys, labels);

-                for (int i = 0; i < len; ++i) {

-                    mark(labels[i]);

-                    generator.generateCase(keys[i], end);

-                }

-            }

-        }

-        mark(def);

-        generator.generateDefault();

-        mark(end);

-    }

-

-    /**

-     * Generates the instruction to return the top stack value to the caller.

-     */

-    public void returnValue() {

-        mv.visitInsn(returnType.getOpcode(Opcodes.IRETURN));

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to load and store fields

-    // ------------------------------------------------------------------------

-

-    /**

-     * Generates a get field or set field instruction.

-     * 

-     * @param opcode the instruction's opcode.

-     * @param ownerType the class in which the field is defined.

-     * @param name the name of the field.

-     * @param fieldType the type of the field.

-     */

-    private void fieldInsn(

-        final int opcode,

-        final Type ownerType,

-        final String name,

-        final Type fieldType)

-    {

-        mv.visitFieldInsn(opcode,

-                ownerType.getInternalName(),

-                name,

-                fieldType.getDescriptor());

-    }

-

-    /**

-     * Generates the instruction to push the value of a static field on the

-     * stack.

-     * 

-     * @param owner the class in which the field is defined.

-     * @param name the name of the field.

-     * @param type the type of the field.

-     */

-    public void getStatic(final Type owner, final String name, final Type type)

-    {

-        fieldInsn(Opcodes.GETSTATIC, owner, name, type);

-    }

-

-    /**

-     * Generates the instruction to store the top stack value in a static field.

-     * 

-     * @param owner the class in which the field is defined.

-     * @param name the name of the field.

-     * @param type the type of the field.

-     */

-    public void putStatic(final Type owner, final String name, final Type type)

-    {

-        fieldInsn(Opcodes.PUTSTATIC, owner, name, type);

-    }

-

-    /**

-     * Generates the instruction to push the value of a non static field on the

-     * stack.

-     * 

-     * @param owner the class in which the field is defined.

-     * @param name the name of the field.

-     * @param type the type of the field.

-     */

-    public void getField(final Type owner, final String name, final Type type) {

-        fieldInsn(Opcodes.GETFIELD, owner, name, type);

-    }

-

-    /**

-     * Generates the instruction to store the top stack value in a non static

-     * field.

-     * 

-     * @param owner the class in which the field is defined.

-     * @param name the name of the field.

-     * @param type the type of the field.

-     */

-    public void putField(final Type owner, final String name, final Type type) {

-        fieldInsn(Opcodes.PUTFIELD, owner, name, type);

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to invoke methods

-    // ------------------------------------------------------------------------

-

-    /**

-     * Generates an invoke method instruction.

-     * 

-     * @param opcode the instruction's opcode.

-     * @param type the class in which the method is defined.

-     * @param method the method to be invoked.

-     */

-    private void invokeInsn(

-        final int opcode,

-        final Type type,

-        final Method method)

-    {

-        String owner = type.getSort() == Type.ARRAY

-                ? type.getDescriptor()

-                : type.getInternalName();

-        mv.visitMethodInsn(opcode,

-                owner,

-                method.getName(),

-                method.getDescriptor());

-    }

-

-    /**

-     * Generates the instruction to invoke a normal method.

-     * 

-     * @param owner the class in which the method is defined.

-     * @param method the method to be invoked.

-     */

-    public void invokeVirtual(final Type owner, final Method method) {

-        invokeInsn(Opcodes.INVOKEVIRTUAL, owner, method);

-    }

-

-    /**

-     * Generates the instruction to invoke a constructor.

-     * 

-     * @param type the class in which the constructor is defined.

-     * @param method the constructor to be invoked.

-     */

-    public void invokeConstructor(final Type type, final Method method) {

-        invokeInsn(Opcodes.INVOKESPECIAL, type, method);

-    }

-

-    /**

-     * Generates the instruction to invoke a static method.

-     * 

-     * @param owner the class in which the method is defined.

-     * @param method the method to be invoked.

-     */

-    public void invokeStatic(final Type owner, final Method method) {

-        invokeInsn(Opcodes.INVOKESTATIC, owner, method);

-    }

-

-    /**

-     * Generates the instruction to invoke an interface method.

-     * 

-     * @param owner the class in which the method is defined.

-     * @param method the method to be invoked.

-     */

-    public void invokeInterface(final Type owner, final Method method) {

-        invokeInsn(Opcodes.INVOKEINTERFACE, owner, method);

-    }

-

-    // ------------------------------------------------------------------------

-    // Instructions to create objects and arrays

-    // ------------------------------------------------------------------------

-

-    /**

-     * Generates a type dependent instruction.

-     * 

-     * @param opcode the instruction's opcode.

-     * @param type the instruction's operand.

-     */

-    private void typeInsn(final int opcode, final Type type) {

-        String desc;

-        if (type.getSort() == Type.ARRAY) {

-            desc = type.getDescriptor();

-        } else {

-            desc = type.getInternalName();

-        }

-        mv.visitTypeInsn(opcode, desc);

-    }

-

-    /**

-     * Generates the instruction to create a new object.

-     * 

-     * @param type the class of the object to be created.

-     */

-    public void newInstance(final Type type) {

-        typeInsn(Opcodes.NEW, type);

-    }

-

-    /**

-     * Generates the instruction to create a new array.

-     * 

-     * @param type the type of the array elements.

-     */

-    public void newArray(final Type type) {

-        int typ;

-        switch (type.getSort()) {

-            case Type.BOOLEAN:

-                typ = Opcodes.T_BOOLEAN;

-                break;

-            case Type.CHAR:

-                typ = Opcodes.T_CHAR;

-                break;

-            case Type.BYTE:

-                typ = Opcodes.T_BYTE;

-                break;

-            case Type.SHORT:

-                typ = Opcodes.T_SHORT;

-                break;

-            case Type.INT:

-                typ = Opcodes.T_INT;

-                break;

-            case Type.FLOAT:

-                typ = Opcodes.T_FLOAT;

-                break;

-            case Type.LONG:

-                typ = Opcodes.T_LONG;

-                break;

-            case Type.DOUBLE:

-                typ = Opcodes.T_DOUBLE;

-                break;

-            default:

-                typeInsn(Opcodes.ANEWARRAY, type);

-                return;

-        }

-        mv.visitIntInsn(Opcodes.NEWARRAY, typ);

-    }

-

-    // ------------------------------------------------------------------------

-    // Miscelaneous instructions

-    // ------------------------------------------------------------------------

-

-    /**

-     * Generates the instruction to compute the length of an array.

-     */

-    public void arrayLength() {

-        mv.visitInsn(Opcodes.ARRAYLENGTH);

-    }

-

-    /**

-     * Generates the instruction to throw an exception.

-     */

-    public void throwException() {

-        mv.visitInsn(Opcodes.ATHROW);

-    }

-

-    /**

-     * Generates the instructions to create and throw an exception. The

-     * exception class must have a constructor with a single String argument.

-     * 

-     * @param type the class of the exception to be thrown.

-     * @param msg the detailed message of the exception.

-     */

-    public void throwException(final Type type, final String msg) {

-        newInstance(type);

-        dup();

-        push(msg);

-        invokeConstructor(type, Method.getMethod("void <init> (String)"));

-        throwException();

-    }

-

-    /**

-     * Generates the instruction to check that the top stack value is of the

-     * given type.

-     * 

-     * @param type a class or interface type.

-     */

-    public void checkCast(final Type type) {

-        if (!type.equals(OBJECT_TYPE)) {

-            typeInsn(Opcodes.CHECKCAST, type);

-        }

-    }

-

-    /**

-     * Generates the instruction to test if the top stack value is of the given

-     * type.

-     * 

-     * @param type a class or interface type.

-     */

-    public void instanceOf(final Type type) {

-        typeInsn(Opcodes.INSTANCEOF, type);

-    }

-

-    /**

-     * Generates the instruction to get the monitor of the top stack value.

-     */

-    public void monitorEnter() {

-        mv.visitInsn(Opcodes.MONITORENTER);

-    }

-

-    /**

-     * Generates the instruction to release the monitor of the top stack value.

-     */

-    public void monitorExit() {

-        mv.visitInsn(Opcodes.MONITOREXIT);

-    }

-

-    // ------------------------------------------------------------------------

-    // Non instructions

-    // ------------------------------------------------------------------------

-

-    /**

-     * Marks the end of the visited method.

-     */

-    public void endMethod() {

-        if ((access & Opcodes.ACC_ABSTRACT) == 0) {

-            mv.visitMaxs(0, 0);

-        }

-        mv.visitEnd();

-    }

-

-    /**

-     * Marks the start of an exception handler.

-     * 

-     * @param start beginning of the exception handler's scope (inclusive).

-     * @param end end of the exception handler's scope (exclusive).

-     * @param exception internal name of the type of exceptions handled by the

-     *        handler.

-     */

-    public void catchException(

-        final Label start,

-        final Label end,

-        final Type exception)

-    {

-        mv.visitTryCatchBlock(start, end, mark(), exception.getInternalName());

-    }

-}

diff --git a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/LocalVariablesSorter.java b/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/LocalVariablesSorter.java
deleted file mode 100644
index 96c8283..0000000
--- a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/LocalVariablesSorter.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/***

- * ASM: a very small and fast Java bytecode manipulation framework

- * Copyright (c) 2000-2005 INRIA, France Telecom

- * All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions

- * are met:

- * 1. Redistributions of source code must retain the above copyright

- *    notice, this list of conditions and the following disclaimer.

- * 2. Redistributions in binary form must reproduce the above copyright

- *    notice, this list of conditions and the following disclaimer in the

- *    documentation and/or other materials provided with the distribution.

- * 3. Neither the name of the copyright holders nor the names of its

- *    contributors may be used to endorse or promote products derived from

- *    this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF

- * THE POSSIBILITY OF SUCH DAMAGE.

- */

-package org.objectweb.asm.commons;

-

-import org.objectweb.asm.Label;

-import org.objectweb.asm.MethodAdapter;

-import org.objectweb.asm.MethodVisitor;

-import org.objectweb.asm.Opcodes;

-import org.objectweb.asm.Type;

-

-/**

- * A {@link MethodAdapter} that renumbers local variables in their order of

- * appearance. This adapter allows one to easily add new local variables to a

- * method. It may be used by inheriting from this class, but the preferred way

- * of using it is via delegation: the next visitor in the chain can indeed add

- * new locals when needed by calling {@link #newLocal} on this adapter (this

- * requires a reference back to this {@link LocalVariablesSorter}).

- * 

- * @author Chris Nokleberg

- * @author Eugene Kuleshov

- * @author Eric Bruneton

- */

-public class LocalVariablesSorter extends MethodAdapter {

-

-    private final static Type OBJECT_TYPE = Type.getObjectType("java/lang/Object");

-

-    /**

-     * Mapping from old to new local variable indexes. A local variable at index

-     * i of size 1 is remapped to 'mapping[2*i]', while a local variable at

-     * index i of size 2 is remapped to 'mapping[2*i+1]'.

-     */

-    private int[] mapping = new int[40];

-

-    /**

-     * Array used to store stack map local variable types after remapping.

-     */

-    private Object[] newLocals = new Object[20];

-

-    /**

-     * Index of the first local variable, after formal parameters.

-     */

-    protected final int firstLocal;

-

-    /**

-     * Index of the next local variable to be created by {@link #newLocal}.

-     */

-    protected int nextLocal;

-

-    /**

-     * Indicates if at least one local variable has moved due to remapping.

-     */

-    private boolean changed;

-

-    /**

-     * Creates a new {@link LocalVariablesSorter}.

-     * 

-     * @param access access flags of the adapted method.

-     * @param desc the method's descriptor (see {@link Type Type}).

-     * @param mv the method visitor to which this adapter delegates calls.

-     */

-    public LocalVariablesSorter(

-        final int access,

-        final String desc,

-        final MethodVisitor mv)

-    {

-        super(mv);

-        Type[] args = Type.getArgumentTypes(desc);

-        nextLocal = (Opcodes.ACC_STATIC & access) != 0 ? 0 : 1;

-        for (int i = 0; i < args.length; i++) {

-            nextLocal += args[i].getSize();

-        }

-        firstLocal = nextLocal;

-    }

-

-    public void visitVarInsn(final int opcode, final int var) {

-        Type type;

-        switch (opcode) {

-            case Opcodes.LLOAD:

-            case Opcodes.LSTORE:

-                type = Type.LONG_TYPE;

-                break;

-

-            case Opcodes.DLOAD:

-            case Opcodes.DSTORE:

-                type = Type.DOUBLE_TYPE;

-                break;

-

-            case Opcodes.FLOAD:

-            case Opcodes.FSTORE:

-                type = Type.FLOAT_TYPE;

-                break;

-

-            case Opcodes.ILOAD:

-            case Opcodes.ISTORE:

-                type = Type.INT_TYPE;

-                break;

-

-            case Opcodes.ALOAD:

-            case Opcodes.ASTORE:

-                type = OBJECT_TYPE;

-                break;

-

-            // case RET:

-            default:

-                type = Type.VOID_TYPE;

-        }

-        mv.visitVarInsn(opcode, remap(var, type));

-    }

-

-    public void visitIincInsn(final int var, final int increment) {

-        mv.visitIincInsn(remap(var, Type.INT_TYPE), increment);

-    }

-

-    public void visitMaxs(final int maxStack, final int maxLocals) {

-        mv.visitMaxs(maxStack, nextLocal);

-    }

-

-    public void visitLocalVariable(

-        final String name,

-        final String desc,

-        final String signature,

-        final Label start,

-        final Label end,

-        final int index)

-    {

-        int size = "J".equals(desc) || "D".equals(desc) ? 2 : 1;

-        int newIndex = remap(index, size);

-        mv.visitLocalVariable(name, desc, signature, start, end, newIndex);

-    }

-

-    public void visitFrame(

-        final int type,

-        final int nLocal,

-        final Object[] local,

-        final int nStack,

-        final Object[] stack)

-    {

-        if (type != Opcodes.F_NEW) { // uncompressed frame

-            throw new IllegalStateException("ClassReader.accept() should be called with EXPAND_FRAMES flag");

-        }

-

-        if (!changed) { // optimization for the case where mapping = identity

-            mv.visitFrame(type, nLocal, local, nStack, stack);

-            return;

-        }

-

-        // creates a copy of newLocals

-        Object[] oldLocals = new Object[newLocals.length];

-        System.arraycopy(newLocals, 0, oldLocals, 0, oldLocals.length);

-

-        // copies types from 'local' to 'newLocals'

-        // 'newLocals' already contains the variables added with 'newLocal'

-

-        int index = 0; // old local variable index

-        int number = 0; // old local variable number

-        for (; number < nLocal; ++number) {

-            Object t = local[number];

-            int size = t == Opcodes.LONG || t == Opcodes.DOUBLE ? 2 : 1;

-            if (t != Opcodes.TOP) {

-                setFrameLocal(remap(index, size), t);

-            }

-            index += size;

-        }

-

-        // removes TOP after long and double types as well as trailing TOPs

-

-        index = 0;

-        number = 0;

-        for (int i = 0; index < newLocals.length; ++i) {

-            Object t = newLocals[index++];

-            if (t != null && t != Opcodes.TOP) {

-                newLocals[i] = t;

-                number = i + 1;

-                if (t == Opcodes.LONG || t == Opcodes.DOUBLE) {

-                    index += 1;

-                }

-            } else {

-                newLocals[i] = Opcodes.TOP;

-            }

-        }

-

-        // visits remapped frame

-        mv.visitFrame(type, number, newLocals, nStack, stack);

-

-        // restores original value of 'newLocals'

-        newLocals = oldLocals;

-    }

-

-    // -------------

-

-    /**

-     * Creates a new local variable of the given type.

-     * 

-     * @param type the type of the local variable to be created.

-     * @return the identifier of the newly created local variable.

-     */

-    public int newLocal(final Type type) {

-        Object t;

-        switch (type.getSort()) {

-            case Type.BOOLEAN:

-            case Type.CHAR:

-            case Type.BYTE:

-            case Type.SHORT:

-            case Type.INT:

-                t = Opcodes.INTEGER;

-                break;

-            case Type.FLOAT:

-                t = Opcodes.FLOAT;

-                break;

-            case Type.LONG:

-                t = Opcodes.LONG;

-                break;

-            case Type.DOUBLE:

-                t = Opcodes.DOUBLE;

-                break;

-            case Type.ARRAY:

-                t = type.getDescriptor();

-                break;

-            // case Type.OBJECT:

-            default:

-                t = type.getInternalName();

-                break;

-        }

-        int local = nextLocal;

-        setLocalType(local, type);

-        setFrameLocal(local, t);

-        nextLocal += type.getSize();

-        return local;

-    }

-

-    /**

-     * Sets the current type of the given local variable. The default

-     * implementation of this method does nothing.

-     * 

-     * @param local a local variable identifier, as returned by {@link #newLocal

-     *        newLocal()}.

-     * @param type the type of the value being stored in the local variable

-     */

-    protected void setLocalType(final int local, final Type type) {

-    }

-

-    private void setFrameLocal(final int local, final Object type) {

-        int l = newLocals.length;

-        if (local >= l) {

-            Object[] a = new Object[Math.max(2 * l, local + 1)];

-            System.arraycopy(newLocals, 0, a, 0, l);

-            newLocals = a;

-        }

-        newLocals[local] = type;

-    }

-

-    private int remap(final int var, final Type type) {

-        if (var < firstLocal) {

-            return var;

-        }

-        int key = 2 * var + type.getSize() - 1;

-        int size = mapping.length;

-        if (key >= size) {

-            int[] newMapping = new int[Math.max(2 * size, key + 1)];

-            System.arraycopy(mapping, 0, newMapping, 0, size);

-            mapping = newMapping;

-        }

-        int value = mapping[key];

-        if (value == 0) {

-            value = nextLocal + 1;

-            mapping[key] = value;

-            setLocalType(nextLocal, type);

-            nextLocal += type.getSize();

-        }

-        if (value - 1 != var) {

-            changed = true;

-        }

-        return value - 1;

-    }

-

-    private int remap(final int var, final int size) {

-        if (var < firstLocal || !changed) {

-            return var;

-        }

-        int key = 2 * var + size - 1;

-        int value = key < mapping.length ? mapping[key] : 0;

-        if (value == 0) {

-            throw new IllegalStateException("Unknown local variable " + var);

-        }

-        return value - 1;

-    }

-}

diff --git a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/Method.java b/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/Method.java
deleted file mode 100644
index e177d90..0000000
--- a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/Method.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/***

- * ASM: a very small and fast Java bytecode manipulation framework

- * Copyright (c) 2000-2005 INRIA, France Telecom

- * All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions

- * are met:

- * 1. Redistributions of source code must retain the above copyright

- *    notice, this list of conditions and the following disclaimer.

- * 2. Redistributions in binary form must reproduce the above copyright

- *    notice, this list of conditions and the following disclaimer in the

- *    documentation and/or other materials provided with the distribution.

- * 3. Neither the name of the copyright holders nor the names of its

- *    contributors may be used to endorse or promote products derived from

- *    this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF

- * THE POSSIBILITY OF SUCH DAMAGE.

- */

-package org.objectweb.asm.commons;

-

-import java.util.HashMap;

-import java.util.Map;

-

-import org.objectweb.asm.Type;

-

-/**

- * A named method descriptor.

- * 

- * @author Juozas Baliuka

- * @author Chris Nokleberg

- * @author Eric Bruneton

- */

-public class Method {

-

-    /**

-     * The method name.

-     */

-    private final String name;

-

-    /**

-     * The method descriptor.

-     */

-    private final String desc;

-

-    /**

-     * Maps primitive Java type names to their descriptors.

-     */

-    private final static Map DESCRIPTORS;

-

-    static {

-        DESCRIPTORS = new HashMap();

-        DESCRIPTORS.put("void", "V");

-        DESCRIPTORS.put("byte", "B");

-        DESCRIPTORS.put("char", "C");

-        DESCRIPTORS.put("double", "D");

-        DESCRIPTORS.put("float", "F");

-        DESCRIPTORS.put("int", "I");

-        DESCRIPTORS.put("long", "J");

-        DESCRIPTORS.put("short", "S");

-        DESCRIPTORS.put("boolean", "Z");

-    }

-

-    /**

-     * Creates a new {@link Method}.

-     * 

-     * @param name the method's name.

-     * @param desc the method's descriptor.

-     */

-    public Method(final String name, final String desc) {

-        this.name = name;

-        this.desc = desc;

-    }

-

-    /**

-     * Creates a new {@link Method}.

-     * 

-     * @param name the method's name.

-     * @param returnType the method's return type.

-     * @param argumentTypes the method's argument types.

-     */

-    public Method(

-        final String name,

-        final Type returnType,

-        final Type[] argumentTypes)

-    {

-        this(name, Type.getMethodDescriptor(returnType, argumentTypes));

-    }

-

-    /**

-     * Returns a {@link Method} corresponding to the given Java method

-     * declaration.

-     * 

-     * @param method a Java method declaration, without argument names, of the

-     *        form "returnType name (argumentType1, ... argumentTypeN)", where

-     *        the types are in plain Java (e.g. "int", "float",

-     *        "java.util.List", ...). Classes of the java.lang package can be

-     *        specified by their unqualified name; all other classes names must

-     *        be fully qualified.

-     * @return a {@link Method} corresponding to the given Java method

-     *         declaration.

-     * @throws IllegalArgumentException if <code>method</code> could not get

-     *         parsed.

-     */

-    public static Method getMethod(final String method)

-            throws IllegalArgumentException

-    {

-        return getMethod(method, false);

-    }

-

-    /**

-     * Returns a {@link Method} corresponding to the given Java method

-     * declaration.

-     * 

-     * @param method a Java method declaration, without argument names, of the

-     *        form "returnType name (argumentType1, ... argumentTypeN)", where

-     *        the types are in plain Java (e.g. "int", "float",

-     *        "java.util.List", ...). Classes of the java.lang package may be

-     *        specified by their unqualified name, depending on the

-     *        defaultPackage argument; all other classes names must be fully

-     *        qualified.

-     * @param defaultPackage true if unqualified class names belong to the

-     *        default package, or false if they correspond to java.lang classes.

-     *        For instance "Object" means "Object" if this option is true, or

-     *        "java.lang.Object" otherwise.

-     * @return a {@link Method} corresponding to the given Java method

-     *         declaration.

-     * @throws IllegalArgumentException if <code>method</code> could not get

-     *         parsed.

-     */

-    public static Method getMethod(

-        final String method,

-        final boolean defaultPackage) throws IllegalArgumentException

-    {

-        int space = method.indexOf(' ');

-        int start = method.indexOf('(', space) + 1;

-        int end = method.indexOf(')', start);

-        if (space == -1 || start == -1 || end == -1) {

-            throw new IllegalArgumentException();

-        }

-        // TODO: Check validity of returnType, methodName and arguments.

-        String returnType = method.substring(0, space);

-        String methodName = method.substring(space + 1, start - 1).trim();

-        StringBuffer sb = new StringBuffer();

-        sb.append('(');

-        int p;

-        do {

-            String s;

-            p = method.indexOf(',', start);

-            if (p == -1) {

-                s = map(method.substring(start, end).trim(), defaultPackage);

-            } else {

-                s = map(method.substring(start, p).trim(), defaultPackage);

-                start = p + 1;

-            }

-            sb.append(s);

-        } while (p != -1);

-        sb.append(')');

-        sb.append(map(returnType, defaultPackage));

-        return new Method(methodName, sb.toString());

-    }

-

-    private static String map(final String type, final boolean defaultPackage) {

-        if (type.equals("")) {

-            return type;

-        }

-

-        StringBuffer sb = new StringBuffer();

-        int index = 0;

-        while ((index = type.indexOf("[]", index) + 1) > 0) {

-            sb.append('[');

-        }

-

-        String t = type.substring(0, type.length() - sb.length() * 2);

-        String desc = (String) DESCRIPTORS.get(t);

-        if (desc != null) {

-            sb.append(desc);

-        } else {

-            sb.append('L');

-            if (t.indexOf('.') < 0) {

-                if (!defaultPackage) {

-                    sb.append("java/lang/");

-                }

-                sb.append(t);

-            } else {

-                sb.append(t.replace('.', '/'));

-            }

-            sb.append(';');

-        }

-        return sb.toString();

-    }

-

-    /**

-     * Returns the name of the method described by this object.

-     * 

-     * @return the name of the method described by this object.

-     */

-    public String getName() {

-        return name;

-    }

-

-    /**

-     * Returns the descriptor of the method described by this object.

-     * 

-     * @return the descriptor of the method described by this object.

-     */

-    public String getDescriptor() {

-        return desc;

-    }

-

-    /**

-     * Returns the return type of the method described by this object.

-     * 

-     * @return the return type of the method described by this object.

-     */

-    public Type getReturnType() {

-        return Type.getReturnType(desc);

-    }

-

-    /**

-     * Returns the argument types of the method described by this object.

-     * 

-     * @return the argument types of the method described by this object.

-     */

-    public Type[] getArgumentTypes() {

-        return Type.getArgumentTypes(desc);

-    }

-

-    public String toString() {

-        return name + desc;

-    }

-

-    public boolean equals(final Object o) {

-        if (!(o instanceof Method)) {

-            return false;

-        }

-        Method other = (Method) o;

-        return name.equals(other.name) && desc.equals(other.desc);

-    }

-

-    public int hashCode() {

-        return name.hashCode() ^ desc.hashCode();

-    }

-}
\ No newline at end of file
diff --git a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/TableSwitchGenerator.java b/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/TableSwitchGenerator.java
deleted file mode 100644
index 54653c8..0000000
--- a/ipojo/manipulator/src/main/java/org/objectweb/asm/commons/TableSwitchGenerator.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/***

- * ASM: a very small and fast Java bytecode manipulation framework

- * Copyright (c) 2000-2005 INRIA, France Telecom

- * All rights reserved.

- *

- * Redistribution and use in source and binary forms, with or without

- * modification, are permitted provided that the following conditions

- * are met:

- * 1. Redistributions of source code must retain the above copyright

- *    notice, this list of conditions and the following disclaimer.

- * 2. Redistributions in binary form must reproduce the above copyright

- *    notice, this list of conditions and the following disclaimer in the

- *    documentation and/or other materials provided with the distribution.

- * 3. Neither the name of the copyright holders nor the names of its

- *    contributors may be used to endorse or promote products derived from

- *    this software without specific prior written permission.

- *

- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE

- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE

- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR

- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF

- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS

- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN

- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)

- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF

- * THE POSSIBILITY OF SUCH DAMAGE.

- */

-package org.objectweb.asm.commons;

-

-import org.objectweb.asm.Label;

-

-/**

- * A code generator for switch statements.

- * 

- * @author Juozas Baliuka

- * @author Chris Nokleberg

- * @author Eric Bruneton

- */

-public interface TableSwitchGenerator {

-

-    /**

-     * Generates the code for a switch case.

-     * 

-     * @param key the switch case key.

-     * @param end a label that corresponds to the end of the switch statement.

-     */

-    void generateCase(int key, Label end);

-

-    /**

-     * Generates the code for the default switch case.

-     */

-    void generateDefault();

-}