All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.aspectj.configuration.AspectJDescriptor Maven / Gradle / Ivy

Go to download

Scripting extension for AspectJ agent. Allow java bytecode instrumentation at jvm startup by using MVEL expression and execute code from maven artifacts

The newest version!
package org.aspectj.configuration;

import org.apache.commons.io.IOUtils;
import org.aspectj.configuration.model.Aspect;
import org.aspectj.configuration.model.Configuration;
import org.aspectj.configuration.model.ContextUtils;
import org.aspectj.util.Utils;
import org.mvel2.optimizers.OptimizerFactory;
import org.mvel2.templates.TemplateRuntime;

import java.io.*;
import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.logging.Logger;

/**
 *
 */
public class AspectJDescriptor {

    public static final String DEFAULT_FILTER = "ALL_ASPECT";

    private static Logger LOGGER = Logger.getLogger(AspectJDescriptor.class.getName());

    public static String generate(Collection aspects){
        return TemplateRuntime.eval(
        "\n\t\n" +
            "@if{aspects!=null}@foreach{aspect : aspects} " +
                "\t\t" +
                "" +
                "\n" +
            "@end{} @end{}" +
            "\t\n" +
            "@if{Boolean.getBoolean(\""+ Utils.DEBUG_OPTION +"\")}\t\n@end{}" +
        "\n",
            Collections.singletonMap("aspects",aspects)).toString();
    }

    public static URL renderConfigurationToTemporaryFile(String configurationLocation) throws IOException {

        String instanceFilter = System.getProperty(Utils.CONFIGURATION_FILTER, DEFAULT_FILTER);

        Configuration configuration = loadConfiguration(configurationLocation);
        final Collection aspects;
        if(DEFAULT_FILTER.equals(instanceFilter)){
            aspects = configuration.getAllAspects();
        } else {
            aspects = configuration.currentAspects(Utils.checkMvelExpression(instanceFilter).toString());
        }
        String aopXmlContent = generate(aspects);
        return writeAopXml(aopXmlContent);
    }

    private static URL writeAopXml(String aopXmlContent) throws IOException {
        URL url;File aopXmlTempFile = File.createTempFile("aop", ".xml");
        if(!Boolean.getBoolean(Utils.DEBUG_OPTION)){
            aopXmlTempFile.deleteOnExit();
        } else {
            LOGGER.info("AspectJ aop.xml descriptor: " + aopXmlTempFile.getAbsolutePath());
        }
        FileOutputStream outputStream = new FileOutputStream(aopXmlTempFile);
        try {
            IOUtils.copy(new StringReader(aopXmlContent), outputStream);
        } finally {
            IOUtils.closeQuietly(outputStream);
        }

        url = aopXmlTempFile.toURI().toURL();
        return url;
    }

    private volatile static Configuration configuration;

    public static synchronized Configuration getConfiguration(){
        return configuration;
    }

    static synchronized Configuration loadConfiguration(String configurationLocation) throws IOException {
        if(configuration==null){
            LOGGER.info("Fetch configuration from "+configurationLocation);
            InputStream configStream = new URL(configurationLocation).openStream();
            String configurationContent;
            try {
                configurationContent = IOUtils.toString(configStream);
            } finally {
                IOUtils.closeQuietly(configStream);
            }
            Configuration configuration;
            if(configurationContent.startsWith("{")){
                LOGGER.info("Load configuration as JSON file: configuration start with '{'");
                configuration = ConfigurationLoader.fromJson(configurationContent);
            } else {
                configuration = ConfigurationLoader.fromXml(configurationContent);
            }
            Configuration.validateConfiguration(configuration);
            AspectJDescriptor.configuration = configuration;
            OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE); // to avoid ClassNotFoundException in maven classes

            ContextUtils.initGlobalContext(configuration);
            LOGGER.info("Shared configuration class hash: " + System.identityHashCode(AspectJDescriptor.class));
        }
        return configuration;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy