All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.feilong.lib.digester3.binder.FactoryCreateBuilder Maven / Gradle / Ivy

Go to download

feilong is a suite of core and expanded libraries that include utility classes, http, excel,cvs, io classes, and much much more.

There is a newer version: 4.3.0
Show newest version
package com.feilong.lib.digester3.binder;

import com.feilong.lib.digester3.FactoryCreateRule;
import com.feilong.lib.digester3.ObjectCreationFactory;

/**
 * Builder chained when invoking {@link LinkedRuleBuilder#factoryCreate()}.
 *
 * @since 3.0
 */
public final class FactoryCreateBuilder extends AbstractBackToLinkedRuleBuilder{

    private final ClassLoader                         classLoader;

    private Class> type;

    private String                                    attributeName;

    private boolean                                   ignoreCreateExceptions;

    private ObjectCreationFactory                  creationFactory;

    FactoryCreateBuilder(String keyPattern, String namespaceURI, RulesBinder mainBinder, LinkedRuleBuilder mainBuilder,
                    ClassLoader classLoader){
        super(keyPattern, namespaceURI, mainBinder, mainBuilder);
        this.classLoader = classLoader;
    }

    /**
     * Construct a factory create rule that will use the specified class name to create an {@link ObjectCreationFactory}
     * which will then be used to create an object and push it on the stack.
     *
     * @param className
     *            Java class name of the object creation factory class
     * @return this builder instance
     */
    @SuppressWarnings("unchecked") // if class not assignable, will be notified via exception
    public FactoryCreateBuilder ofType(String className){
        if (className == null){
            reportError("factoryCreate().ofType( String )", "NULL Java type not allowed");
        }

        try{
            Class type = this.classLoader.loadClass(className);
            if (!ObjectCreationFactory.class.isAssignableFrom(type)){
                reportError("factoryCreate().ofType( String )", "NULL Java type not allowed");
                return this;
            }

            this.type = (Class>) type;
        }catch (ClassNotFoundException e){
            reportError("factoryCreate().ofType( String )", String.format("class '%s' cannot be load", className));
        }

        return this;
    }

    /**
     * Construct a factory create rule that will use the specified class to create an {@link ObjectCreationFactory}
     * which will then be used to create an object and push it on the stack.
     *
     * @param type
     *            Java class of the object creation factory class
     * @return this builder instance
     */
    public FactoryCreateBuilder ofType(Class> type){
        if (type == null){
            reportError("factoryCreate().ofType( Class> )", "NULL Java type not allowed");
        }

        this.type = type;

        return this;
    }

    /**
     * Construct a factory create rule using the given, already instantiated, {@link ObjectCreationFactory}.
     *
     * @param 
     *            the type of created object by the given factory
     * @param creationFactory
     *            called on to create the object
     * @return this builder instance
     */
    public  FactoryCreateBuilder usingFactory( /* @Nullable */ObjectCreationFactory creationFactory){
        this.creationFactory = creationFactory;
        return this;
    }

    /**
     * Allows specify the attribute containing an override class name if it is present.
     *
     * @param attributeName
     *            The attribute containing an override class name if it is present
     * @return this builder instance
     */
    public FactoryCreateBuilder overriddenByAttribute( /* @Nullable */String attributeName){
        this.attributeName = attributeName;
        return this;
    }

    /**
     * Exceptions thrown by the object creation factory will be ignored or not.
     *
     * @param ignoreCreateExceptions
     *            if true, exceptions thrown by the object creation factory will be ignored
     * @return this builder instance
     */
    public FactoryCreateBuilder ignoreCreateExceptions(boolean ignoreCreateExceptions){
        this.ignoreCreateExceptions = ignoreCreateExceptions;
        return this;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected FactoryCreateRule createRule(){
        if (type == null && attributeName == null && creationFactory == null){
            reportError("factoryCreate()", "at least one between 'className', 'attributeName' or 'creationFactory' has to be specified");
        }

        if (type != null || attributeName != null){
            return new FactoryCreateRule(type, attributeName, ignoreCreateExceptions);
        }

        return new FactoryCreateRule(creationFactory, ignoreCreateExceptions);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy