ParameterUtil.java

/*
 * Created on 2008/06/04
 * Copyright (C) 2008 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.control.system;

import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;

import org.mklab.tool.control.system.parameter.NoSuchParameterException;


/**
 * ユーザ定義システムのためのユーティリティクラスです。
 * 
 * @author koga
 * @version $Revision: 1.3 $, 2008/06/04
 */
public class ParameterUtil {

  /**
   * システムのパラメータの値を返します。
   * 
   * @param klass システムを定義したクラス
   * @param name パラメータの名前
   * @return システムのパラメータの値
   * @throws NoSuchParameterException パラメータが存在しない場合、パラメータにアクセスできない場合
   */
  public static Object getValue(final Class<?> klass, final String name) throws NoSuchParameterException {
    if (klass == null) throw new NullPointerException();
    if (name == null) throw new NullPointerException();

    try {
      final Field parameter = klass.getDeclaredField(name);
      parameter.setAccessible(true);
      return parameter.get(null);
    } catch (SecurityException e) {
      throw new NoSuchParameterException(e);
    } catch (NoSuchFieldException e) {
      throw new NoSuchParameterException(e);
    } catch (IllegalArgumentException e) {
      throw new NoSuchParameterException(e);
    } catch (IllegalAccessException e) {
      throw new NoSuchParameterException(e);
    }
  }

  /**
   * システムパラメータの名前の集合を返します。
   * 
   * @param klass システムを定義したクラス
   * @return システムパラメータの名前集合
   * @throws NoSuchParameterException パラメータにアクセスできない場合
   */
  public static Set<String> getParameterNames(final Class<?> klass) throws NoSuchParameterException {
    if (klass == null) throw new NullPointerException();

    try {
      final Set<String> parameters = new HashSet<>();
      for (final Field field : klass.getDeclaredFields()) {
        parameters.add(field.getName());
      }
      return parameters;
    } catch (SecurityException e) {
      throw new NoSuchParameterException(e);
    } catch (IllegalArgumentException e) {
      throw new NoSuchParameterException(e);
    }
  }

  /**
   * システムのパラメータの値を設定します。
   * 
   * @param klass システムを定義したクラス
   * @param name パラメータの名前
   * @param value システムのパラメータの値
   * @throws NoSuchParameterException パラメータが存在しない場合、パラメータにアクセスできない場合
   */
  public static void setValue(final Class<?> klass, final String name, final Object value) throws NoSuchParameterException {
    if (klass == null) throw new NullPointerException();
    if (name == null) throw new NullPointerException();

    try {
      final Field parameter = klass.getDeclaredField(name);
      parameter.setAccessible(true);
      parameter.set(null, value);
    } catch (SecurityException e) {
      throw new NoSuchParameterException(e);
    } catch (NoSuchFieldException e) {
      throw new NoSuchParameterException(e);
    } catch (IllegalArgumentException e) {
      throw new NoSuchParameterException(e);
    } catch (IllegalAccessException e) {
      throw new NoSuchParameterException(e);
    }
  }

  /**
   * システムが指定した名前のパラメータをもつか判定します。
   * 
   * @param klass システムを定義したクラス
   * @param name パラメータの名前
   * @return システムが指定した名前のパラメータをもつならばtrue、そうでなければfalse
   */
  public static boolean contains(Class<?> klass, String name) {
    if (klass == null) throw new NullPointerException();
    if (name == null) throw new NullPointerException();

    final Field[] fields = klass.getDeclaredFields();

    for (final Field field : fields) {
      if (name.equals(field.getName())) {
        return true;
      }
    }

    return false;
  }

}