Package com.agiletec.plugins.jpcontentfeedback.aps.internalservlet.feedback

Source Code of com.agiletec.plugins.jpcontentfeedback.aps.internalservlet.feedback.ContentFeedbackAction

/*
*
* Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved.
*
* This file is part of Entando software.
* Entando is a free software;
* You can redistribute it and/or modify it
* under the terms of the GNU General Public License (GPL) as published by the Free Software Foundation; version 2.
*
* See the file License for the specific language governing permissions  
* and limitations under the License
*
*
*
* Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved.
*
*/
package com.agiletec.plugins.jpcontentfeedback.aps.internalservlet.feedback;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
import java.util.TreeMap;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.agiletec.aps.system.ApsSystemUtils;
import com.agiletec.aps.system.RequestContext;
import com.agiletec.aps.system.SystemConstants;
import com.agiletec.aps.system.exception.ApsSystemException;
import com.agiletec.aps.system.services.page.Widget;
import com.agiletec.aps.system.services.user.UserDetails;
import com.agiletec.apsadmin.system.BaseAction;
import com.agiletec.plugins.jacms.apsadmin.content.helper.ContentActionHelper;
import com.agiletec.plugins.jpcontentfeedback.aps.system.services.contentfeedback.CheckVotingUtil;
import com.agiletec.plugins.jpcontentfeedback.aps.system.services.contentfeedback.IContentFeedbackManager;
import com.agiletec.plugins.jpcontentfeedback.aps.system.services.contentfeedback.comment.ICommentManager;
import com.agiletec.plugins.jpcontentfeedback.aps.system.services.contentfeedback.comment.model.Comment;
import com.agiletec.plugins.jpcontentfeedback.aps.system.services.contentfeedback.comment.model.CommentSearchBean;
import com.agiletec.plugins.jpcontentfeedback.aps.system.services.contentfeedback.comment.model.IComment;
import com.agiletec.plugins.jpcontentfeedback.aps.system.services.contentfeedback.rating.IRatingManager;
import com.agiletec.plugins.jpcontentfeedback.aps.system.services.contentfeedback.rating.model.IRating;
import com.agiletec.plugins.jpcontentfeedback.aps.tags.FeedbackIntroTag;
import com.agiletec.plugins.jpcontentfeedback.apsadmin.feedback.AbstractContentFeedbackAction;
import com.agiletec.plugins.jpcontentfeedback.apsadmin.portal.specialwidget.ContentFeedbackWidgetAction;

/**
* @author D.Cherchi
*/
public class ContentFeedbackAction extends AbstractContentFeedbackAction implements IContentFeedbackAction, ServletResponseAware, ServletRequestAware {


  public String getRedirectParams() {
    String params = null;
    try {
      StringBuffer result = new StringBuffer();
        Iterator<String> it = super.getRequest().getParameterMap().keySet().iterator();
        while (it.hasNext()) {
          String key = it.next();
          String value = null;
          if (null != key && key.startsWith("entaredir_")) {
            value = super.getParameter(key);
            if (null != value && value.trim().length() > 0) {
              if (result.length() == 0) {
                result.append("&");
              } else {
                result.append("&");
              }
              result.append(key.split("entaredir_")[1]).append("=").append(value);
            }
          }
        }

      if (StringUtils.isNotBlank(result.toString())) {
        //System.out.println("ENCODED: " + result.toString());
        params = result.toString(); // = URLEncoder.encode(result.toString(), "UTF-8");
      }

    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "getRedirectParams");
    }
    //return null;
    return params;
  }

  public String getShowletParam(String param) {
    RequestContext reqCtx = (RequestContext) this.getRequest().getAttribute(RequestContext.REQCTX);
    Widget currentShowlet = (Widget) reqCtx.getExtraParam(SystemConstants.EXTRAPAR_CURRENT_WIDGET);
    return currentShowlet.getConfig().getProperty(param);
  }

  @Override
  public String addComment() {
    try {
      String commentsActive = this.getShowletParam(ContentFeedbackWidgetAction.WIDGET_PARAM_COMMENT_ACTIVE);
      boolean commentsAllowed = null != commentsActive && commentsActive.equalsIgnoreCase("true");
      if (!commentsAllowed) {
        ApsSystemUtils.getLogger().info("comments not allowed");
        return BaseAction.USER_NOT_ALLOWED;
      }

      String anonComments = this.getShowletParam(ContentFeedbackWidgetAction.WIDGET_PARAM_COMMENT_ANONYMOUS);
      boolean anomymousCommentsAllowed = null != anonComments && anonComments.equalsIgnoreCase("true");
      if (this.getCurrentUser().getUsername().equalsIgnoreCase(SystemConstants.GUEST_USER_NAME) && !anomymousCommentsAllowed) {
        ApsSystemUtils.getLogger().info("anomymous comments not allowed");
        return BaseAction.USER_NOT_ALLOWED;
      }

      Comment comment = new Comment();
      String contentId = this.getCurrentContentId();
      if (this.isAuth(contentId)) {
        String commentsModeration = this.getShowletParam(ContentFeedbackWidgetAction.WIDGET_PARAM_COMMENT_MODERATED);
        boolean moderation = null != commentsModeration && commentsModeration.equalsIgnoreCase("true");
        if (moderation) {
          comment.setStatus(Comment.STATUS_TO_APPROVE);
          this.addActionMessage(this.getText("jpcontentfeedback_MESSAGE_TO_APPROVED"));
        } else {
          comment.setStatus(Comment.STATUS_APPROVED);
        }
        comment.setComment(this.getCommentText());
        comment.setContentId(contentId);
        comment.setUsername(this.getCurrentUser().getUsername());
        this.getCommentManager().addComment(comment);
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "addComment");
      return FAILURE;
    }
    return SUCCESS;
  }

  @Override
  public String insertVote() {
    try {
      String contentRatingActive = this.getShowletParam(ContentFeedbackWidgetAction.WIDGET_PARAM_RATE_CONTENT);
      boolean contentRatingAllowed = null != contentRatingActive && contentRatingActive.equalsIgnoreCase("true");
      if (!contentRatingAllowed) {
        ApsSystemUtils.getLogger().info("ContentRating not allowed");
        return BaseAction.USER_NOT_ALLOWED;
      }
      String contentId = this.getCurrentContentId();
      if (this.isAuth(contentId)) {
        if (!this.isValidVote()) {
          this.addActionError(this.getText("Message.invalidVote"));
          return INPUT;
        }
        boolean alreadyVoted = CheckVotingUtil.isContentVoted(contentId, this.getRequest());
        if (alreadyVoted){
          this.addActionError(this.getText("Message.alreadyVoted"));
          return INPUT;
        }
        this.getRatingManager().addRatingToContent(contentId, this.getVote());
        this.addCookieRating(contentId);

      } else {
        ApsSystemUtils.getLogger().info("not auth to insert vote on content " + contentId);
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "insertVote");
      return FAILURE;
    }
    return SUCCESS;
  }


  public String insertCommentVote() {
    try {
      String commentRatingActive = this.getShowletParam(ContentFeedbackWidgetAction.WIDGET_PARAM_RATE_COMMENT);
      boolean commentRatingAllowed = null != commentRatingActive && commentRatingActive.equalsIgnoreCase("true");
      if (!commentRatingAllowed) {
        ApsSystemUtils.getLogger().info("Comment Rating not allowed");
        return BaseAction.USER_NOT_ALLOWED;
      }

      String contentId = this.getCurrentContentId();
      IComment comment = this.getCommentManager().getComment(this.getSelectedComment());
      if (null == comment || !comment.getContentId().equalsIgnoreCase(contentId)) {
        this.addActionError(this.getText("Message.invalidComment"));
        return INPUT;
      }

      if (this.isAuth(contentId)) {
        if (!this.isValidVote()) {
          this.addActionError(this.getText("Message.invalidVote"));
          return INPUT;
        }
        boolean alreadyVoted = CheckVotingUtil.isCommentVoted(this.getSelectedComment(), this.getRequest());
        if (alreadyVoted){
          this.addActionError(this.getText("Message.alreadyVoted"));
          return INPUT;
        }
        this.getRatingManager().addRatingToComment(this.getSelectedComment(), this.getVote());
        this.addCookieRating(this.getSelectedComment());

      } else {
        ApsSystemUtils.getLogger().info("not auth to insert vote on content " + contentId);
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "insertVote");
      return FAILURE;
    }
    return SUCCESS;
  }

  @Override
  public List<String> getContentCommentIds() {
    List<String> commentIds = new ArrayList<String>();
    try {
      String contentId = this.getCurrentContentId();
      if (StringUtils.isBlank(contentId)) {
        ApsSystemUtils.getLogger().error("Content id null");
        return commentIds;
      }
      if (this.isAuth(contentId)) {
        CommentSearchBean searchBean = new CommentSearchBean();
        searchBean.setContentId(contentId);
        searchBean.setStatus(Comment.STATUS_APPROVED);
        commentIds = this.getCommentManager().searchCommentIds(searchBean);
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "getContentCommentIds");
      throw new RuntimeException("Error", t);
    }
    return commentIds;
  }

  @Override
  public boolean isAuthorizedToDelete(String username){
    return username.equals(this.getCurrentUser().getUsername());
  }

  @Override
  public String delete() {
    try {
      if (!this.getCurrentUser().getUsername().equals(SystemConstants.GUEST_USER_NAME)
          && this.isAuthorizedToDelete(this.getCurrentUser().getUsername())) {
        if (this.isAuth(this.getCurrentContentId())){
          this.getCommentManager().deleteComment(this.getSelectedComment());
        }
      }
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "delete");
      return FAILURE;
    }
    return SUCCESS;
  }



  private boolean isAuth(String contentId) {

    /* se anche guest puo aggiungere commenti....
    IContentDispenser contentDispenser = (IContentDispenser) ApsWebApplicationUtils.getBean(JacmsSystemConstants.CONTENT_DISPENSER_MANAGER, this.getRequest());
    ContentAuthorizationInfo authInfo = contentDispenser.getAuthorizationInfo(contentId);
    if (null == authInfo) {
      return false;
    }
    IAuthorizationManager authManager = (IAuthorizationManager) ApsWebApplicationUtils.getBean(SystemConstants.AUTHORIZATION_SERVICE, this.getRequest());
    List<Group> userGroups = authManager.getUserGroups(this.getCurrentUser());
    return authInfo.isUserAllowed(userGroups);
     */
    return true;
  }

  @Override
  public IComment getComment(Integer commentId) {
    IComment comment = null;
    try {
      comment = this.getCommentManager().getComment(commentId.intValue());
    } catch (ApsSystemException e) {
      ApsSystemUtils.logThrowable(e, this, "getComment");
      throw new RuntimeException("Error", e);
    }
    return comment;
  }

  @Override
  public IRating getContentRating() {
    IRating rating = null;
    try {
      String contentId = this.getCurrentContentId();
      if (StringUtils.isBlank(contentId)) {
        ApsSystemUtils.getLogger().error("Content id null");
        return null;
      }
      rating = this.getRatingManager().getContentRating(contentId);
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "getContentRating");
      throw new RuntimeException("Error", t);
    }
    return rating;
  }

  @Override
  public IRating getCommentRating(int commentId){
    IRating rating = null;
    try {
      if (commentId == 0) {
        ApsSystemUtils.getLogger().error("Content id null");
        return null;
      }
      rating = this.getRatingManager().getCommentRating(commentId);
    } catch (Throwable t) {
      ApsSystemUtils.logThrowable(t, this, "getCommentRating");
      throw new RuntimeException("Error", t);
    }
    return rating;
  }

  protected boolean isValidVote() {
    return (null != this.getVote() && this.getVotes().values().contains(this.getVote()));
  }

  protected void addCookieRating(String contentId) {
    UserDetails currentUser = this.getCurrentUser();
    String cookieName = CheckVotingUtil.getCookieName(currentUser.getUsername(), contentId);
    String cookieValue = CheckVotingUtil.getCookieValue(currentUser.getUsername(), contentId);
    Cookie cookie = new Cookie(cookieName, cookieValue);
    cookie.setMaxAge(365*24*60*60);//one year
    this.getResponse().addCookie(cookie);
  }

  protected void addCookieRating(int commentId) {
    UserDetails currentUser = this.getCurrentUser();
    String cookieName = CheckVotingUtil.getCookieName(currentUser.getUsername(), commentId);
    String cookieValue = CheckVotingUtil.getCookieValue(currentUser.getUsername(), commentId);
    Cookie cookie = new Cookie(cookieName, cookieValue);
    cookie.setMaxAge(365*24*60*60);//one year
    this.getResponse().addCookie(cookie);
  }

  protected HttpServletResponse getResponse() {
    return this._response;
  }
  @Override
  public void setServletResponse(HttpServletResponse response) {
    this._response = response;
  }

  public void setSelectedContent(String selectedContent) {
    this._selectedContent = selectedContent;
  }
  public String getSelectedContent() {
    return _selectedContent;
  }

  public void setRatingManager(IRatingManager ratingManager) {
    this._ratingManager = ratingManager;
  }
  public IRatingManager getRatingManager() {
    return _ratingManager;
  }

  public void setVotes(Map<String, Integer> votes) {
    this._votes = votes;
  }
  public Map<String, Integer> getVotes() {
    if (null != this.getReverseVotes() && this.getReverseVotes().booleanValue()) {
      TreeMap<String, Integer> t = new TreeMap<String, Integer>(this._votes);
      NavigableMap<String, Integer> x = t.descendingMap();
      return  x;
      //return t.descendingMap();
    }
    return _votes;
  }

  public void setVote(Integer vote) {
    this._vote = vote;
  }
  public Integer getVote() {
    return _vote;
  }

  protected ICommentManager getCommentManager() {
    return _commentManager;
  }
  public void setCommentManager(ICommentManager commentManager) {
    this._commentManager = commentManager;
  }

  public String getCommentText() {
    return _commentText;
  }
  public void setCommentText(String commentText) {
    this._commentText = commentText;
  }

  public int getSelectedComment() {
    return _selectedComment;
  }
  public void setSelectedComment(int selectedComment) {
    this._selectedComment = selectedComment;
  }

  public String extractContentId() {
    String contentId = null;
    if (null == contentId || contentId.trim().length() == 0) {
      RequestContext reqCtx = (RequestContext) this.getRequest().getAttribute(RequestContext.REQCTX);
      Widget currentShowlet = (Widget) reqCtx.getExtraParam(SystemConstants.EXTRAPAR_CURRENT_WIDGET);
      if (null != currentShowlet.getConfig() && currentShowlet.getConfig().getProperty("contentId") != null && currentShowlet.getConfig().getProperty("contentId").length() > 0) {
        contentId = currentShowlet.getConfig().getProperty("contentId");
      } else {
        contentId = (String) this.getRequest().getAttribute("currentContentId");
      }
    }
    return contentId;
  }


  protected ContentActionHelper getContentActionHelper() {
    return _contentActionHelper;
  }
  public void setContentActionHelper(ContentActionHelper contentActionHelper) {
    this._contentActionHelper = contentActionHelper;
  }

  protected IContentFeedbackManager getContentFeedbackManager() {
    return _contentFeedbackManager;
  }
  public void setContentFeedbackManager(IContentFeedbackManager contentFeedbackManager) {
    this._contentFeedbackManager = contentFeedbackManager;
  }

  public Boolean getReverseVotes() {
    return _reverseVotes;
  }
  public void setReverseVotes(Boolean reverseVotes) {
    this._reverseVotes = reverseVotes;
  }

//  public String getFormContentId() {
//    return _formContentId;
//  }
//  public void setFormContentId(String formContentId) {
//    this._formContentId = formContentId;
//  }


  public Map<String, String> getRedirectParamNames() {
    return redirectParamNames;
  }
  public void setRedirectParamNames(Map<String, String> redirectParamNames) {
    this.redirectParamNames = redirectParamNames;
  }


  /**
   * Lista di parametri, settati dall'utente in {@link FeedbackIntroTag}.
   * Se in request è presente uno di questi parametri, nei from verrà generato un hidden.
   * Al submit, i valore di questi hidden concorreranno a valorizzare la mappa redirectParamNames.
   * Questa mappa serve per appendere i parametri ad ogni azione (che è sempre redirectAction)
   * @return
   */
  public String[] getExtraParamNames() {
    if (null == _extraParamNames) {
      _extraParamNames = (String[]) this.getRequest().getAttribute("extraParamNames");
    }
    return _extraParamNames;
  }
  public void setExtraParamNames(String[] extraParamNames) {
    this._extraParamNames = extraParamNames;
  }


  public String getCurrentContentId() {
    String value =  _currentContentId;
    if (StringUtils.isBlank(value)) {
      value = this.extractContentId();
    }
    return value;
  }

  public void setCurrentContentId(String currentContentId) {
    this._currentContentId = currentContentId;
  }


  //private String _formContentId;
  private String _currentContentId;
  private Boolean _reverseVotes;


  private String _commentText;
  private ICommentManager _commentManager;
  private Map<String, Integer>  _votes;
  private IRatingManager _ratingManager;
  private Integer _vote;
  private String _selectedContent;
  private int _selectedComment;
  private HttpServletResponse _response;
  private ContentActionHelper _contentActionHelper;
  private IContentFeedbackManager _contentFeedbackManager;

  private Map<String, String> redirectParamNames = new HashMap<String, String>();
  private String[] _extraParamNames;

}
TOP

Related Classes of com.agiletec.plugins.jpcontentfeedback.aps.internalservlet.feedback.ContentFeedbackAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.