public void downloadApp(ActionRequest actionRequest, ActionResponse actionResponse)
      throws Exception {

    long appPackageId = ParamUtil.getLong(actionRequest, "appPackageId");
    boolean unlicensed = ParamUtil.getBoolean(actionRequest, "unlicensed");

    File file = null;

    try {
      file = FileUtil.createTempFile();

      downloadApp(actionRequest, actionResponse, appPackageId, unlicensed, file);

      App app = _appService.updateApp(file);

      JSONObject jsonObject = getAppJSONObject(app.getRemoteAppId());

      jsonObject.put("cmd", "downloadApp");
      jsonObject.put("message", "success");

      writeJSON(actionRequest, actionResponse, jsonObject);
    } finally {
      if (file != null) {
        file.delete();
      }
    }
  }
  protected static List<String> getAppCategories(List<App> apps) {
    List<String> categories = new ArrayList<>(apps.size());

    for (App app : apps) {
      if (Validator.isNotNull(app.getCategory())) {
        categories.add(app.getCategory());
      }
    }

    return categories;
  }
  protected JSONObject getAppJSONObject(long remoteAppId) throws Exception {
    JSONObject jsonObject = JSONFactoryUtil.createJSONObject();

    App app = _appLocalService.fetchRemoteApp(remoteAppId);

    if (app != null) {
      jsonObject.put("appId", app.getRemoteAppId());
      jsonObject.put("downloaded", app.isDownloaded());
      jsonObject.put("installed", app.isInstalled());
      jsonObject.put("version", app.getVersion());
    } else {
      jsonObject.put("appId", remoteAppId);
      jsonObject.put("downloaded", false);
      jsonObject.put("installed", false);
      jsonObject.put("version", StringPool.BLANK);
    }

    return jsonObject;
  }
  public void updateApp(ActionRequest actionRequest, ActionResponse actionResponse)
      throws Exception {

    long appPackageId = ParamUtil.getLong(actionRequest, "appPackageId");
    boolean unlicensed = ParamUtil.getBoolean(actionRequest, "unlicensed");
    String orderUuid = ParamUtil.getString(actionRequest, "orderUuid");
    String productEntryName = ParamUtil.getString(actionRequest, "productEntryName");

    File file = null;

    try {
      file = FileUtil.createTempFile();

      downloadApp(actionRequest, actionResponse, appPackageId, unlicensed, file);

      App app = _appService.updateApp(file);

      if (Validator.isNull(orderUuid) && Validator.isNotNull(productEntryName)) {

        orderUuid = MarketplaceLicenseUtil.getOrder(productEntryName);
      }

      if (Validator.isNotNull(orderUuid)) {
        MarketplaceLicenseUtil.registerOrder(orderUuid, productEntryName);
      }

      _appService.installApp(app.getRemoteAppId());

      JSONObject jsonObject = getAppJSONObject(app.getRemoteAppId());

      jsonObject.put("cmd", "updateApp");
      jsonObject.put("message", "success");

      writeJSON(actionRequest, actionResponse, jsonObject);
    } finally {
      if (file != null) {
        file.delete();
      }
    }
  }