Package org.xeustechnologies.jcl.spring

Source Code of org.xeustechnologies.jcl.spring.JclBeanDefinitionDecorator

/**
*  JCL (Jar Class Loader)
*
*  Copyright (C) 2011  Kamran Zafar
*
*  This file is part of Jar Class Loader (JCL).
*  Jar Class Loader (JCL) 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 3 of the License, or
*  (at your option) any later version.
*
*  JarClassLoader 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 JCL.  If not, see <http://www.gnu.org/licenses/>.
*
@author Kamran Zafar
*
*  Contact Info:
*  Email:  xeus.man@gmail.com
*  Web:    http://xeustech.blogspot.com
*/

package org.xeustechnologies.jcl.spring;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionDecorator;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Node;
import org.xeustechnologies.jcl.JclObjectFactory;
import org.xeustechnologies.jcl.exception.JclException;

/**
* @author Kamran Zafar
*
*/
public class JclBeanDefinitionDecorator implements BeanDefinitionDecorator {

    private static final String JCL_REF = "ref";
    private static final String JCL_FACTORY = "jcl-factory-" + UUID.randomUUID();
    private static final String JCL_FACTORY_METHOD = "create";
    private static final String JCL_FACTORY_CONSTRUCTOR = "getInstance";

    public BeanDefinitionHolder decorate(Node node, BeanDefinitionHolder holder, ParserContext parserContext) {
        String jclRef = node.getAttributes().getNamedItem( JCL_REF ).getNodeValue();

        GenericBeanDefinition bd = new GenericBeanDefinition();
        bd.setFactoryBeanName( JCL_FACTORY );
        bd.setFactoryMethodName( JCL_FACTORY_METHOD );
        bd.setConstructorArgumentValues( holder.getBeanDefinition().getConstructorArgumentValues() );
        bd.setPropertyValues( holder.getBeanDefinition().getPropertyValues() );
        bd.getConstructorArgumentValues().addIndexedArgumentValue( 0,
                new ConstructorArgumentValues.ValueHolder( parserContext.getRegistry().getBeanDefinition( jclRef ) ) );
        bd.getConstructorArgumentValues().addIndexedArgumentValue( 1,
                new ConstructorArgumentValues.ValueHolder( holder.getBeanDefinition().getBeanClassName() ) );

        BeanDefinitionHolder newHolder = new BeanDefinitionHolder( bd, holder.getBeanName() );

        createDependencyOnJcl( node, newHolder, parserContext );

        return newHolder;
    }

    @SuppressWarnings("unchecked")
    private void createDependencyOnJcl(Node node, BeanDefinitionHolder holder, ParserContext parserContext) {
        AbstractBeanDefinition definition = ( (AbstractBeanDefinition) holder.getBeanDefinition() );
        String jclRef = node.getAttributes().getNamedItem( JCL_REF ).getNodeValue();

        if( !parserContext.getRegistry().containsBeanDefinition( JCL_FACTORY ) ) {
            BeanDefinitionBuilder initializer = BeanDefinitionBuilder.rootBeanDefinition( JclObjectFactory.class,
                    JCL_FACTORY_CONSTRUCTOR );
            parserContext.getRegistry().registerBeanDefinition( JCL_FACTORY, initializer.getBeanDefinition() );
        }

        if( parserContext.getRegistry().containsBeanDefinition( jclRef ) ) {
            String[] dependsOn = definition.getDependsOn();
            if( dependsOn == null ) {
                dependsOn = new String[] { jclRef, JCL_FACTORY };
            } else {
                List dependencies = new ArrayList( Arrays.asList( dependsOn ) );
                dependencies.add( jclRef );
                dependencies.add( JCL_FACTORY );
                dependsOn = (String[]) dependencies.toArray( new String[0] );
            }
            definition.setDependsOn( dependsOn );
        } else
            throw new JclException( "JCL Bean definition " + jclRef + "not found" );
    }
}
TOP

Related Classes of org.xeustechnologies.jcl.spring.JclBeanDefinitionDecorator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.