]> source.dussan.org Git - aspectj.git/commitdiff
loadtime5 java5 module
authoravasseur <avasseur>
Wed, 4 May 2005 14:39:14 +0000 (14:39 +0000)
committeravasseur <avasseur>
Wed, 4 May 2005 14:39:14 +0000 (14:39 +0000)
loadtime5/build.xml [new file with mode: 0644]
loadtime5/loadtime5.mf.txt [new file with mode: 0644]
loadtime5/src/org/aspectj/weaver/loadtime/Agent.java [new file with mode: 0644]
loadtime5/src/org/aspectj/weaver/loadtime/ClassPreProcessorAgentAdapter.java [new file with mode: 0644]

diff --git a/loadtime5/build.xml b/loadtime5/build.xml
new file mode 100644 (file)
index 0000000..97a1e2d
--- /dev/null
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<project name="loadtime5" default="all" basedir=".">
+
+    <import file="../build/build-common.xml"/>
+    <import file="../asm/build.xml"/>
+    <import file="../bridge/build.xml"/>
+    <import file="../loadtime/build.xml"/>
+    <import file="../weaver/build.xml"/>
+    <import file="../util/build.xml"/>
+    <import file="../runtime/build.xml/"/>
+    <import file="../aspectj5rt/build.xml"/>
+
+    <path id="loadtime5.src.path">
+        <pathelement path="../asm/bin"/>
+        <pathelement path="../bridge/bin"/>
+        <pathelement path="../loadtime/bin"/>
+        <pathelement path="../weaver/bin"/>
+        <fileset dir="${basedir}/../lib">
+            <include name="bcel/*.jar"/>
+        </fileset>
+    </path>
+
+    <target name="compile" depends="init,
+                                    asm.compile,
+                                    bridge.compile,
+                                    loadtime.compile,
+                                    weaver.compile" if="jdk15">
+        <!-- FIXME: we override compile due to use of 1.5 -->
+        <mkdir dir="${basedir}/bin"/>
+        <javac debug="on" destdir="${basedir}/bin" source="1.5" target="1.5">
+            <src path="${basedir}/src"/>
+            <classpath refid="loadtime5.src.path"/>
+        </javac>
+    </target>
+
+    <target name="jar" depends="compile">
+        <delete file="${build.ajdir}/jars/loadtime5.jar"/>
+        <copy file="loadtime5.mf.txt" todir="${build.ajdir}/temp" filtering="yes"/>
+        <jar destfile="${build.ajdir}/jars/loadtime5.jar" manifest="${build.ajdir}/temp/loadtime5.mf.txt">
+            <fileset dir="bin">
+                <include name="**/*"/>
+            </fileset>
+        </jar>
+        <!-- FIXME AV we can push it to lib/test as well for the AntSpec need -->
+    </target>
+
+</project>
+
diff --git a/loadtime5/loadtime5.mf.txt b/loadtime5/loadtime5.mf.txt
new file mode 100644 (file)
index 0000000..fa19c87
--- /dev/null
@@ -0,0 +1,2 @@
+Premain-Class: org.aspectj.weaver.loadtime.Agent
+Can-Redefine-Classes: true
diff --git a/loadtime5/src/org/aspectj/weaver/loadtime/Agent.java b/loadtime5/src/org/aspectj/weaver/loadtime/Agent.java
new file mode 100644 (file)
index 0000000..bb34898
--- /dev/null
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Alexandre Vasseur         initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.loadtime;
+
+import java.lang.instrument.Instrumentation;
+import java.lang.instrument.ClassFileTransformer;
+
+/**
+ * Java 1.5 preMain agent to hook in the class pre processor
+ * Can be used with -javaagent:aspectjweaver.jar
+ *
+ * @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur</a>
+ */
+public class Agent {
+
+    /**
+     * The instrumentation instance
+     */
+    private static Instrumentation s_instrumentation;
+
+    /**
+     * The ClassFileTransformer wrapping the weaver
+     */
+    private static ClassFileTransformer s_transformer = new ClassPreProcessorAgentAdapter();
+
+    /**
+     * JSR-163 preMain Agent entry method
+     *
+     * @param options
+     * @param instrumentation
+     */
+    public static void premain(String options, Instrumentation instrumentation) {
+        s_instrumentation = instrumentation;
+        s_instrumentation.addTransformer(s_transformer);
+    }
+
+    /**
+     * Returns the Instrumentation system level instance
+     */
+    public static Instrumentation getInstrumentation() {
+        if (s_instrumentation == null) {
+            throw new UnsupportedOperationException("Java 5 was not started with preMain -javaagent for AspectJ");
+        }
+        return s_instrumentation;
+    }
+
+}
diff --git a/loadtime5/src/org/aspectj/weaver/loadtime/ClassPreProcessorAgentAdapter.java b/loadtime5/src/org/aspectj/weaver/loadtime/ClassPreProcessorAgentAdapter.java
new file mode 100644 (file)
index 0000000..9e81bd1
--- /dev/null
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2005 Contributors.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   Alexandre Vasseur         initial implementation
+ *******************************************************************************/
+package org.aspectj.weaver.loadtime;
+
+import org.aspectj.weaver.loadtime.Aj;
+import org.aspectj.weaver.loadtime.ClassPreProcessor;
+
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.security.ProtectionDomain;
+
+/**
+ * Java 1.5 adapter for class pre processor
+ *
+ * @author <a href="mailto:alex@gnilux.com">Alexandre Vasseur</a>
+ */
+public class ClassPreProcessorAgentAdapter implements ClassFileTransformer {
+
+    /**
+     * Concrete preprocessor.
+     */
+    private static ClassPreProcessor s_preProcessor;
+
+    static {
+        try {
+            s_preProcessor = new Aj();
+            s_preProcessor.initialize();
+        } catch (Exception e) {
+            throw new ExceptionInInitializerError("could not initialize JSR163 preprocessor due to: " + e.toString());
+        }
+    }
+
+    /**
+     * Weaving delegation
+     *
+     * @param loader              the defining class loader
+     * @param className           the name of class beeing loaded
+     * @param classBeingRedefined when hotswap is called
+     * @param protectionDomain
+     * @param bytes               the bytecode before weaving
+     * @return the weaved bytecode
+     */
+    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
+                            ProtectionDomain protectionDomain, byte[] bytes) throws IllegalClassFormatException {
+        if (classBeingRedefined == null) {
+            return s_preProcessor.preProcess(className, bytes, loader);
+        } else {
+            //FIXME av for now we skip hotswap. We should think more about that
+            new Exception("AspectJ5 does not weave hotswapped class (" + className + ")").printStackTrace();
+            return bytes;
+        }
+    }
+
+}