/*******************************************************************************
 * Copyright (c) 2001, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.wst.ws.internal.explorer.platform.actions;

import javax.servlet.http.HttpServletRequest;
import org.eclipse.wst.ws.internal.explorer.platform.constants.ActionInputs;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.Controller;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.Node;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.NodeManager;

public abstract class NodeAction extends LinkAction
{
  protected NodeManager nodeManager_;
  private boolean requiresTreeViewRefresh_;
  private boolean requiresNodeSelection_;
  private boolean requiresViewSelection_;
  private boolean requiresStatusUpdate_;

  public NodeAction(Controller controller,NodeManager nodeManager)
  {
    super(controller);
    nodeManager_ = nodeManager;
    requiresTreeViewRefresh_ = false;
    requiresNodeSelection_ = false;
    requiresViewSelection_ = false;
    requiresStatusUpdate_ = false;
  }

  // ...jsp?nodeId=...<&isHistory=1>
  protected boolean processLinkParameters(HttpServletRequest request)
  {
    String nodeIdString = request.getParameter(ActionInputs.NODEID);
    // Perform data validation.
    try
    {
      Integer.parseInt(nodeIdString);
    }
    catch (NumberFormatException e)
    {
      // Validation failed!
      return false;
    }
    propertyTable_.put(ActionInputs.NODEID,nodeIdString);
    return true;
  }

  protected final boolean isStaleNode(int nodeId)
  {
    return (nodeManager_.getNode(nodeId) == null);
  }

  /**
  * Make a node visible. A node is visible when all of its ancestors are expanded.
  * @param Node The node to be made visible.
  * @return boolean Indicator for whether or not the tree structure was changed (i.e. expanded to show the node in question).
  */
  protected final boolean makeNodeVisible(Node node)
  {
    requiresTreeViewRefresh_ = node.getNodeManager().makeNodeVisible(node);
    return requiresTreeViewRefresh_;
  }

  /**
  * Select a node with id nodeId.
  * @param int The id of the node to be selected.
  */
  protected final void setSelectedNodeId(int nodeId)
  {
    if (nodeManager_.getSelectedNodeId() != nodeId)
    {
      requiresNodeSelection_ = true;
      nodeManager_.setSelectedNodeId(nodeId);
    }
  }

  protected final void setSelectedViewId(int viewId)
  {
    Node selectedNode = nodeManager_.getSelectedNode();
    if (selectedNode.getViewId() != viewId)
    {
      requiresViewSelection_ = true;
      selectedNode.setViewId(viewId);
    }
  }

  // Determine whether or not the treeview requires reloading as a result of this action.
  // Reloading is required when branches are added/removed.
  public boolean requiresTreeViewRefresh()
  {
    return requiresTreeViewRefresh_;
  }

  // Determine whether or not a new node has been selected as a result of the action.
  public boolean requiresNodeSelection()
  {
    return requiresNodeSelection_;
  }

  // Determine if a new view element is selected.
  public boolean requiresViewSelection()
  {
    return requiresViewSelection_;
  }

  // Determine if any status messages arose from this action.
  public boolean requiresStatusUpdate()
  {
    return requiresStatusUpdate_;
  }

  protected abstract String getActionLinkForHistory();
}
