EnvironmentLookup.java

/*
 * Created on 2010/07/26
 * Copyright (C) 2010 Koga Laboratory. All rights reserved.
 *
 */
package org.mklab.tool.graph.gnuplot;

import java.io.File;


/**
 * gnuplotの実行環境の調査を行うクラスです。
 * 
 * @author Yuhi Ishikura
 * @version $Revision$, 2010/07/26
 */
class EnvironmentLookup {

  /** GNUPLOT_HOME探索のための環境変数名です。 */
  private static final String GNUPLOT_HOME_ENV = "GNUPLOT_HOME"; //$NON-NLS-1$

  /**
   * 作業ディレクトリを探します。
   * 
   * @return 作業ディレクトリ
   */
  static File findWorkingDirectory() {
    return new File("."); //$NON-NLS-1$
  }

  /**
   * gnuplotのホームディレクトリを取得します。
   * 
   * @return gnuplotのホームディレクトリ
   * @throws IllegalArgumentException gnuplotホームが見つからない、または正しくない場合。
   */
  static File findHomeDirectory() {
    String home = getGnuplotHomeInEnvironmentVariables();

    if (home == null) {
      if (isWindows()) {
        final File homeOnWindows = findGeneralGnuplotHomeOnWindows();
        if (homeOnWindows != null) {
          return homeOnWindows;
        }
      }
      return new File("."); //$NON-NLS-1$
    }

    File homeDir = new File(home);
    final String lastPathName = homeDir.getName();
    if (lastPathName.equals("bin") || lastPathName.equals("binary")) { //$NON-NLS-1$ //$NON-NLS-2$
      homeDir = homeDir.getParentFile();
    }

    return homeDir;
  }

  /**
   * Windows上での一般的なgnuplotフォルダを探索します。
   * 
   * @return gnuplotホームディレクトリ
   */
  private static File findGeneralGnuplotHomeOnWindows() {
    File home = new File("C:\\Program Files\\gnuplot"); //$NON-NLS-1$
    if (home.exists()) {
      return home;
    }

    home = new File("C:\\Program Files (x86)\\gnuplot"); //$NON-NLS-1$
    if (home.exists()) {
      return home;
    }

    return null;
  }

  /**
   * 環境変数中のGNUPLOT_HOMEを取得します。
   * 
   * @return GNUPLOT_HOME。設定されていない場合はnull
   */
  private static String getGnuplotHomeInEnvironmentVariables() {
    String gnuplotHome = System.getProperty(GNUPLOT_HOME_ENV);
    if (gnuplotHome == null) {
      gnuplotHome = System.getenv(GNUPLOT_HOME_ENV);
    }

    return gnuplotHome;
  }

  /**
   * Windows環境であるか調べます。
   * 
   * @return Windows環境であればtrue,そうでなければfalse
   */
  private static boolean isWindows() {
    if (System.getProperty("os.name").startsWith("Windows")) { //$NON-NLS-1$ //$NON-NLS-2$
      return true;
    }

    return false;
  }

}