001/**
002 * Copyright (c) 2011, The University of Southampton and the individual contributors.
003 * All rights reserved.
004 *
005 * Redistribution and use in source and binary forms, with or without modification,
006 * are permitted provided that the following conditions are met:
007 *
008 *   *  Redistributions of source code must retain the above copyright notice,
009 *      this list of conditions and the following disclaimer.
010 *
011 *   *  Redistributions in binary form must reproduce the above copyright notice,
012 *      this list of conditions and the following disclaimer in the documentation
013 *      and/or other materials provided with the distribution.
014 *
015 *   *  Neither the name of the University of Southampton nor the names of its
016 *      contributors may be used to endorse or promote products derived from this
017 *      software without specific prior written permission.
018 *
019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
021 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
022 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
023 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
025 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
026 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
027 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
028 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029 */
030package org.openimaj.citation;
031
032import java.io.IOException;
033import java.lang.instrument.Instrumentation;
034
035import org.openimaj.aop.MultiTransformClassFileTransformer;
036import org.openimaj.aop.agent.AgentLoader;
037
038/**
039 * Java instrumentation agent for extracting references.
040 * 
041 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk)
042 * 
043 */
044public class CitationAgent {
045        private static boolean isLoaded = false;
046        private static Instrumentation instrumentation;
047
048        /**
049         * JVM hook to statically load the javaagent at startup.
050         * 
051         * After the Java Virtual Machine (JVM) has initialized, the premain method
052         * will be called. Then the real application main method will be called.
053         * 
054         * @param args
055         * @param inst
056         * @throws Exception
057         */
058        public static void premain(String args, Instrumentation inst) throws Exception {
059                agentmain(args, inst);
060        }
061
062        /**
063         * JVM hook to dynamically load javaagent at runtime.
064         * 
065         * The agent class may have an agentmain method for use when the agent is
066         * started after VM startup.
067         * 
068         * @param args
069         * @param inst
070         * @throws Exception
071         */
072        public static void agentmain(String args, Instrumentation inst) throws Exception {
073                instrumentation = inst;
074                instrumentation.addTransformer(new MultiTransformClassFileTransformer(new ReferencesClassTransformer()));
075                isLoaded = true;
076        }
077
078        /**
079         * Programmatic hook to dynamically load {@link CitationAgent} at runtime.
080         * 
081         * @throws IOException
082         *             if an error occurs
083         */
084        public synchronized static void initialise() throws IOException {
085                if (!isLoaded) {
086                        AgentLoader.loadAgent(CitationAgent.class);
087                        isLoaded = true;
088                }
089        }
090
091        /**
092         * Is the agent loaded?
093         * 
094         * @return true if the agent is already loaded; false otherwise
095         */
096        public synchronized static boolean isLoaded() {
097                return isLoaded;
098        }
099
100        // /**
101        // * Main method that extracts an agent jar suitable for running with
102        // * <code>java -javaagent</code>.
103        // *
104        // * @param args
105        // * the filename or empty for the default
106        // * @throws IOException
107        // * if an error occurs creating the jar
108        // */
109        // public static void main(String[] args) throws IOException {
110        // File file = null;
111        //
112        // if (args.length > 0)
113        // file = new File(args[0]);
114        // else
115        // file = new File("./citation-agent.jar");
116        //
117        // AgentLoader.createAgentJar(file, CitationAgent.class);
118        // }
119}