SyntaxUtils.java

package org.cyclopsgroup.jmxterm;

import java.io.IOException;
import java.io.PrintStream;
import java.util.regex.Pattern;
import javax.management.remote.JMXServiceURL;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.io.output.NullOutputStream;
import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.cyclopsgroup.jmxterm.utils.ValueFormat;

/**
 * Utility class for syntax checking
 *
 * @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a>
 */
public final class SyntaxUtils {
  /** NULL string identifier */
  public static final String NULL = ValueFormat.NULL;

  /** Null print stream to redirect std streams */
  public static final PrintStream NULL_PRINT_STREAM = new PrintStream(new NullOutputStream(), true);

  private static final Pattern PATTERN_HOST_PORT = Pattern.compile("^(\\w|\\.|\\-)+\\:\\d+$");

  /**
   * @param url String expression of MBean server URL or abbreviation like localhost:9991
   * @param jpm Java process manager to get process URL
   * @return Parsed JMXServerURL
   * @throws IOException IO error
   */
  public static JMXServiceURL getUrl(String url, JavaProcessManager jpm) throws IOException {
    if (StringUtils.isEmpty(url)) {
      throw new IllegalArgumentException("Empty URL is not allowed");
    } else if (NumberUtils.isDigits(url) && jpm != null) {
      Integer pid = Integer.parseInt(url);
      JavaProcess p;

      p = jpm.get(pid);
      if (p == null) {
        throw new NullPointerException("No such PID " + pid);
      }
      if (!p.isManageable()) {
        p.startManagementAgent();
        if (!p.isManageable()) {
          throw new IllegalStateException(
              "Managed agent for PID "
                  + pid
                  + " couldn't start. PID "
                  + pid
                  + " is not manageable");
        }
      }
      return new JMXServiceURL(p.toUrl());

    } else if (PATTERN_HOST_PORT.matcher(url).find()) {
      return new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + url + "/jmxrmi");
    } else {
      return new JMXServiceURL(url);
    }
  }

  /**
   * Check if string value is <code>null</code>
   *
   * @param s String value
   * @return True if value is <code>null</code>
   */
  public static boolean isNull(String s) {
    return StringUtils.equalsIgnoreCase(NULL, s) || StringUtils.equals("*", s);
  }

  /**
   * Parse given string expression to expected type of value
   *
   * @param expression String expression
   * @param type Target type
   * @return Object of value
   */
  public static Object parse(String expression, String type) {
    if (expression == null || StringUtils.equalsIgnoreCase(NULL, expression)) {
      return null;
    }
    Class<?> c;
    try {
      c = ClassUtils.getClass(type);
    } catch (ClassNotFoundException e) {
      throw new IllegalArgumentException("Type " + type + " isn't valid", e);
    }
    if (c == String.class) {
      return expression;
    }
    if (StringUtils.isEmpty(expression)) {
      return null;
    }
    return ConvertUtils.convert(expression, c);
  }

  private SyntaxUtils() {}
}