/*
* JBoss, Home of Professional Open Source
* Copyright 2006, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.aop.microcontainer.beans.xml;
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import org.jboss.aop.advice.AdviceType;
import org.jboss.aop.microcontainer.beans.AnnotationIntroduction;
import org.jboss.aop.microcontainer.beans.AnnotationOverride;
import org.jboss.aop.microcontainer.beans.ArrayReplacement;
import org.jboss.aop.microcontainer.beans.DynamicCFlowDef;
import org.jboss.aop.microcontainer.beans.NamedPointcut;import org.jboss.aop.microcontainer.beans.Prepare;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.AdviceData;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.AdviceOrInterceptorData;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.ArrayBindBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.AspectBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.AspectManagerUtil;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.AspectManagerAwareBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.BaseInterceptorData;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.BindBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.CFlowEntry;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.CFlowStackBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.ConfigureLifecycleBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.CreateLifecycleBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.DescribeLifecycleBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.DomainBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.InstallLifecycleBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.InstantiateLifecycleBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.IntroductionBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.LifecycleBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.MixinData;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.PreInstallLifecycleBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.PrecedenceBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.StackBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.StackRefData;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.StartLifecycleBeanMetaDataFactory;
import org.jboss.aop.microcontainer.beans.beanmetadatafactory.TypeDefBeanMetaDataFactory;
import org.jboss.beans.metadata.plugins.AbstractBeanMetaData;
import org.jboss.beans.metadata.spi.BeanMetaData;
import org.jboss.beans.metadata.spi.builder.BeanMetaDataBuilder;
import org.jboss.kernel.plugins.deployment.xml.BeanFactoryHandler;
import org.jboss.kernel.plugins.deployment.xml.BeanSchemaBinding20;
import org.jboss.kernel.plugins.deployment.xml.BeanSchemaBindingHelper;
import org.jboss.util.id.GUID;
import org.jboss.xb.binding.sunday.unmarshalling.CharactersHandler;
import org.jboss.xb.binding.sunday.unmarshalling.DefaultElementHandler;
import org.jboss.xb.binding.sunday.unmarshalling.DefaultElementInterceptor;
import org.jboss.xb.binding.sunday.unmarshalling.ElementBinding;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBinding;
import org.jboss.xb.binding.sunday.unmarshalling.SchemaBindingInitializer;
import org.jboss.xb.binding.sunday.unmarshalling.TypeBinding;
import org.xml.sax.Attributes;
/**
* AOPBeansSchemaInitializer.
*
* @author <a href="adrian@jboss.com">Adrian Brock</a>
* @version $Revision: 70308 $
*/
public class AOPBeansSchemaInitializer implements SchemaBindingInitializer
{
private final static String MANAGER_BEAN_NAME = "manager-bean";
private final static String MANAGER_PROPERTY_NAME = "manager-property";
/** The namespace */
private static final String AOP_BEANS_NS = "urn:jboss:aop-beans:1.0";
private static final QName domainTypeQName = new QName(AOP_BEANS_NS, "domainType");
private static final QName aspectQName = new QName(AOP_BEANS_NS, "aspect");
private static final QName interceptorQName = new QName(AOP_BEANS_NS, "interceptor");
/** The aspect or interceptor binding */
private static final QName aspectOrInterceptorTypeQName = new QName(AOP_BEANS_NS, "aspectOrInterceptorType");
private static final QName bindQName = new QName(AOP_BEANS_NS, "bind");
/** The aspect or interceptor binding */
private static final QName bindTypeQName = new QName(AOP_BEANS_NS, "bindType");
private static final QName stackQName = new QName(AOP_BEANS_NS, "stack");
private static final QName stackTypeQName = new QName(AOP_BEANS_NS, "stackType");
private static final QName stackRefQName = new QName(AOP_BEANS_NS, "stack-ref");
private static final QName stackRefTypeQName = new QName(AOP_BEANS_NS, "stackRefType");
private static final QName interceptorRefQName = new QName(AOP_BEANS_NS, "interceptor-ref");
private static final QName interceptorRefTypeQName = new QName(AOP_BEANS_NS, "interceptorRefType");
private static final QName adviceQName = new QName(AOP_BEANS_NS, "advice");
private static final QName adviceTypeQName = new QName(AOP_BEANS_NS, "adviceType");
private static final QName aroundQName = new QName(AOP_BEANS_NS, "around");
private static final QName beforeQName = new QName(AOP_BEANS_NS, "before");
private static final QName beforeTypeQName = new QName(AOP_BEANS_NS, "beforeType");
private static final QName afterQName = new QName(AOP_BEANS_NS, "after");
private static final QName afterTypeQName = new QName(AOP_BEANS_NS, "afterType");
private static final QName throwingQName = new QName(AOP_BEANS_NS, "throwing");
private static final QName throwingTypeQName = new QName(AOP_BEANS_NS, "throwingType");
private static final QName finallyQName = new QName(AOP_BEANS_NS, "finally");
private static final QName finallyTypeQName = new QName(AOP_BEANS_NS, "finallyType");
private static final QName typedefQName = new QName(AOP_BEANS_NS, "typedef");
private static final QName typedefTypeQName = new QName(AOP_BEANS_NS, "typedefType");
private static final QName cflowStackQName = new QName(AOP_BEANS_NS, "cflow-stack");
private static final QName cflowStackTypeQName = new QName(AOP_BEANS_NS, "cflowStackType");
private static final QName cflowStackEntryTypeQName = new QName(AOP_BEANS_NS, "cflowStackEntryType");
private static final QName calledQName = new QName(AOP_BEANS_NS, "called");
private static final QName notCalledQName = new QName(AOP_BEANS_NS, "not-called");
private static final QName dynamicCflowQName = new QName(AOP_BEANS_NS, "dynamic-cflow");
private static final QName dynamicCflowStackTypeQName = new QName(AOP_BEANS_NS, "dynamicCflowStackType");
private static final QName pointcutQName = new QName(AOP_BEANS_NS, "pointcut");
private static final QName pointcutTypeQName = new QName(AOP_BEANS_NS, "pointcutType");
private static final QName prepareQName = new QName(AOP_BEANS_NS, "prepare");
private static final QName prepareTypeQName = new QName(AOP_BEANS_NS, "prepareType");
private static final QName annotationQName = new QName(AOP_BEANS_NS, "annotation");
private static final QName annotationTypeQName = new QName(AOP_BEANS_NS, "annotationType");
private static final QName annotationIntroductionQName = new QName(AOP_BEANS_NS, "annotation-introduction");
private static final QName annotationIntroductionTypeQName = new QName(AOP_BEANS_NS, "annotationIntroductionType");
private static final QName precedenceQName = new QName(AOP_BEANS_NS, "precedence");
private static final QName precedenceTypeQName = new QName(AOP_BEANS_NS, "precedenceType");
private static final QName introductionQName = new QName(AOP_BEANS_NS, "introduction");
private static final QName introductionTypeQName = new QName(AOP_BEANS_NS, "introductionType");
private static final QName interfacesQName = new QName(AOP_BEANS_NS, "interfaces");
private static final QName interfacesTypeQName = new QName(AOP_BEANS_NS, "interfacesType");
private static final QName mixinQName = new QName(AOP_BEANS_NS, "mixin");
private static final QName mixinTypeQName = new QName(AOP_BEANS_NS, "mixinType");
private static final QName classQName = new QName(AOP_BEANS_NS, "class");
private static final QName classTypeQName = new QName(AOP_BEANS_NS, "classType");
private static final QName transientQName = new QName(AOP_BEANS_NS, "transient");
private static final QName transientTypeQName = new QName(AOP_BEANS_NS, "transientType");
private static final QName constructionQName = new QName(AOP_BEANS_NS, "construction");
private static final QName constructionTypeQName = new QName(AOP_BEANS_NS, "constructionType");
private static final QName arrayreplacementQName = new QName(AOP_BEANS_NS, "arrayreplacement");
private static final QName arrayreplacementTypeQName = new QName(AOP_BEANS_NS, "arrayreplacementType");
private static final QName arraybindQName = new QName(AOP_BEANS_NS, "arraybind");
private static final QName arraybindTypeQName = new QName(AOP_BEANS_NS, "arraybindType");
/** The lifecycle configure aspect binding */
private static final QName lifecycleTypeQName = new QName(AOP_BEANS_NS, "lifecycleType");
public SchemaBinding init(SchemaBinding schema)
{
// ignore XB property replacement
schema.setReplacePropertyRefs(false);
initTopLevelBindings(schema);
initChildBindings(schema);
// TODO FIXME???
BeanSchemaBinding20.initArtifacts(schema);
return schema;
}
private void initTopLevelBindings(SchemaBinding schema)
{
initDomainType(schema);
initAspectOrInterceptorType(schema); // aspect and interceptor binding
initBindType(schema); // bind binding
initStackType(schema);
initTypedefType(schema);
initCFlowStackType(schema);
initDynamicCFlowStackType(schema);
initPrepareType(schema);
initPointcutType(schema);
initAnnotationIntroductionType(schema);
initAnnotationType(schema);
initPrecedenceType(schema);
initIntroductionType(schema);
initArrayBindType(schema);
initArrayReplacementType(schema);
initLifecycleType(schema);
}
private void initChildBindings(SchemaBinding schema)
{
//Children of bind
initInterceptorRefType(schema); // interceptor-ref binding
initStackRefType(schema); //stack-ref binding
initAdviceType(schema); //advice binding
initBeforeType(schema);
initAfterType(schema);
initThrowingType(schema);
initFinallyType(schema);
initCFlowStackEntryType(schema); //called/not-called within a cflow-stack
initInterfacesType(schema);
initMixinType(schema);
initClassType(schema);
initTransientType(schema);
initConstructionType(schema);
}
private void initDomainType(SchemaBinding schema)
{
TypeBinding type = schema.getType(domainTypeQName);
type.setHandler(DomainHandler.DOMAIN_HANDLER);
type.pushInterceptor(interceptorQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
type.pushInterceptor(aspectQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
type.pushInterceptor(bindQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
type.pushInterceptor(stackQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
type.pushInterceptor(typedefQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
type.pushInterceptor(cflowStackQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
type.pushInterceptor(dynamicCflowQName, DomainBeanMetaDataInterceptor.INTERCEPTOR);
type.pushInterceptor(prepareQName, DomainBeanMetaDataInterceptor.INTERCEPTOR);
type.pushInterceptor(pointcutQName, DomainBeanMetaDataInterceptor.INTERCEPTOR);
type.pushInterceptor(annotationQName, DomainBeanMetaDataInterceptor.INTERCEPTOR);
type.pushInterceptor(annotationIntroductionQName, DomainBeanMetaDataInterceptor.INTERCEPTOR);
type.pushInterceptor(precedenceQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
type.pushInterceptor(introductionQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
type.pushInterceptor(arrayreplacementQName, DomainBeanMetaDataInterceptor.INTERCEPTOR);
type.pushInterceptor(arraybindQName, DomainAspectManagerAwareBeanMetaDataFactoryInterceptor.INTERCEPTOR);
}
private void initAspectOrInterceptorType(SchemaBinding schema)
{
TypeBinding type = schema.getType(aspectOrInterceptorTypeQName);
BeanSchemaBindingHelper.initBeanFactoryHandlers(type);
type.setHandler(new AspectBeanFactoryHandler());
}
private void initBindType(SchemaBinding schema)
{
TypeBinding type = schema.getType(bindTypeQName);
type.pushInterceptor(stackRefQName, BindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(interceptorRefQName, BindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(adviceQName, BindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(aroundQName, BindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(beforeQName, BindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(afterQName, BindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(throwingQName, BindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(finallyQName, BindContentInterceptor.INTERCEPTOR);
type.setHandler(new BindBeanFactoryHandler());
}
private void initArrayBindType(SchemaBinding schema)
{
TypeBinding type = schema.getType(arraybindTypeQName);
type.pushInterceptor(stackRefQName, ArrayBindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(interceptorRefQName, ArrayBindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(adviceQName, ArrayBindContentInterceptor.INTERCEPTOR);
type.pushInterceptor(aroundQName, ArrayBindContentInterceptor.INTERCEPTOR);
type.setHandler(new ArrayBindBeanFactoryHandler());
}
private void initStackType(SchemaBinding schema)
{
TypeBinding type = schema.getType(stackTypeQName);
type.pushInterceptor(stackRefQName, StackContentInterceptor.INTERCEPTOR);
type.pushInterceptor(interceptorRefQName, StackContentInterceptor.INTERCEPTOR);
type.pushInterceptor(adviceQName, StackContentInterceptor.INTERCEPTOR);
type.pushInterceptor(aroundQName, StackContentInterceptor.INTERCEPTOR);
type.pushInterceptor(beforeQName, StackContentInterceptor.INTERCEPTOR);
type.pushInterceptor(afterQName, StackContentInterceptor.INTERCEPTOR);
type.pushInterceptor(throwingQName, StackContentInterceptor.INTERCEPTOR);
type.pushInterceptor(finallyQName, StackContentInterceptor.INTERCEPTOR);
type.setHandler(new StackBeanFactoryHandler());
}
private void initTypedefType(SchemaBinding schema)
{
TypeBinding type = schema.getType(typedefTypeQName);
type.setHandler(TypeDefHandler.TYPEDEF_HANDLER);
}
private void initCFlowStackType(SchemaBinding schema)
{
TypeBinding type = schema.getType(cflowStackTypeQName);
type.pushInterceptor(calledQName, CFlowStackCalledInterceptor.INTERCEPTOR);
type.pushInterceptor(notCalledQName, CFlowStackNotCalledInterceptor.INTERCEPTOR);
type.setHandler(CFlowStackHandler.CFLOW_STACK_HANDLER);
}
private void initDynamicCFlowStackType(SchemaBinding schema)
{
TypeBinding type = schema.getType(dynamicCflowStackTypeQName);
type.setHandler(DynamicCFlowHandler.HANDLER);
}
private void initPointcutType(SchemaBinding schema)
{
TypeBinding type = schema.getType(pointcutTypeQName);
type.setHandler(PointcutHandler.POINTCUT_HANDLER);
}
private void initPrepareType(SchemaBinding schema)
{
TypeBinding type = schema.getType(prepareTypeQName);
type.setHandler(PrepareHandler.HANDLER);
}
private void initArrayReplacementType(SchemaBinding schema)
{
TypeBinding type = schema.getType(arrayreplacementTypeQName);
type.setHandler(ArrayReplacementHandler.HANDLER);
}
private void initAnnotationIntroductionType(SchemaBinding schema)
{
TypeBinding type = schema.getType(annotationIntroductionTypeQName);
type.setHandler(AnnotationIntroductionHandler.HANDLER);
type.setSimpleType(AnnotationCharactersHandler.HANDLER);
}
private void initAnnotationType(SchemaBinding schema)
{
TypeBinding type = schema.getType(annotationTypeQName);
type.setHandler(AnnotationOverrideHandler.ANNOTATION_OVERRIDE_HANDLER);
type.setSimpleType(AnnotationCharactersHandler.HANDLER);
}
private void initPrecedenceType(SchemaBinding schema)
{
TypeBinding type = schema.getType(precedenceTypeQName);
type.setHandler(PrecedenceHandler.PRECEDENCE_HANDLER);
type.pushInterceptor(adviceQName, PrecedenceInterceptor.INTERCEPTOR);
type.pushInterceptor(interceptorRefQName, PrecedenceInterceptor.INTERCEPTOR);
}
private void initIntroductionType(SchemaBinding schema)
{
TypeBinding type = schema.getType(introductionTypeQName);
type.pushInterceptor(interfacesQName, IntroductionInterfacesInterceptor.INTERCEPTOR);
type.pushInterceptor(mixinQName, IntroductionMixinInterceptor.INTERCEPTOR);
type.setHandler(IntroductionHandler.INTRODUCTION_HANDLER);
}
private void initLifecycleType(SchemaBinding schema)
{
TypeBinding type = schema.getType(lifecycleTypeQName);
BeanSchemaBindingHelper.initBeanFactoryHandlers(type);
type.setHandler(new LifecycleBeanFactoryHandler());
}
private void initInterceptorRefType(SchemaBinding schema)
{
TypeBinding type = schema.getType(interceptorRefTypeQName);
type.setHandler(InterceptorRefHandler.HANDLER);
}
private void initStackRefType(SchemaBinding schema)
{
TypeBinding type = schema.getType(stackRefTypeQName);
type.setHandler(StackRefHandler.HANDLER);
}
private void initAdviceType(SchemaBinding schema)
{
TypeBinding type = schema.getType(adviceTypeQName);
type.setHandler(AdviceHandler.HANDLER);
}
private void initBeforeType(SchemaBinding schema)
{
TypeBinding type = schema.getType(beforeTypeQName);
type.setHandler(BeforeHandler.BEFORE_HANDLER);
}
private void initAfterType(SchemaBinding schema)
{
TypeBinding type = schema.getType(afterTypeQName);
type.setHandler(AfterHandler.AFTER_HANDLER);
}
private void initThrowingType(SchemaBinding schema)
{
TypeBinding type = schema.getType(throwingTypeQName);
type.setHandler(ThrowingHandler.THROWING_HANDLER);
}
private void initFinallyType(SchemaBinding schema)
{
TypeBinding type = schema.getType(finallyTypeQName);
type.setHandler(FinallyHandler.FINALLY_HANDLER);
}
private void initCFlowStackEntryType(SchemaBinding schema)
{
TypeBinding type = schema.getType(cflowStackEntryTypeQName);
type.setHandler(CFlowStackEntryHandler.HANDLER);
}
private void initInterfacesType(SchemaBinding schema)
{
TypeBinding type = schema.getType(interfacesTypeQName);
type.setSimpleType(StringBufferCharacterHandler.HANDLER);
type.setHandler(InterfacesHandler.HANDLER);
}
private void initMixinType(SchemaBinding schema)
{
TypeBinding type = schema.getType(mixinTypeQName);
type.pushInterceptor(classQName, MixinClassInterceptor.INTERCEPTOR);
type.pushInterceptor(transientQName, MixinTransientInterceptor.INTERCEPTOR);
type.pushInterceptor(interfacesQName, MixinInterfacesInterceptor.INTERCEPTOR);
type.pushInterceptor(constructionQName, MixinConstructionInterceptor.INTERCEPTOR);
type.setHandler(MixinHandler.HANDLER);
}
private void initClassType(SchemaBinding schema)
{
TypeBinding type = schema.getType(classTypeQName);
type.setHandler(StringBufferHandler.HANDLER);
type.setSimpleType(StringBufferCharacterHandler.HANDLER);
}
private void initTransientType(SchemaBinding schema)
{
TypeBinding type = schema.getType(transientTypeQName);
type.setHandler(StringBufferHandler.HANDLER);
type.setSimpleType(StringBufferCharacterHandler.HANDLER);
}
private void initConstructionType(SchemaBinding schema)
{
TypeBinding type = schema.getType(constructionTypeQName);
type.setHandler(StringBufferHandler.HANDLER);
type.setSimpleType(StringBufferCharacterHandler.HANDLER);
}
///////////////////////////////////////////////////////////////////////////////////////
//BeanFactoryHandlers
private static class AspectManagerAwareBeanFactoryHandler extends BeanFactoryHandler
{
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
AspectManagerAwareBeanMetaDataFactory factory = (AspectManagerAwareBeanMetaDataFactory) o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if (MANAGER_BEAN_NAME.equals(localName))
{
factory.setManagerBean(attrs.getValue(i));
}
else if (MANAGER_PROPERTY_NAME.equals(localName))
{
factory.setManagerProperty(attrs.getValue(i));
}
}
}
}
private static class DomainHandler extends AspectManagerAwareBeanFactoryHandler
{
public static final DomainHandler DOMAIN_HANDLER = new DomainHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new DomainBeanMetaDataFactory();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
DomainBeanMetaDataFactory bean = (DomainBeanMetaDataFactory)o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("parentFirst".equals(localName))
{
bean.setParentFirst(attrs.getValue(i));
}
else if ("inheritDefinitions".equals(localName))
{
bean.setInheritDefinitions(attrs.getValue(i));
}
else if ("inheritBindings".equals(localName))
{
bean.setInheritBindings(attrs.getValue(i));
}
else if ("extends".equals(localName))
{
bean.setExtends(attrs.getValue(i));
}
}
}
}
private static class AspectBeanFactoryHandler extends AspectManagerAwareBeanFactoryHandler
{
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AspectBeanMetaDataFactory();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
AspectBeanMetaDataFactory factory = (AspectBeanMetaDataFactory) o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("scope".equals(localName))
{
factory.setScope(attrs.getValue(i));
}
else if ("factory".equals(localName))
{
factory.setFactory(attrs.getValue(i));
}
}
}
}
private static class LifecycleBeanFactoryHandler extends AspectManagerAwareBeanFactoryHandler
{
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
String localname = name.getLocalPart();
if (localname.equals("lifecycle-configure"))
{
return new ConfigureLifecycleBeanMetaDataFactory();
}
if (localname.equals("lifecycle-create"))
{
return new CreateLifecycleBeanMetaDataFactory();
}
if (localname.equals("lifecycle-describe"))
{
return new DescribeLifecycleBeanMetaDataFactory();
}
if (localname.equals("lifecycle-install"))
{
return new InstallLifecycleBeanMetaDataFactory();
}
if (localname.equals("lifecycle-instantiate"))
{
return new InstantiateLifecycleBeanMetaDataFactory();
}
if (localname.equals("lifecycle-preinstall"))
{
return new PreInstallLifecycleBeanMetaDataFactory();
}
if (localname.equals("lifecycle-start"))
{
return new StartLifecycleBeanMetaDataFactory();
}
throw new IllegalStateException(name + " is not a recognized element");
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
LifecycleBeanMetaDataFactory factory = (LifecycleBeanMetaDataFactory) o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("classes".equals(localName))
{
factory.setClasses(attrs.getValue(i));
}
else if ("expr".equals(localName))
{
factory.setExpr(attrs.getValue(i));
}
else if ("install".equals(localName))
{
factory.setInstallMethod(attrs.getValue(i));
}
else if ("uninstall".equals(localName))
{
factory.setUninstallMethod(attrs.getValue(i));
}
}
}
}
private static class BindBeanFactoryHandler extends AspectManagerAwareBeanFactoryHandler
{
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new BindBeanMetaDataFactory();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
BindBeanMetaDataFactory factory = (BindBeanMetaDataFactory) o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("pointcut".equals(localName))
{
factory.setPointcut(attrs.getValue(i));
}
else if ("cflow".equals(localName))
{
factory.setCflow(attrs.getValue(i));
}
}
}
@Override
public Object endElement(Object o, QName name, ElementBinding element)
{
return super.endElement(o, name, element);
}
}
private static class ArrayBindBeanFactoryHandler extends AspectManagerAwareBeanFactoryHandler
{
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new ArrayBindBeanMetaDataFactory();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
ArrayBindBeanMetaDataFactory factory = (ArrayBindBeanMetaDataFactory) o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("type".equals(localName))
{
factory.setType(attrs.getValue(i));
}
else if ("name".equals(localName))
{
factory.setName(attrs.getValue(i));
}
}
}
@Override
public Object endElement(Object o, QName name, ElementBinding element)
{
return super.endElement(o, name, element);
}
}
private static class StackBeanFactoryHandler extends AspectManagerAwareBeanFactoryHandler
{
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new StackBeanMetaDataFactory();
}
}
private static class CFlowStackHandler extends AspectManagerAwareBeanFactoryHandler
{
public static final CFlowStackHandler CFLOW_STACK_HANDLER = new CFlowStackHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new CFlowStackBeanMetaDataFactory();
}
}
private static class PrecedenceHandler extends AspectManagerAwareBeanFactoryHandler
{
public static final PrecedenceHandler PRECEDENCE_HANDLER = new PrecedenceHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new PrecedenceBeanMetaDataFactory();
}
}
private static class IntroductionHandler extends AspectManagerAwareBeanFactoryHandler
{
public static final IntroductionHandler INTRODUCTION_HANDLER = new IntroductionHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new IntroductionBeanMetaDataFactory();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
IntroductionBeanMetaDataFactory factory = (IntroductionBeanMetaDataFactory) o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("expr".equals(localName))
{
factory.setExpr(attrs.getValue(i));
}
else if ("class".equals(localName))
{
factory.setClazz(attrs.getValue(i));
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////
//DefaultElementHandlers
private static class InterceptorRefHandler extends DefaultElementHandler
{
public static final InterceptorRefHandler HANDLER = new InterceptorRefHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AdviceData();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
BaseInterceptorData interceptorRef = (BaseInterceptorData)o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("name".equals(localName))
{
interceptorRef.setRefName(attrs.getValue(i));
}
}
}
}
private static class ArrayReplacementHandler extends DefaultElementHandler
{
public static final ArrayReplacementHandler HANDLER = new ArrayReplacementHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AbstractBeanMetaData(ArrayReplacement.class.getName());
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
AbstractBeanMetaData arrayReplacement = (AbstractBeanMetaData)o;
BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(arrayReplacement);
AspectManagerUtil util = new AspectManagerUtil();
String name = null;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("name".equals(localName))
{
name = attrs.getValue(i);
}
if ("class".equals(localName))
{
builder.addPropertyMetaData("classes", attrs.getValue(i));
}
else if ("expr".equals(localName))
{
builder.addPropertyMetaData("expr", attrs.getValue(i));
}
else if (MANAGER_BEAN_NAME.equals(localName))
{
util.setManagerBean(attrs.getValue(i));
}
else if (MANAGER_PROPERTY_NAME.equals(localName))
{
util.setManagerProperty(attrs.getValue(i));
}
}
util.setAspectManagerProperty(builder, "manager");
if (name == null)
{
name = GUID.asString();
}
arrayReplacement.setName(name);
builder.addPropertyMetaData("name", name);
}
}
private static class StackRefHandler extends DefaultElementHandler
{
public static final StackRefHandler HANDLER = new StackRefHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new StackRefData();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
BaseInterceptorData interceptorRef = (BaseInterceptorData)o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("name".equals(localName))
{
interceptorRef.setRefName(attrs.getValue(i));
}
}
}
}
private static class AdviceHandler extends DefaultElementHandler
{
public static final AdviceHandler HANDLER = new AdviceHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AdviceData();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
AdviceData advice = (AdviceData)o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("aspect".equals(localName))
{
advice.setRefName(attrs.getValue(i));
}
else if ("name".equals(localName))
{
advice.setAdviceMethod(attrs.getValue(i));
}
}
}
}
private static class BeforeHandler extends AdviceHandler
{
public static final BeforeHandler BEFORE_HANDLER = new BeforeHandler();
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
AdviceOrInterceptorData advice = (AdviceOrInterceptorData)o;
advice.setType(AdviceType.BEFORE);
}
}
private static class AfterHandler extends AdviceHandler
{
public static final AfterHandler AFTER_HANDLER = new AfterHandler();
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
AdviceOrInterceptorData advice = (AdviceOrInterceptorData)o;
advice.setType(AdviceType.AFTER);
}
}
private static class ThrowingHandler extends AdviceHandler
{
public static final ThrowingHandler THROWING_HANDLER = new ThrowingHandler();
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
AdviceOrInterceptorData advice = (AdviceOrInterceptorData)o;
advice.setType(AdviceType.THROWING);
}
}
private static class FinallyHandler extends AdviceHandler
{
public static final FinallyHandler FINALLY_HANDLER = new FinallyHandler();
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
AdviceOrInterceptorData advice = (AdviceOrInterceptorData)o;
advice.setType(AdviceType.FINALLY);
}
}
private static class TypeDefHandler extends AspectManagerAwareBeanFactoryHandler
{
public static final TypeDefHandler TYPEDEF_HANDLER = new TypeDefHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new TypeDefBeanMetaDataFactory();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
super.attributes(o, elementName, element, attrs, nsCtx);
TypeDefBeanMetaDataFactory factory = (TypeDefBeanMetaDataFactory)o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("name".equals(localName))
{
factory.setName(attrs.getValue(i));
}
else if ("expr".equals(localName))
{
factory.setExpr(attrs.getValue(i));
}
}
}
}
private static class CFlowStackEntryHandler extends DefaultElementHandler
{
public static final CFlowStackEntryHandler HANDLER = new CFlowStackEntryHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new CFlowEntry();
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
CFlowEntry entry = (CFlowEntry)o;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("expr".equals(localName))
{
entry.setExpr(attrs.getValue(i));
}
}
}
}
private static class DynamicCFlowHandler extends DefaultElementHandler
{
public static final DynamicCFlowHandler HANDLER = new DynamicCFlowHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AbstractBeanMetaData(DynamicCFlowDef.class.getName());
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
AspectManagerUtil util = new AspectManagerUtil();
AbstractBeanMetaData dynamicCFlow = (AbstractBeanMetaData)o;
BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(dynamicCFlow);
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("name".equals(localName))
{
dynamicCFlow.setName(attrs.getValue(i));
builder.addPropertyMetaData("name", attrs.getValue(i));
}
else if ("class".equals(localName))
{
builder.addPropertyMetaData("className", attrs.getValue(i));
}
else if (MANAGER_BEAN_NAME.equals(localName))
{
util.setManagerBean(attrs.getValue(i));
}
else if (MANAGER_PROPERTY_NAME.equals(localName))
{
util.setManagerProperty(attrs.getValue(i));
}
}
util.setAspectManagerProperty(builder, "manager");
}
}
private static class PrepareHandler extends DefaultElementHandler
{
public static final PrepareHandler HANDLER = new PrepareHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AbstractBeanMetaData(Prepare.class.getName());
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
AspectManagerUtil util = new AspectManagerUtil();
AbstractBeanMetaData pointcut = (AbstractBeanMetaData)o;
BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(pointcut);
String name = null;
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("name".equals(localName))
{
name = attrs.getValue(i);
}
else if ("expr".equals(localName))
{
builder.addPropertyMetaData("expr", attrs.getValue(i));
}
else if (MANAGER_BEAN_NAME.equals(localName))
{
util.setManagerBean(attrs.getValue(i));
}
else if (MANAGER_PROPERTY_NAME.equals(localName))
{
util.setManagerProperty(attrs.getValue(i));
}
}
util.setAspectManagerProperty(builder, "manager");
if (name == null)
{
name = GUID.asString();
}
pointcut.setName(name);
builder.addPropertyMetaData("name", name);
}
}
private static class PointcutHandler extends PrepareHandler
{
public static final PointcutHandler POINTCUT_HANDLER = new PointcutHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AbstractBeanMetaData(NamedPointcut.class.getName());
}
}
private static class AnnotationIntroductionHandler extends DefaultElementHandler
{
public static final AnnotationIntroductionHandler HANDLER = new AnnotationIntroductionHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AbstractBeanMetaData(AnnotationIntroduction.class.getName());
}
@Override
public void attributes(Object o, QName elementName, ElementBinding element, Attributes attrs, NamespaceContext nsCtx)
{
AspectManagerUtil util = new AspectManagerUtil();
AbstractBeanMetaData annotation = (AbstractBeanMetaData)o;
BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder(annotation);
for (int i = 0; i < attrs.getLength(); ++i)
{
String localName = attrs.getLocalName(i);
if ("invisible".equals(localName))
{
builder.addPropertyMetaData("invisible", attrs.getValue(i));
}
else if ("expr".equals(localName))
{
builder.addPropertyMetaData("expr", attrs.getValue(i));
}
else if (MANAGER_BEAN_NAME.equals(localName))
{
util.setManagerBean(attrs.getValue(i));
}
else if (MANAGER_PROPERTY_NAME.equals(localName))
{
util.setManagerProperty(attrs.getValue(i));
}
}
util.setAspectManagerProperty(builder, "manager");
annotation.setName(GUID.asString());
}
@Override
public Object endElement(Object o, QName name, ElementBinding element)
{
return super.endElement(o, name, element);
}
}
private static class AnnotationOverrideHandler extends AnnotationIntroductionHandler
{
public static final AnnotationOverrideHandler ANNOTATION_OVERRIDE_HANDLER = new AnnotationOverrideHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new AbstractBeanMetaData(AnnotationOverride.class.getName());
}
}
private static class InterfacesHandler extends DefaultElementHandler
{
public static final InterfacesHandler HANDLER = new InterfacesHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new StringBuffer();
}
}
private static class MixinHandler extends DefaultElementHandler
{
public static final MixinHandler HANDLER = new MixinHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new MixinData();
}
}
private static class StringBufferHandler extends DefaultElementHandler
{
public static final StringBufferHandler HANDLER = new StringBufferHandler();
@Override
public Object startElement(Object parent, QName name, ElementBinding element)
{
return new StringBuffer();
}
}
///////////////////////////////////////////////////////////////////////////////////////
//Interceptors
private static class BindContentInterceptor extends DefaultElementInterceptor
{
public static final BindContentInterceptor INTERCEPTOR = new BindContentInterceptor();
@Override
public void add (Object parent, Object child, QName name)
{
BindBeanMetaDataFactory factory = (BindBeanMetaDataFactory) parent;
BaseInterceptorData interceptorData = (BaseInterceptorData)child;
factory.addInterceptor(interceptorData);
}
}
private static class ArrayBindContentInterceptor extends DefaultElementInterceptor
{
public static final ArrayBindContentInterceptor INTERCEPTOR = new ArrayBindContentInterceptor();
@Override
public void add (Object parent, Object child, QName name)
{
ArrayBindBeanMetaDataFactory factory = (ArrayBindBeanMetaDataFactory) parent;
BaseInterceptorData interceptorData = (BaseInterceptorData)child;
factory.addInterceptor(interceptorData);
}
}
private static class StackContentInterceptor extends DefaultElementInterceptor
{
public static final StackContentInterceptor INTERCEPTOR = new StackContentInterceptor();
@Override
public void add (Object parent, Object child, QName name)
{
StackBeanMetaDataFactory factory = (StackBeanMetaDataFactory) parent;
BaseInterceptorData interceptorData = (BaseInterceptorData)child;
factory.addInterceptor(interceptorData);
}
}
private static class CFlowStackInterceptor extends DefaultElementInterceptor
{
public void addEntry(Object parent, Object child, QName name, boolean called)
{
CFlowStackBeanMetaDataFactory cflowStack = (CFlowStackBeanMetaDataFactory)parent;
CFlowEntry entry = (CFlowEntry)child;
entry.setCalled(called);
cflowStack.addEntry(entry);
}
}
private static class CFlowStackNotCalledInterceptor extends CFlowStackInterceptor
{
public static final CFlowStackNotCalledInterceptor INTERCEPTOR = new CFlowStackNotCalledInterceptor();
@Override
public void add (Object parent, Object child, QName name)
{
super.addEntry(parent, child, name, false);
}
}
private static class CFlowStackCalledInterceptor extends CFlowStackInterceptor
{
public static final CFlowStackCalledInterceptor INTERCEPTOR = new CFlowStackCalledInterceptor();
@Override
public void add (Object parent, Object child, QName name)
{
super.addEntry(parent, child, name, true);
}
}
private static class PrecedenceInterceptor extends DefaultElementInterceptor
{
public static final PrecedenceInterceptor INTERCEPTOR = new PrecedenceInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
PrecedenceBeanMetaDataFactory precedence = (PrecedenceBeanMetaDataFactory)parent;
BaseInterceptorData interceptorData = (BaseInterceptorData)child;
precedence.addEntry(interceptorData);
}
}
private static class IntroductionInterfacesInterceptor extends DefaultElementInterceptor
{
public static final IntroductionInterfacesInterceptor INTERCEPTOR = new IntroductionInterfacesInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
IntroductionBeanMetaDataFactory intro = (IntroductionBeanMetaDataFactory)parent;
intro.setInterfaces(((StringBuffer)child).toString());
}
}
private static class IntroductionMixinInterceptor extends DefaultElementInterceptor
{
public static final IntroductionMixinInterceptor INTERCEPTOR = new IntroductionMixinInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
IntroductionBeanMetaDataFactory intro = (IntroductionBeanMetaDataFactory)parent;
intro.addMixinEntry((MixinData)child);
}
}
private static class MixinClassInterceptor extends DefaultElementInterceptor
{
public static final MixinClassInterceptor INTERCEPTOR = new MixinClassInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
MixinData mixin = (MixinData)parent;
mixin.setMixin(((StringBuffer)child).toString());
}
}
private static class MixinTransientInterceptor extends DefaultElementInterceptor
{
public static final MixinTransientInterceptor INTERCEPTOR = new MixinTransientInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
MixinData mixin = (MixinData)parent;
mixin.setTransient(((StringBuffer)child).toString());
}
}
private static class MixinConstructionInterceptor extends DefaultElementInterceptor
{
public static final MixinConstructionInterceptor INTERCEPTOR = new MixinConstructionInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
MixinData mixin = (MixinData)parent;
mixin.setConstruction(((StringBuffer)child).toString());
}
}
private static class MixinInterfacesInterceptor extends DefaultElementInterceptor
{
public static final MixinInterfacesInterceptor INTERCEPTOR = new MixinInterfacesInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
MixinData mixin = (MixinData)parent;
mixin.setInterfaces(((StringBuffer)child).toString());
}
}
private static class DomainAspectManagerAwareBeanMetaDataFactoryInterceptor extends DefaultElementInterceptor
{
public static final DomainAspectManagerAwareBeanMetaDataFactoryInterceptor INTERCEPTOR = new DomainAspectManagerAwareBeanMetaDataFactoryInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
DomainBeanMetaDataFactory domain = (DomainBeanMetaDataFactory)parent;
AspectManagerAwareBeanMetaDataFactory factory = (AspectManagerAwareBeanMetaDataFactory)child;
//Overwrite the manager property
factory.setManagerBean(domain.getName());
factory.setManagerProperty("domain");
domain.addChildBean(factory);
}
}
private static class DomainBeanMetaDataInterceptor extends DefaultElementInterceptor
{
public static final DomainBeanMetaDataInterceptor INTERCEPTOR = new DomainBeanMetaDataInterceptor();
@Override
public void add(Object parent, Object child, QName name)
{
DomainBeanMetaDataFactory domain = (DomainBeanMetaDataFactory)parent;
AbstractBeanMetaData bean = (AbstractBeanMetaData)child;
//Overwrite the manager property
AspectManagerUtil util = new AspectManagerUtil();
util.setManagerBean(domain.getName());
util.setManagerProperty("domain");
util.setAspectManagerProperty(BeanMetaDataBuilder.createBuilder(bean), "manager");
domain.addChildBean(bean);
}
}
///////////////////////////////////////////////////////////////////////////////////////
//Characters Handlers
private static class AnnotationCharactersHandler extends CharactersHandler
{
public static final AnnotationCharactersHandler HANDLER = new AnnotationCharactersHandler();
@Override
public Object unmarshal(QName qName, TypeBinding typeBinding, NamespaceContext nsCtx, org.jboss.xb.binding.metadata.ValueMetaData valueMetaData, String value)
{
return value;
}
@Override
public void setValue(QName qname, ElementBinding element, Object owner, Object value)
{
BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder((BeanMetaData)owner);
builder.addPropertyMetaData("annotation", ((String)value).trim());
}
}
private static class StringBufferCharacterHandler extends CharactersHandler
{
public static final StringBufferCharacterHandler HANDLER = new StringBufferCharacterHandler();
@Override
public Object unmarshal(QName qName, TypeBinding typeBinding, NamespaceContext nsCtx, org.jboss.xb.binding.metadata.ValueMetaData valueMetaData, String value)
{
return value;
}
@Override
public void setValue(QName qname, ElementBinding element, Object owner, Object value)
{
((StringBuffer)owner).append(((String)value).trim());
}
}
}