net.femtoparsec.jnlmin.linesearch.AbstractLineSearch.java Source code

Java tutorial

Introduction

Here is the source code for net.femtoparsec.jnlmin.linesearch.AbstractLineSearch.java

Source

/*
 * @copyright Copyright (c) 2012, Bastien Aracil
 *    All rights reserved.
 *    New BSD license. See http://en.wikipedia.org/wiki/Bsd_license
 *
 *    Redistribution and use in source and binary forms, with or without
 *    modification, are permitted provided that the following conditions are met:
 *       * Redistributions of source code must retain the above copyright
 *         notice, this list of conditions and the following disclaimer.
 *       * Redistributions in binary form must reproduce the above copyright
 *         notice, this list of conditions and the following disclaimer in the
 *         documentation and/or other materials provided with the distribution.
 *       * The name of Bastien Aracil may not be used to endorse or promote products
 *         derived from this software without specific prior written permission.
 *
 *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 *    ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 *    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 *    DISCLAIMED. IN NO EVENT SHALL BASTIEN ARACIL BE LIABLE FOR ANY
 *    DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 *    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *    LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 *    ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 *    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package net.femtoparsec.jnlmin.linesearch;

import net.femtoparsec.jnlmin.LineSearch;
import net.femtoparsec.jnlmin.exception.InvalidLineSearchPropertyValueException;
import net.femtoparsec.jnlmin.exception.UnknownLineSearchPropertyException;
import net.femtoparsec.jnlmin.utils.PropertySetter;
import net.femtoparsec.jnlmin.utils.ReflectUtils;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

/**
 * @author Bastien Aracil
 * Date: 05/12/12
 */
public abstract class AbstractLineSearch implements LineSearch {

    private final String name;

    public AbstractLineSearch(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public void setProperties(Map<String, Object> properties) {
        PropertySetter propertySetter = PropertySetter.getPropertySetter(this.getClass());
        for (Map.Entry<String, Object> entry : properties.entrySet()) {
            String propertyName = entry.getKey();
            Object value = entry.getValue();
            if (value == null) {
                throw new InvalidLineSearchPropertyValueException(this.getName(), propertyName, null);
            }

            try {
                propertySetter.setProperty(this, propertyName, value.getClass(), value);
            } catch (NoSuchMethodException e) {
                throw new UnknownLineSearchPropertyException(this.getName(), propertyName, value);
            } catch (InvocationTargetException | IllegalAccessException e) {
                throw new InvalidLineSearchPropertyValueException(this.getName(), propertyName, value, e);
            }
        }
    }

    private void setProperty(Map<String, Map<Class<?>, Method>> unaryMethods, String propertyName, Object value) {
        try {
            final String setterName = String.format("set%s", StringUtils.capitalize(propertyName));
            Method setter = this.findClosestMethod(unaryMethods, setterName, value.getClass());
            setter.invoke(this, value);
        } catch (NoSuchMethodException e) {
            throw new UnknownLineSearchPropertyException(this.getName(), propertyName, value);
        } catch (Exception e) {
            throw new InvalidLineSearchPropertyValueException(this.getName(), propertyName, value);
        }
    }

    private Method findClosestMethod(Map<String, Map<Class<?>, Method>> unaryMethods, String methodName,
            Class<?> parameterType) throws NoSuchMethodException {
        Map<Class<?>, Method> candidates = unaryMethods.get(methodName);

        if (candidates == null) {
            throw new NoSuchMethodException(methodName);
        }

        Class<?> closest = ReflectUtils.findClosestClass(parameterType, candidates.keySet());
        if (closest == null) {
            throw new NoSuchMethodException(methodName);
        }
        return candidates.get(closest);
    }
}