/************************************************************************************** * Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package org.codehaus.aspectwerkz.aspect.container; import org.codehaus.aspectwerkz.util.ContextClassLoader; import org.codehaus.aspectwerkz.DeploymentModel; import org.codehaus.aspectwerkz.transform.inlining.AsmHelper; /** * @author <a href="mailto:alex AT gnilux DOT com">Alexandre Vasseur</a> */ public class AspectFactoryManager { public static String getAspectFactoryClassName(String aspectClassName, String aspectQualifiedName) { return aspectClassName.replace('.', '/') + "$" + aspectQualifiedName.replace('.', '/').replace('/', '_') + "_AWFactory"; } // TODO refactor for offline stuff -genjp /** * Ensure that the aspect factory is loaded. * * @param aspectFactoryJavaClassName * @param aspectClassName * @param aspectQualifiedName * @param containerClassName * @param rawParameters * @param loader * @param deploymentModelAsString */ public static void loadAspectFactory( String aspectFactoryJavaClassName, String uuid, String aspectClassName, String aspectQualifiedName, String containerClassName, String rawParameters, ClassLoader loader, String deploymentModelAsString) { try { ContextClassLoader.forName(loader, aspectFactoryJavaClassName); } catch (ClassNotFoundException e) { // compile it DeploymentModel deploymentModel = DeploymentModel.getDeploymentModelFor(deploymentModelAsString); AbstractAspectFactoryCompiler compiler; if (DeploymentModel.PER_JVM.equals(deploymentModel)) { compiler = new PerJVMAspectFactoryCompiler( uuid, aspectClassName, aspectQualifiedName, containerClassName, rawParameters, loader ); } else if (DeploymentModel.PER_CLASS.equals(deploymentModel)) { compiler = new LazyPerXFactoryCompiler.PerClassAspectFactoryCompiler( uuid, aspectClassName, aspectQualifiedName, containerClassName, rawParameters, loader ); } else if (DeploymentModel.PER_INSTANCE.equals(deploymentModel)) { compiler = new PerObjectFactoryCompiler.PerInstanceFactoryCompiler( uuid, aspectClassName, aspectQualifiedName, containerClassName, rawParameters, loader ); } else if (DeploymentModel.PER_TARGET.equals(deploymentModel) || DeploymentModel.PER_THIS.equals(deploymentModel)) { compiler = new PerObjectFactoryCompiler( uuid, aspectClassName, aspectQualifiedName, containerClassName, rawParameters, loader ); } else if (DeploymentModel.PER_CFLOW.equals(deploymentModel) || DeploymentModel.PER_CFLOWBELOW.equals(deploymentModel)) { compiler = new PerCflowXAspectFactoryCompiler( uuid, aspectClassName, aspectQualifiedName, containerClassName, rawParameters, loader ); } else { //FIXME perThread throw new Error("Unimplemented " + deploymentModel); } // define the entity Artifact artifact = compiler.compile(); AsmHelper.defineClass(loader, artifact.bytecode, artifact.className); } } }