public static void scheduleJobAction(PortletRequest request, String action)
      throws SchedulerException, ParseException {
    // Checking all the rows to see which are selected
    String rowSelection;
    for (int i = 0;
        (rowSelection = request.getParameter(PARAMETER_JOB_SELECTED + i)) != null;
        i++) {
      boolean rowSelected = GetterUtil.get(rowSelection, false);
      if (rowSelected) {

        String jobName = ParamUtil.getString(request, PARAMETER_JOB_NAME + i);
        String groupName = ParamUtil.getString(request, PARAMETER_JOB_GROUP + i);
        String storageTypeText = ParamUtil.getString(request, PARAMETER_STORAGE_TYPE + i);
        StorageType storageType = StorageType.valueOf(storageTypeText);

        // Log debug messages
        if (_log.isDebugEnabled()) {
          _log.debug(
              String.format(
                  LOG_JOB_FORMAT, action, LOG_ACTION_MSG, jobName, groupName, storageType));
        }

        if (action.equals(ACTION_PAUSE)) {
          SchedulerEngineHelperUtil.pause(jobName, groupName, storageType);
        } else if (action.equals(ACTION_RESUME)) {
          SchedulerEngineHelperUtil.resume(jobName, groupName, storageType);
        } else if (action.equals(ACTION_RUN)) {
          runScheduledJob(jobName, groupName);
        }
      }
    }
  }
  public static String get(HttpServletRequest request, String param, String defaultValue) {

    String returnValue = GetterUtil.get(request.getParameter(param), defaultValue);

    if (returnValue != null) {
      return returnValue.trim();
    }

    return null;
  }
  public static String get(ServiceContext serviceContext, String param, String defaultValue) {

    String returnValue = GetterUtil.get(serviceContext.getAttribute(param), defaultValue);

    if (returnValue != null) {
      return returnValue.trim();
    }

    return null;
  }
  public static float get(PortletRequest portletRequest, String param, float defaultValue) {

    return GetterUtil.get(portletRequest.getParameter(param), defaultValue);
  }
  public static Date get(
      PortletRequest portletRequest, String param, DateFormat dateFormat, Date defaultValue) {

    return GetterUtil.get(portletRequest.getParameter(param), dateFormat, defaultValue);
  }
  public static boolean get(PortletRequest portletRequest, String param, boolean defaultValue) {

    return GetterUtil.get(portletRequest.getParameter(param), defaultValue);
  }
  public static short get(HttpServletRequest request, String param, short defaultValue) {

    return GetterUtil.get(request.getParameter(param), defaultValue);
  }
  public static short get(ServiceContext serviceContext, String param, short defaultValue) {

    return GetterUtil.get(serviceContext.getAttribute(param), defaultValue);
  }
  public static Date get(
      ServiceContext serviceContext, String param, DateFormat dateFormat, Date defaultValue) {

    return GetterUtil.get(serviceContext.getAttribute(param), dateFormat, defaultValue);
  }
/** @author Amos Fong */
public class LicenseUtil {

  public static final String LICENSE_REPOSITORY_DIR =
      PropsValues.LIFERAY_HOME.concat("/data/license");

  public static final String LICENSE_SERVER_URL =
      GetterUtil.get(PropsUtil.get("license.server.url"), "https://www.liferay.com");

  public static Map<String, String> getClusterServerInfo(String clusterNodeId) throws Exception {

    List<ClusterNode> clusterNodes = ClusterExecutorUtil.getClusterNodes();

    ClusterNode clusterNode = null;

    for (ClusterNode curClusterNode : clusterNodes) {
      String curClusterNodeId = curClusterNode.getClusterNodeId();

      if (curClusterNodeId.equals(clusterNodeId)) {
        clusterNode = curClusterNode;

        break;
      }
    }

    if (clusterNode == null) {
      return null;
    }

    try {
      if (clusterNode.equals(ClusterExecutorUtil.getLocalClusterNode())) {
        return getServerInfo();
      }

      ClusterRequest clusterRequest =
          ClusterRequest.createUnicastRequest(_getServerInfoMethodHandler, clusterNodeId);

      FutureClusterResponses futureClusterResponses = ClusterExecutorUtil.execute(clusterRequest);

      ClusterNodeResponses clusterNodeResponses =
          futureClusterResponses.get(20000, TimeUnit.MILLISECONDS);

      ClusterNodeResponse clusterNodeResponse =
          clusterNodeResponses.getClusterResponse(clusterNode);

      return (Map<String, String>) clusterNodeResponse.getResult();
    } catch (Exception e) {
      _log.error(e, e);

      throw e;
    }
  }

  public static String getHostName() {
    if (_hostName == null) {
      _hostName = StringPool.BLANK;

      try {
        Runtime runtime = Runtime.getRuntime();

        Process process = runtime.exec("hostname");

        BufferedReader bufferedReader =
            new BufferedReader(new InputStreamReader(process.getInputStream()), 128);

        _hostName = bufferedReader.readLine();

        bufferedReader.close();
      } catch (Exception e) {
        _log.error("Unable to read local server's host name");

        _log.error(e, e);
      }
    }

    return _hostName;
  }

  public static Set<String> getIpAddresses() {
    if (_ipAddresses == null) {
      _ipAddresses = new HashSet<String>();

      try {
        List<NetworkInterface> networkInterfaces =
            Collections.list(NetworkInterface.getNetworkInterfaces());

        for (NetworkInterface networkInterface : networkInterfaces) {
          List<InetAddress> inetAddresses = Collections.list(networkInterface.getInetAddresses());

          for (InetAddress inetAddress : inetAddresses) {
            if (inetAddress.isLinkLocalAddress()
                || inetAddress.isLoopbackAddress()
                || !(inetAddress instanceof Inet4Address)) {

              continue;
            }

            _ipAddresses.add(inetAddress.getHostAddress());
          }
        }
      } catch (Exception e) {
        _log.error("Unable to read local server's IP addresses");

        _log.error(e, e);
      }
    }

    return new HashSet<String>(_ipAddresses);
  }

  public static Set<String> getMacAddresses() {
    if (_macAddresses != null) {
      return new HashSet<String>(_macAddresses);
    }

    Set<String> macAddresses = new HashSet<String>();

    String osName = System.getProperty("os.name");

    String executable = null;
    String arguments = null;

    if (StringUtil.startsWith(osName, "win")) {
      executable = "ipconfig";
      arguments = "/all";
    } else {
      if (StringUtil.startsWith(osName, "aix")) {
        executable = "netstat";
        arguments = "-ina";
      } else {
        executable = "ifconfig";
        arguments = "-a";
      }

      File sbinDir = new File("/sbin", executable);

      if (sbinDir.exists()) {
        executable = "/sbin/".concat(executable);
      }
    }

    try {
      Runtime runtime = Runtime.getRuntime();

      Process process = runtime.exec(new String[] {executable, arguments});

      macAddresses = getMacAddresses(osName, process.getInputStream());
    } catch (Exception e) {
      _log.error(e, e);
    }

    _macAddresses = macAddresses;

    return new HashSet<String>(macAddresses);
  }

  public static Set<String> getMacAddresses(String osName, InputStream processInputStream)
      throws Exception {

    Set<String> macAddresses = new HashSet<String>();

    Pattern macAddressPattern = _macAddressPattern1;

    if (StringUtil.startsWith(osName, "aix")) {
      macAddressPattern = _macAddressPattern2;
    }

    String processOutput = StringUtil.read(processInputStream);

    String[] lines = StringUtil.split(processOutput, CharPool.NEW_LINE);

    for (String line : lines) {
      Matcher matcher = macAddressPattern.matcher(line);

      if (!matcher.find()) {
        continue;
      }

      String macAddress = matcher.group(1);

      macAddress = macAddress.toLowerCase();
      macAddress = macAddress.replace(CharPool.DASH, CharPool.COLON);
      macAddress = macAddress.replace(CharPool.PERIOD, CharPool.COLON);

      StringBuilder sb = new StringBuilder(17);

      sb.append(macAddress);

      for (int i = 1; i < 5; ++i) {
        int pos = (i * 3) - 1;

        if (sb.charAt(pos) != CharPool.COLON) {
          sb.insert((i - 1) * 3, CharPool.NUMBER_0);
        }
      }

      if (sb.length() < 17) {
        sb.insert(15, CharPool.NUMBER_0);
      }

      macAddress = sb.toString();

      macAddresses.add(macAddress);
    }

    return macAddresses;
  }

  public static byte[] getServerIdBytes() throws Exception {
    if (_serverIdBytes != null) {
      return _serverIdBytes;
    }

    File serverIdFile = new File(LICENSE_REPOSITORY_DIR + "/server/serverId");

    if (!serverIdFile.exists()) {
      return new byte[0];
    }

    _serverIdBytes = FileUtil.getBytes(serverIdFile);

    return _serverIdBytes;
  }

  public static Map<String, String> getServerInfo() {
    Map<String, String> serverInfo = new HashMap<String, String>();

    serverInfo.put("hostName", getHostName());
    serverInfo.put("ipAddresses", StringUtil.merge(getIpAddresses()));
    serverInfo.put("macAddresses", StringUtil.merge(getMacAddresses()));

    return serverInfo;
  }

  public static void registerOrder(HttpServletRequest request) {
    String orderUuid = ParamUtil.getString(request, "orderUuid");
    String productEntryName = ParamUtil.getString(request, "productEntryName");
    int maxServers = ParamUtil.getInteger(request, "maxServers");

    List<ClusterNode> clusterNodes = ClusterExecutorUtil.getClusterNodes();

    if ((clusterNodes.size() <= 1)
        || Validator.isNull(productEntryName)
        || Validator.isNull(orderUuid)) {

      Map<String, Object> attributes = registerOrder(orderUuid, productEntryName, maxServers);

      for (Map.Entry<String, Object> entry : attributes.entrySet()) {
        request.setAttribute(entry.getKey(), entry.getValue());
      }
    } else {
      for (ClusterNode clusterNode : clusterNodes) {
        boolean register =
            ParamUtil.getBoolean(request, clusterNode.getClusterNodeId() + "_register");

        if (!register) {
          continue;
        }

        try {
          _registerClusterOrder(request, clusterNode, orderUuid, productEntryName, maxServers);
        } catch (Exception e) {
          _log.error(e, e);

          InetAddress inetAddress = clusterNode.getInetAddress();

          String message = "Error contacting " + inetAddress.getHostName();

          if (clusterNode.getPort() != -1) {
            message += StringPool.COLON + clusterNode.getPort();
          }

          request.setAttribute(clusterNode.getClusterNodeId() + "_ERROR_MESSAGE", message);
        }
      }
    }
  }

  public static Map<String, Object> registerOrder(
      String orderUuid, String productEntryName, int maxServers) {

    Map<String, Object> attributes = new HashMap<String, Object>();

    if (Validator.isNull(orderUuid)) {
      return attributes;
    }

    try {
      JSONObject jsonObject = _createRequest(orderUuid, productEntryName, maxServers);

      String response = sendRequest(jsonObject.toString());

      JSONObject responseJSONObject = JSONFactoryUtil.createJSONObject(response);

      attributes.put("ORDER_PRODUCT_ID", responseJSONObject.getString("productId"));
      attributes.put("ORDER_PRODUCTS", _getOrderProducts(responseJSONObject));

      String errorMessage = responseJSONObject.getString("errorMessage");

      if (Validator.isNotNull(errorMessage)) {
        attributes.put("ERROR_MESSAGE", errorMessage);

        return attributes;
      }

      String licenseXML = responseJSONObject.getString("licenseXML");

      if (Validator.isNotNull(licenseXML)) {
        LicenseManagerUtil.registerLicense(responseJSONObject);

        attributes.clear();
        attributes.put("SUCCESS_MESSAGE", "Your license has been successfully registered.");
      }
    } catch (Exception e) {
      _log.error(e, e);

      attributes.put("ERROR_MESSAGE", "There was an error contacting " + LICENSE_SERVER_URL);
    }

    return attributes;
  }

  public static String sendRequest(String request) throws Exception {
    InputStream inputStream = null;
    OutputStream outputStream = null;

    try {
      String serverURL = LICENSE_SERVER_URL;

      if (!serverURL.endsWith(StringPool.SLASH)) {
        serverURL += StringPool.SLASH;
      }

      serverURL += "osb-portlet/license";

      URL url = new URL(serverURL);

      URLConnection connection = null;

      if (Validator.isNotNull(_PROXY_URL)) {
        if (_log.isInfoEnabled()) {
          _log.info("Using proxy " + _PROXY_URL + StringPool.COLON + _PROXY_PORT);
        }

        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(_PROXY_URL, _PROXY_PORT));

        connection = url.openConnection(proxy);

        if (Validator.isNotNull(_PROXY_USER_NAME)) {
          String login = _PROXY_USER_NAME + StringPool.COLON + _PROXY_PASSWORD;

          String encodedLogin = Base64.encode(login.getBytes());

          connection.setRequestProperty("Proxy-Authorization", "Basic " + encodedLogin);
        }
      } else {
        connection = url.openConnection();
      }

      connection.setDoOutput(true);

      outputStream = connection.getOutputStream();

      outputStream.write(_encryptRequest(serverURL, request));

      String response = _decryptResponse(serverURL, connection.getInputStream());

      if (_log.isDebugEnabled()) {
        _log.debug("Server response: " + response);
      }

      if (Validator.isNull(response)) {
        throw new Exception("Server response is null");
      }

      return response;
    } finally {
      try {
        if (inputStream != null) {
          inputStream.close();
        }
      } catch (Exception e) {
      }

      try {
        if (outputStream != null) {
          outputStream.close();
        }
      } catch (Exception e) {
      }
    }
  }

  public static void writeServerProperties(byte[] serverIdBytes) throws Exception {

    File serverIdFile = new File(LICENSE_REPOSITORY_DIR + "/server/serverId");

    FileUtil.write(serverIdFile, serverIdBytes);
  }

  private static JSONObject _createRequest(
      String orderUuid, String productEntryName, int maxServers) throws Exception {

    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();

    jsonObject.put("version", 2);
    jsonObject.put("orderUuid", orderUuid);
    jsonObject.put("liferayVersion", ReleaseInfo.getBuildNumber());

    if (Validator.isNull(productEntryName)) {
      jsonObject.put("cmd", "QUERY");
    } else {
      jsonObject.put("cmd", "REGISTER");

      if (productEntryName.startsWith("basic")) {
        jsonObject.put("productEntryName", "basic");

        if (productEntryName.equals("basic-cluster")) {
          jsonObject.put("cluster", true);
          jsonObject.put("maxServers", maxServers);
        } else if (productEntryName.startsWith("basic-")) {
          String[] productNameArray = StringUtil.split(productEntryName, StringPool.DASH);

          if (productNameArray.length >= 3) {
            jsonObject.put("offeringEntryId", productNameArray[1]);
            jsonObject.put("clusterId", productNameArray[2]);
          }
        }
      } else {
        jsonObject.put("productEntryName", productEntryName);
      }

      jsonObject.put("hostName", getHostName());
      jsonObject.put("ipAddresses", StringUtil.merge(getIpAddresses()));
      jsonObject.put("macAddresses", StringUtil.merge(getMacAddresses()));
      jsonObject.put("serverId", Arrays.toString(getServerIdBytes()));
    }

    return jsonObject;
  }

  private static String _decryptResponse(String serverURL, InputStream inputStream)
      throws Exception {

    if (serverURL.startsWith(Http.HTTPS)) {
      return StringUtil.read(inputStream);
    } else {
      byte[] bytes = IOUtils.toByteArray(inputStream);

      if ((bytes == null) || (bytes.length <= 0)) {
        return null;
      }

      bytes = Encryptor.decryptUnencodedAsBytes(_symmetricKey, bytes);

      return new String(bytes, StringPool.UTF8);
    }
  }

  private static byte[] _encryptRequest(String serverURL, String request) throws Exception {

    byte[] bytes = request.getBytes(StringPool.UTF8);

    if (serverURL.startsWith(Http.HTTPS)) {
      return bytes;
    } else {
      JSONObject jsonObject = JSONFactoryUtil.createJSONObject();

      bytes = Encryptor.encryptUnencoded(_symmetricKey, bytes);

      jsonObject.put("content", Base64.objectToString(bytes));
      jsonObject.put("key", _encryptedSymmetricKey);

      return jsonObject.toString().getBytes(StringPool.UTF8);
    }
  }

  private static Map<String, String> _getOrderProducts(JSONObject jsonObject) {

    JSONObject productsJSONObject = jsonObject.getJSONObject("productsJSONObject");

    if (productsJSONObject == null) {
      return null;
    }

    Map<String, String> sortedMap = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);

    Iterator<String> itr = productsJSONObject.keys();

    while (itr.hasNext()) {
      String key = itr.next();

      sortedMap.put(key, productsJSONObject.getString(key));
    }

    return sortedMap;
  }

  private static void _initKeys() {
    ClassLoader classLoader = ClassLoaderUtil.getPortalClassLoader();

    if ((classLoader == null) || (_encryptedSymmetricKey != null)) {
      return;
    }

    try {
      URL url = classLoader.getResource("com/liferay/portal/license/public.key");

      byte[] bytes = IOUtils.toByteArray(url.openStream());

      X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(bytes);

      KeyFactory keyFactory = KeyFactory.getInstance("RSA");

      PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

      KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");

      keyGenerator.init(128, new SecureRandom());

      _symmetricKey = keyGenerator.generateKey();

      byte[] encryptedSymmetricKey =
          Encryptor.encryptUnencoded(publicKey, _symmetricKey.getEncoded());

      _encryptedSymmetricKey = Base64.objectToString(encryptedSymmetricKey);
    } catch (Exception e) {
      _log.error(e, e);
    }
  }

  private static void _registerClusterOrder(
      HttpServletRequest request,
      ClusterNode clusterNode,
      String orderUuid,
      String productEntryName,
      int maxServers)
      throws Exception {

    MethodHandler methodHandler =
        new MethodHandler(_registerOrderMethodKey, orderUuid, productEntryName, maxServers);

    ClusterRequest clusterRequest =
        ClusterRequest.createUnicastRequest(methodHandler, clusterNode.getClusterNodeId());

    FutureClusterResponses futureClusterResponses = ClusterExecutorUtil.execute(clusterRequest);

    ClusterNodeResponses clusterNodeResponses =
        futureClusterResponses.get(20000, TimeUnit.MILLISECONDS);

    ClusterNodeResponse clusterNodeResponse = clusterNodeResponses.getClusterResponse(clusterNode);

    Map<String, Object> attributes = (Map<String, Object>) clusterNodeResponse.getResult();

    for (Map.Entry<String, Object> entry : attributes.entrySet()) {
      request.setAttribute(
          clusterNode.getClusterNodeId() + StringPool.UNDERLINE + entry.getKey(), entry.getValue());
    }
  }

  private static final String _PROXY_PASSWORD =
      GetterUtil.getString(PropsUtil.get("license.proxy.password"));

  private static final int _PROXY_PORT =
      GetterUtil.getInteger(PropsUtil.get("license.proxy.port"), 80);

  private static final String _PROXY_URL = PropsUtil.get("license.proxy.url");

  private static final String _PROXY_USER_NAME =
      GetterUtil.getString(PropsUtil.get("license.proxy.username"));

  private static Log _log = LogFactoryUtil.getLog(DefaultLicenseManagerImpl.class);

  private static String _encryptedSymmetricKey;
  private static MethodHandler _getServerInfoMethodHandler =
      new MethodHandler(new MethodKey(LicenseUtil.class, "getServerInfo"));
  private static String _hostName;
  private static Set<String> _ipAddresses;
  private static Set<String> _macAddresses;
  private static Pattern _macAddressPattern1 =
      Pattern.compile("\\s((\\p{XDigit}{2}(-|:)){5}(\\p{XDigit}{2}))(?:\\s|$)");
  private static Pattern _macAddressPattern2 =
      Pattern.compile("\\s((\\p{XDigit}{1,2}(\\.)){5}(\\p{XDigit}{1,2}))(?:\\s|$)");
  private static MethodKey _registerOrderMethodKey =
      new MethodKey(LicenseUtil.class, "registerOrder", String.class, String.class, int.class);
  private static byte[] _serverIdBytes;
  private static Key _symmetricKey;

  static {
    _initKeys();
  }
}
 protected void addPathElement(StringBuilder sb, String value) {
   sb.append(StringPool.SLASH);
   sb.append(GetterUtil.get(HttpUtil.encodeURL(value), StringPool.DASH));
 }