예제 #1
0
  /**
   * Returns a JSON representation of the environments (with servers) that the Role with the given
   * roleid can push to <br>
   * Each Environment node contains: id, name.
   *
   * <p>Usage: /loadenvironments/{roleid}
   *
   * @throws JSONException
   */
  @GET
  @Path("/loadenvironments/{params:.*}")
  @Produces("application/json")
  public Response loadEnvironments(
      @Context HttpServletRequest request, @PathParam("params") String params)
      throws DotStateException, DotDataException, DotSecurityException, LanguageException,
          JSONException {

    InitDataObject initData = init(params, true, request, true);

    // Creating an utility response object
    ResourceResponse responseResource = new ResourceResponse(initData.getParamsMap());

    String roleId = initData.getParamsMap().get("roleid");

    // Using JsonArray instead of manually creating the json object
    JSONArray jsonEnvironments = new JSONArray();

    // First objects is expected to be blank
    JSONObject jsonEnvironmentFirst = new JSONObject();
    jsonEnvironmentFirst.put("id", "0");
    jsonEnvironmentFirst.put("name", "");

    jsonEnvironments.add(jsonEnvironmentFirst);

    Role role = APILocator.getRoleAPI().loadRoleById(roleId);
    User user = APILocator.getUserAPI().loadUserById(role.getRoleKey());
    boolean isAdmin = APILocator.getUserAPI().isCMSAdmin(user);

    List<Role> roles = APILocator.getRoleAPI().loadRolesForUser(user.getUserId(), true);
    Set<Environment> environments = new HashSet<Environment>();
    if (isAdmin) {
      List<Environment> app = APILocator.getEnvironmentAPI().findEnvironmentsWithServers();
      for (Environment e : app) environments.add(e);
    } else
      for (Role r : roles)
        environments.addAll(APILocator.getEnvironmentAPI().findEnvironmentsByRole(r.getId()));

    // For each env, create one json and add it to the array
    for (Environment e : environments) {

      JSONObject environmentBundle = new JSONObject();
      environmentBundle.put("id", e.getId());
      // Escape name for cases like: dotcms's
      environmentBundle.put("name", StringEscapeUtils.unescapeJava(e.getName()));

      jsonEnvironments.add(environmentBundle);
    }

    CacheControl cc = new CacheControl();
    cc.setNoCache(true);
    return Response.ok(jsonEnvironments.toString(), MediaType.APPLICATION_JSON_TYPE)
        .cacheControl(cc)
        .build();
  }
  /**
   * Adds to an specific given bundle a given asset. <br>
   * If the given bundle does not exist a new onw will be created with that name
   *
   * @param request HttpRequest
   * @param response HttpResponse
   */
  public void addToBundle(HttpServletRequest request, HttpServletResponse response)
      throws IOException {

    PublisherAPI publisherAPI = PublisherAPI.getInstance();
    String _assetId = request.getParameter("assetIdentifier");
    String _contentFilterDate = request.getParameter("remoteFilterDate");
    String bundleName = request.getParameter("bundleName");
    String bundleId = request.getParameter("bundleSelect");

    try {
      Bundle bundle;

      if (bundleId == null || bundleName.equals(bundleId)) {
        // if the user has a unsent bundle with that name just add to it
        bundle = null;
        for (Bundle b :
            APILocator.getBundleAPI()
                .getUnsendBundlesByName(getUser().getUserId(), bundleName, 1000, 0)) {
          if (b.getName().equalsIgnoreCase(bundleName)) {
            bundle = b;
          }
        }

        if (bundle == null) {
          bundle = new Bundle(bundleName, null, null, getUser().getUserId());
          APILocator.getBundleAPI().saveBundle(bundle);
        }
      } else {
        bundle = APILocator.getBundleAPI().getBundleById(bundleId);
      }

      // Put the selected bundle in session in order to have last one selected
      request.getSession().setAttribute(WebKeys.SELECTED_BUNDLE, bundle);

      List<String> ids;
      if (_assetId.startsWith("query_")) { // Support for lucene queries

        String luceneQuery = _assetId.replace("query_", "");
        List<String> queries = new ArrayList<String>();
        queries.add(luceneQuery);
        ids = PublisherUtil.getContentIds(queries);

      } else {

        String[] _assetsIds =
            _assetId.split(","); // Support for multiple ids in the assetIdentifier parameter
        List<String> assetsIds = Arrays.asList(_assetsIds);

        ids = getIdsToPush(assetsIds, _contentFilterDate, new SimpleDateFormat("yyyy-MM-dd-H-m"));
      }

      Map<String, Object> responseMap =
          publisherAPI.saveBundleAssets(ids, bundle.getId(), getUser());

      // If we have errors lets return them in order to feedback the user
      if (responseMap != null && !responseMap.isEmpty()) {

        // Error messages
        JSONArray jsonErrors = new JSONArray((ArrayList) responseMap.get("errorMessages"));

        // Prepare the Json response
        JSONObject jsonResponse = new JSONObject();
        jsonResponse.put("errorMessages", jsonErrors.toArray());
        jsonResponse.put("errors", responseMap.get("errors"));
        jsonResponse.put("total", responseMap.get("total"));

        // And send it back to the user
        response.getWriter().println(jsonResponse.toString());
      }
    } catch (Exception e) {
      Logger.error(RemotePublishAjaxAction.class, e.getMessage(), e);
      response.sendError(
          HttpStatus.SC_INTERNAL_SERVER_ERROR, "Error Adding content to Bundle: " + e.getMessage());
    }
  }
  /**
   * Send to the publisher queue a list of assets for a given Operation (Publish/Unpublish) and
   * {@link Environment Environment}
   *
   * @param request HttpRequest
   * @param response HttpResponse
   * @throws WorkflowActionFailureException If fails adding the content for Publish
   * @see com.dotcms.publisher.business.PublisherQueueJob
   * @see Environment
   */
  public void publish(HttpServletRequest request, HttpServletResponse response)
      throws IOException, WorkflowActionFailureException {

    try {

      PublisherAPI publisherAPI = PublisherAPI.getInstance();

      // Read the form values
      String _assetId = request.getParameter("assetIdentifier");
      String _contentPushPublishDate = request.getParameter("remotePublishDate");
      String _contentPushPublishTime = request.getParameter("remotePublishTime");
      String _contentPushExpireDate = request.getParameter("remotePublishExpireDate");
      String _contentPushExpireTime = request.getParameter("remotePublishExpireTime");
      String _contentFilterDate = request.getParameter("remoteFilterDate");
      String _iWantTo = request.getParameter("iWantTo");
      String whoToSendTmp = request.getParameter("whoToSend");
      String forcePushStr = request.getParameter("forcePush");
      boolean forcePush = (forcePushStr != null && forcePushStr.equals("true"));
      List<String> whereToSend = Arrays.asList(whoToSendTmp.split(","));
      List<Environment> envsToSendTo = new ArrayList<Environment>();

      // Lists of Environments to push to
      for (String envId : whereToSend) {
        Environment e = APILocator.getEnvironmentAPI().findEnvironmentById(envId);

        if (e != null) {
          envsToSendTo.add(e);
        }
      }

      // Put the selected environments in session in order to have the list of the last selected
      // environments
      request.getSession().setAttribute(WebKeys.SELECTED_ENVIRONMENTS, envsToSendTo);

      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-H-m");
      Date publishDate = dateFormat.parse(_contentPushPublishDate + "-" + _contentPushPublishTime);

      List<String> ids;
      if (_assetId.startsWith("query_")) { // Support for lucene queries

        String luceneQuery = _assetId.replace("query_", "");
        List<String> queries = new ArrayList<String>();
        queries.add(luceneQuery);
        ids = PublisherUtil.getContentIds(queries);

      } else {

        String[] _assetsIds =
            _assetId.split(","); // Support for multiple ids in the assetIdentifier parameter
        List<String> assetsIds = Arrays.asList(_assetsIds);

        ids = getIdsToPush(assetsIds, _contentFilterDate, dateFormat);
      }

      // Response map with the status of the addContents operation (error messages and counts )
      Map<String, Object> responseMap = null;

      if (_iWantTo.equals(RemotePublishAjaxAction.DIALOG_ACTION_PUBLISH)
          || _iWantTo.equals(RemotePublishAjaxAction.DIALOG_ACTION_PUBLISH_AND_EXPIRE)) {
        Bundle bundle = new Bundle(null, publishDate, null, getUser().getUserId(), forcePush);
        APILocator.getBundleAPI().saveBundle(bundle, envsToSendTo);

        responseMap =
            publisherAPI.addContentsToPublish(ids, bundle.getId(), publishDate, getUser());
      }
      if (_iWantTo.equals(RemotePublishAjaxAction.DIALOG_ACTION_EXPIRE)
          || _iWantTo.equals(RemotePublishAjaxAction.DIALOG_ACTION_PUBLISH_AND_EXPIRE)) {
        if ((!"".equals(_contentPushExpireDate.trim())
            && !"".equals(_contentPushExpireTime.trim()))) {
          Date expireDate = dateFormat.parse(_contentPushExpireDate + "-" + _contentPushExpireTime);

          Bundle bundle =
              new Bundle(null, publishDate, expireDate, getUser().getUserId(), forcePush);
          APILocator.getBundleAPI().saveBundle(bundle, envsToSendTo);

          responseMap =
              publisherAPI.addContentsToUnpublish(ids, bundle.getId(), expireDate, getUser());
        }
      }

      // If we have errors lets return them in order to feedback the user
      if (responseMap != null && !responseMap.isEmpty()) {

        // Error messages
        JSONArray jsonErrors = new JSONArray((ArrayList) responseMap.get("errorMessages"));

        // Prepare the Json response
        JSONObject jsonResponse = new JSONObject();
        jsonResponse.put("errorMessages", jsonErrors.toArray());
        jsonResponse.put("errors", responseMap.get("errors"));
        jsonResponse.put("total", responseMap.get("total"));
        jsonResponse.put("bundleId", responseMap.get("bundleId"));

        // And send it back to the user
        response.getWriter().println(jsonResponse.toString());
      }
    } catch (Exception e) {
      Logger.error(RemotePublishAjaxAction.class, e.getMessage(), e);
      response.sendError(
          HttpStatus.SC_INTERNAL_SERVER_ERROR, "Error Publishing Bundle: " + e.getMessage());
    }
  }