/** * Looks up the aspect class name, based on the qualified name of the aspect. * * @param loader * @param qualifiedName * @return */ private static String lookupAspectClassName( final ClassLoader loader, final String qualifiedName) { if (qualifiedName.indexOf('/') <= 0) { // no uuid return null; } final Set definitionsBottomUp = SystemDefinitionContainer.getRegularAndVirtualDefinitionsFor(loader); // TODO: bottom up is broken now // Collections.reverse(definitionsBottomUp); for (Iterator iterator = definitionsBottomUp.iterator(); iterator.hasNext(); ) { SystemDefinition definition = (SystemDefinition) iterator.next(); for (Iterator iterator1 = definition.getAspectDefinitions().iterator(); iterator1.hasNext(); ) { AspectDefinition aspectDefinition = (AspectDefinition) iterator1.next(); if (qualifiedName.equals(aspectDefinition.getQualifiedName())) { return aspectDefinition.getClassName(); } } } return null; }
/** * Creates a new aspect container. * * @param aspectClass the aspect class */ private static AspectContainer createAspectContainer(final Class aspectClass) { AspectDefinition aspectDefinition = null; Set definitions = SystemDefinitionContainer.getRegularAndVirtualDefinitionsFor(aspectClass.getClassLoader()); for (Iterator iterator = definitions.iterator(); iterator.hasNext() && aspectDefinition == null; ) { SystemDefinition systemDefinition = (SystemDefinition) iterator.next(); for (Iterator iterator1 = systemDefinition.getAspectDefinitions().iterator(); iterator1.hasNext(); ) { AspectDefinition aspectDef = (AspectDefinition) iterator1.next(); if (aspectClass.getName().replace('/', '.').equals(aspectDef.getClassName())) { aspectDefinition = aspectDef; break; } } } if (aspectDefinition == null) { throw new Error("Could not find AspectDefinition for " + aspectClass.getName()); } String containerClassName = aspectDefinition.getContainerClassName(); try { Class containerClass; if (containerClassName == null || aspectClass.getName().equals(CFlowSystemAspect.CLASS_NAME)) { containerClass = ContextClassLoader.loadClass(aspectClass.getClassLoader(), DEFAULT_ASPECT_CONTAINER); } else { containerClass = ContextClassLoader.loadClass(aspectClass.getClassLoader(), containerClassName); } Constructor constructor = containerClass.getConstructor(new Class[] {AspectContext.class}); final AspectContext aspectContext = new AspectContext( aspectDefinition.getSystemDefinition().getUuid(), aspectClass, aspectDefinition.getName(), DeploymentModel.getDeploymentModelAsInt(aspectDefinition.getDeploymentModel()), aspectDefinition, aspectDefinition.getParameters()); final AspectContainer container = (AspectContainer) constructor.newInstance(new Object[] {aspectContext}); aspectContext.setContainer(container); return container; } catch (InvocationTargetException e) { throw new DefinitionException(e.getTargetException().toString()); } catch (NoSuchMethodException e) { throw new DefinitionException( "aspect container does not have a valid constructor [" + containerClassName + "] need to take an AspectContext instance as its only parameter: " + e.toString()); } catch (Throwable e) { StringBuffer cause = new StringBuffer(); cause.append("could not create aspect container using the implementation specified ["); cause.append(containerClassName); cause.append("] due to: "); cause.append(e.toString()); e.printStackTrace(); throw new DefinitionException(cause.toString()); } }