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

com.groupbyinc.common.util.collections4.functors.InstantiateTransformer Maven / Gradle / Ivy

There is a newer version: 29
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.commons.collections4.functors;

import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import org.apache.commons.collections4.FunctorException;
import org.apache.commons.collections4.Transformer;

/**
 * Transformer implementation that creates a new object instance by reflection.
 *
 * @since 3.0
 * @version $Id: InstantiateTransformer.java 1543950 2013-11-20 21:13:35Z tn $
 */
public class InstantiateTransformer implements Transformer, T>, Serializable {

    /** The serial version */
    private static final long serialVersionUID = 3786388740793356347L;

    /** Singleton instance that uses the no arg constructor */
    @SuppressWarnings("rawtypes")
    private static final Transformer NO_ARG_INSTANCE = new InstantiateTransformer();

    /** The constructor parameter types */
    private final Class[] iParamTypes;
    /** The constructor arguments */
    private final Object[] iArgs;

    /**
     * Get a typed no-arg instance.
     *
     * @param   the type of the objects to be created
     * @return Transformer, T>
     */
    @SuppressWarnings("unchecked")
    public static  Transformer, T> instantiateTransformer() {
        return (Transformer, T>) NO_ARG_INSTANCE;
    }

    /**
     * Transformer method that performs validation.
     *
     * @param   the type of the objects to be created
     * @param paramTypes  the constructor parameter types
     * @param args  the constructor arguments
     * @return an instantiate transformer
     */
    public static  Transformer, T> instantiateTransformer(final Class[] paramTypes,
                                                                                final Object[] args) {
        if (((paramTypes == null) && (args != null))
            || ((paramTypes != null) && (args == null))
            || ((paramTypes != null) && (args != null) && (paramTypes.length != args.length))) {
            throw new IllegalArgumentException("Parameter types must match the arguments");
        }

        if (paramTypes == null || paramTypes.length == 0) {
            return new InstantiateTransformer();
        }
        return new InstantiateTransformer(paramTypes, args);
    }

    /**
     * Constructor for no arg instance.
     */
    private InstantiateTransformer() {
        super();
        iParamTypes = null;
        iArgs = null;
    }

    /**
     * Constructor that performs no validation.
     * Use instantiateTransformer if you want that.
     * 

* Note: from 4.0, the input parameters will be cloned * * @param paramTypes the constructor parameter types * @param args the constructor arguments */ public InstantiateTransformer(final Class[] paramTypes, final Object[] args) { super(); iParamTypes = paramTypes != null ? paramTypes.clone() : null; iArgs = args != null ? args.clone() : null; } /** * Transforms the input Class object to a result by instantiation. * * @param input the input object to transform * @return the transformed result */ public T transform(final Class input) { try { if (input == null) { throw new FunctorException( "InstantiateTransformer: Input object was not an instanceof Class, it was a null object"); } final Constructor con = input.getConstructor(iParamTypes); return con.newInstance(iArgs); } catch (final NoSuchMethodException ex) { throw new FunctorException("InstantiateTransformer: The constructor must exist and be public "); } catch (final InstantiationException ex) { throw new FunctorException("InstantiateTransformer: InstantiationException", ex); } catch (final IllegalAccessException ex) { throw new FunctorException("InstantiateTransformer: Constructor must be public", ex); } catch (final InvocationTargetException ex) { throw new FunctorException("InstantiateTransformer: Constructor threw an exception", ex); } } }