1 /*************************************************************************************** 2 * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved. * 3 * http://aspectwerkz.codehaus.org * 4 * ---------------------------------------------------------------------------------- * 5 * The software in this package is published under the terms of the LGPL license * 6 * a copy of which has been included with this distribution in the license.txt file. * 7 **************************************************************************************/ 8 package org.codehaus.aspectwerkz.transform.inlining; 9 10 import java.util.StringTokenizer; 11 12 import org.codehaus.aspectwerkz.util.ContextClassLoader; 13 import org.codehaus.aspectwerkz.util.ContextClassLoader; 14 import org.codehaus.aspectwerkz.transform.inlining.spi.AspectModel; 15 import org.codehaus.aspectwerkz.definition.AspectDefinition; 16 import org.codehaus.aspectwerkz.reflect.ClassInfo; 17 import org.codehaus.aspectwerkz.exception.DefinitionException; 18 19 /*** 20 * Manages the different aspect model implementations that is registered. 21 * 22 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a> 23 */ 24 public class AspectModelManager { 25 26 public static final String ASPECT_MODELS_VM_OPTION = "aspectwerkz.extension.aspectmodels"; 27 private static final String DELIMITER = ":"; 28 29 /*** 30 * The aspects models that are registered 31 */ 32 private static AspectModel[] ASPECT_MODELS = new AspectModel[]{}; 33 34 static { 35 registerAspectModels(System.getProperty(ASPECT_MODELS_VM_OPTION, null)); 36 } 37 38 /*** 39 * Returns an array with all the aspect models that has been registered. 40 * 41 * @return an array with the aspect models 42 */ 43 public static AspectModel[] getModels() { 44 return ASPECT_MODELS; 45 } 46 47 /*** 48 * Returns the advice model for a specific aspect model type id. 49 * 50 * @param type the aspect model type id 51 * @return the aspect model 52 */ 53 public static AspectModel getModelFor(String type) { 54 for (int i = 0; i < ASPECT_MODELS.length; i++) { 55 AspectModel aspectModel = ASPECT_MODELS[i]; 56 if (aspectModel.getAspectModelType().equals(type)) { 57 return aspectModel; 58 } 59 } 60 return null; 61 } 62 63 /*** 64 * Let all aspect models try to define the aspect (only one will succeed). 65 * 66 * @param aspectClassInfo 67 * @param aspectDef 68 * @param loader 69 */ 70 public static void defineAspect(final ClassInfo aspectClassInfo, 71 final AspectDefinition aspectDef, 72 final ClassLoader loader) { 73 for (int i = 0; i < ASPECT_MODELS.length; i++) { 74 ASPECT_MODELS[i].defineAspect(aspectClassInfo, aspectDef, loader); 75 } 76 } 77 78 /*** 79 * Registers aspect models. 80 * 81 * @param aspectModels the class names of the aspect models to register concatenated and separated with a ':'. 82 */ 83 private static void registerAspectModels(final String aspectModels) { 84 if (aspectModels != null) { 85 StringTokenizer tokenizer = new StringTokenizer(aspectModels, DELIMITER); 86 ASPECT_MODELS = new AspectModel[tokenizer.countTokens()]; 87 for (int i = 0; i < ASPECT_MODELS.length; i++) { 88 final String className = tokenizer.nextToken(); 89 try { 90 final Class modelClass = ContextClassLoader.forName(className); 91 ASPECT_MODELS[i] = (AspectModel) modelClass.newInstance(); 92 } catch (ClassNotFoundException e) { 93 throw new DefinitionException( 94 "aspect model implementation class not found [" + 95 className + "]: " + e.toString() 96 ); 97 } catch (Exception e) { 98 throw new DefinitionException( 99 "aspect model implementation class could not be instantiated [" + 100 className + 101 "] - make sure it has a default no argument constructor: " + 102 e.toString() 103 ); 104 } 105 } 106 } 107 } 108 }