Package com.agiletec.plugins.jpfacetnav.aps.tags

Source Code of com.agiletec.plugins.jpfacetnav.aps.tags.AbstractFacetNavTag

/*
*
* 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.jpfacetnav.aps.tags;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletRequest;
import javax.servlet.jsp.tagext.TagSupport;

import com.agiletec.aps.system.RequestContext;
import com.agiletec.aps.system.SystemConstants;
import com.agiletec.aps.system.common.tree.ITreeNode;
import com.agiletec.aps.system.common.tree.ITreeNodeManager;
import com.agiletec.aps.system.services.page.IPage;
import com.agiletec.aps.util.ApsWebApplicationUtils;
import com.agiletec.plugins.jpfacetnav.aps.system.JpFacetNavSystemConstants;
import com.agiletec.plugins.jpfacetnav.aps.system.services.content.showlet.IFacetNavHelper;
import com.agiletec.plugins.jpfacetnav.aps.tags.util.FacetBreadCrumbs;

import com.agiletec.aps.system.services.page.Widget;

/**
*
* @author E.Santoboni
*/
public abstract class AbstractFacetNavTag extends TagSupport {

  /**
   * Returns required facets
   * @return Required facets
   */
  protected List<String> getRequiredFacets() {
    ServletRequest request = this.pageContext.getRequest();
    String facetNodesParamName = this.getFacetNodesParamName();
    if (null == facetNodesParamName) facetNodesParamName = "facetNode";
    List<String> requiredFacets = new ArrayList<String>();
    int index = 1;
    while (null != request.getParameter(facetNodesParamName+"_"+index)) {
      String paramName = facetNodesParamName+"_"+index;
      String value = request.getParameter(paramName);
      this.addFacet(requiredFacets, value);
      index++;
    }

    Enumeration<String> paramNames = request.getParameterNames();
    while (paramNames.hasMoreElements()) {
      String paramName = paramNames.nextElement();
      if (paramName.equals(facetNodesParamName)) {
        String[] values = request.getParameterValues(paramName);
        for (int i=0; i<values.length; i++) {
          String value = values[i];
          this.addFacet(requiredFacets, value);
        }
      }
    }

    String selectedNode = request.getParameter("selectedNode");
    this.addFacet(requiredFacets, selectedNode);

    this.removeSelections(requiredFacets);

    this.manageCurrentSelect(selectedNode, requiredFacets);

    return requiredFacets;
  }

  /**
   * Delete the facets selected through checkboxes selected.
   * @param requiredFacets
   */
  private void removeSelections(List<String> requiredFacets) {
    String facetNodesParamName = "facetNodeToRemove";
    ServletRequest request = this.pageContext.getRequest();
    String[] values = request.getParameterValues(facetNodesParamName);
    if (null != values) {
      for (int i=0; i<values.length; i++) {
        String value = values[i];
        requiredFacets.remove(value);
      }
    }
    int index = 1;
    while (null != request.getParameter(facetNodesParamName+"_"+index)) {
      String paramName = facetNodesParamName+"_"+index;
      String value = request.getParameter(paramName);
      requiredFacets.remove(value);
      index++;
    }
  }

  /**
   * MANAGEMENT OF SELECTED current node (child nodes REMOVE ANY OF THE SELECTION).
   * @param selectedNode
   * @param requiredFacets
   */
  private void manageCurrentSelect(String selectedNode, List<String> requiredFacets) {
    List<String> nodesToRemove = new ArrayList<String>();
    Iterator<String> requredFacetIterator = requiredFacets.iterator();
    ITreeNodeManager facetManager = this.getFacetManager();
    while (requredFacetIterator.hasNext()) {
      String reqNode = (String) requredFacetIterator.next();
      ITreeNode parent = facetManager.getNode(reqNode).getParent();
      if (this.isChildOf(parent, selectedNode)) nodesToRemove.add(reqNode);
    }
    for (int i=0; i<nodesToRemove.size(); i++) {
      String nodeToRemove = nodesToRemove.get(i);
      requiredFacets.remove(nodeToRemove);
    }
  }

  /**
   * Returns facet manager
   * @return Facet manager
   */
  protected ITreeNodeManager getFacetManager() {
    IFacetNavHelper facetNavHelper = (IFacetNavHelper) ApsWebApplicationUtils.getBean(JpFacetNavSystemConstants.CONTENT_FACET_NAV_HELPER, this.pageContext);
    return facetNavHelper.getTreeNodeManager();
  }

  /**
   * Return true if it a child of checked node
   * @param nodeToCheck
   * @param codeForCheck
   * @return True if it a child of checked node
   */
  protected boolean isChildOf(ITreeNode nodeToCheck, String codeForCheck) {
    if (nodeToCheck.getCode().equals(codeForCheck)) {
      return true;
    }
    ITreeNode parentFacet = nodeToCheck.getParent();
    if (null != parentFacet && !parentFacet.getCode().equals(parentFacet.getParent().getCode())) {
      return this.isChildOf(parentFacet, codeForCheck);
    }
    return false;
  }

  /**
   * Add new facet
   * @param requiredFacets
   * @param value
   */
  private void addFacet(List<String> requiredFacets, String value) {
    if (null != value && value.trim().length()>0 && !requiredFacets.contains(value.trim())) {
      requiredFacets.add(value.trim());
    }
  }

  /**
   * Returns the list of objects (@ link FacetBreadCrumbs).
   * @param requiredFacets Nodes facets required.
   * @param reqCtx The context of the current request.
   * @return The list of objects Breadcrumbs.
   */
  protected List<FacetBreadCrumbs> getBreadCrumbs(List<String> requiredFacets, RequestContext reqCtx) {
    List<ITreeNode> roots = this.getFacetRoots(reqCtx);
    if (null == roots) return null;
    List<ITreeNode> finalNodes = this.getFinalNodes(requiredFacets);
    List<FacetBreadCrumbs> breadCrumbs = new ArrayList<FacetBreadCrumbs>();
    for (int i=0; i<finalNodes.size(); i++) {
      ITreeNode requiredNode = finalNodes.get(i);
      for (int j = 0; j < roots.size(); j++) {
        ITreeNode root = roots.get(j);
        if (this.isChildOf(requiredNode, root.getCode())) {
          breadCrumbs.add(new FacetBreadCrumbs(requiredNode.getCode(), root.getCode(), this.getFacetManager()));
        }
      }
    }
    return breadCrumbs;
  }

  /**
   * Returns final nodes
   * @param requiredFacets
   * @return Final Nodes
   */
  private List<ITreeNode> getFinalNodes(List<String> requiredFacets) {
    List<ITreeNode> finalNodes = new ArrayList<ITreeNode>();
    List<String> requiredFacetsCopy = new ArrayList<String>(requiredFacets);
    for (int i=0; i<requiredFacets.size(); i++) {
      String nodeToAnalize = requiredFacets.get(i);
      this.removeParentOf(nodeToAnalize, requiredFacetsCopy);
    }
    Iterator<String> requiredFacetIterator = requiredFacetsCopy.iterator();
    while (requiredFacetIterator.hasNext()) {
      String reqNode = (String) requiredFacetIterator.next();
      finalNodes.add(this.getFacetManager().getNode(reqNode));
    }
    return finalNodes;
  }

  /**
   * Remove node parent
   * @param nodeFromAnalize
   * @param requiredFacetsCopy
   */
  private void removeParentOf(String nodeFromAnalize, List<String> requiredFacetsCopy) {
    ITreeNode nodeFrom = this.getFacetManager().getNode(nodeFromAnalize);
    List<String> nodesToRemove = new ArrayList<String>();
    Iterator<String> requiredFacetIterator = requiredFacetsCopy.iterator();
    while (requiredFacetIterator.hasNext()) {
      String reqNode = (String) requiredFacetIterator.next();
      if (!nodeFromAnalize.equals(reqNode) && this.isChildOf(nodeFrom, reqNode)) {
        nodesToRemove.add(reqNode);
      }
    }
    for (int i=0; i<nodesToRemove.size(); i++) {
      String nodeToRemove = nodesToRemove.get(i);
      requiredFacetsCopy.remove(nodeToRemove);
    }
  }

  /**
   * Returns a list of root nodes through which grant the tree.
   * The root nodes allow you to create blocks of selected nodes in showlet appropriate.
   * @param reqCtx The context of the current request.
   * @return The list of root nodes.
   */
  protected List<ITreeNode> getFacetRoots(RequestContext reqCtx) {
    IPage page = (IPage) reqCtx.getExtraParam(SystemConstants.EXTRAPAR_CURRENT_PAGE);
    Integer currentFrame = (Integer) reqCtx.getExtraParam(SystemConstants.EXTRAPAR_CURRENT_FRAME);
    Widget[] widgets = page.getWidgets();
    for (int i = 0; i < widgets.length; i++) {
      if (i == currentFrame.intValue()) continue;
      Widget widget = widgets[i];
      String configParamName = JpFacetNavSystemConstants.FACET_ROOTS_SHOWLET_PARAM_NAME;
      if (null != widget && null != widget.getConfig()
          && null != widget.getConfig().getProperty(configParamName)) {
        String facetParamConfig = widget.getConfig().getProperty(configParamName);
        return this.getFacetRoots(facetParamConfig);
      }
    }
    return null;
  }

  /**
   * Returns facet roots.
   * @param facetRootNodesParam
   * @return facet roots
   */
  protected List<ITreeNode> getFacetRoots(String facetRootNodesParam) {
    List<ITreeNode> nodes = new ArrayList<ITreeNode>();
    String[] facetCodes = facetRootNodesParam.split(",");
    for (int j = 0; j < facetCodes.length; j++) {
      String facetCode = facetCodes[j].trim();
      ITreeNode node = this.getFacetManager().getNode(facetCode);
      if (null != node) {
        nodes.add(node);
      }
    }
    return nodes;
  }

  public String getFacetNodesParamName() {
    return _facetNodesParamName;
  }
  public void setFacetNodesParamName(String facetNodesParamName) {
    this._facetNodesParamName = facetNodesParamName;
  }

  public String getRequiredFacetsParamName() {
    return _requiredFacetsParamName;
  }
  public void setRequiredFacetsParamName(String requiredFacetsParamName) {
    this._requiredFacetsParamName = requiredFacetsParamName;
  }

  private String _facetNodesParamName;
  private String _requiredFacetsParamName;

}
TOP

Related Classes of com.agiletec.plugins.jpfacetnav.aps.tags.AbstractFacetNavTag

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.