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("Hello world!");
- * }
- * }
- * </pre>
- *
- * can be generated as follows:
- *
- * <pre>
- * ClassWriter cw = new ClassWriter(true);
- * cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
- *
- * Method m = Method.getMethod("void <init> ()");
- * 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("void main (String[])");
- * mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw);
- * mg.getStatic(Type.getType(System.class), "out", Type.getType(PrintStream.class));
- * mg.push("Hello world!");
- * mg.invokeVirtual(Type.getType(PrintStream.class), Method.getMethod("void println (String)"));
- * 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();
-}