/*******************************************************************************
 * Copyright (c) 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.engine.transformer.CurrentNodeSelectionTransformer;
import org.eclipse.wst.ws.internal.explorer.platform.engine.transformer.ITransformer;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.Controller;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.NodeManager;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.Tool;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.ToolManager;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.ViewTool;

public abstract class SelectNodeToolAction extends SelectNodeAction
{
  protected NodeManager nodeManager_;
  protected Tool selectedTool_;

  public SelectNodeToolAction(Controller controller,NodeManager nodeManager)
  {
    super(controller,nodeManager);
    nodeManager_ = nodeManager;
    selectedTool_ = null;
  }

  public final NodeManager getNodeManager()
  {
    return nodeManager_;
  }

  // ...jsp?nodeId=...&toolId=...<&viewId=...&viewToolId=...><&isHistory=1>
  protected boolean processLinkParameters(HttpServletRequest request)
  {
    boolean result = super.processLinkParameters(request);
    String toolIdString = request.getParameter(ActionInputs.TOOLID);
    String viewIdString = request.getParameter(ActionInputs.VIEWID);
    String viewToolIdString = request.getParameter(ActionInputs.VIEWTOOLID);

    // Perform data validation.
    try
    {
      Integer.parseInt(toolIdString);
    }
    catch (NumberFormatException e)
    {
      // Validation failed.
      return false;
    }
    propertyTable_.put(ActionInputs.TOOLID,toolIdString);

    // Optional properties
    try
    {
      int viewId = Integer.parseInt(viewIdString);
      propertyTable_.put(ActionInputs.VIEWID,viewIdString);
      if (viewId != ActionInputs.VIEWID_DEFAULT)
      {
        Integer.parseInt(viewToolIdString);
        propertyTable_.put(ActionInputs.VIEWTOOLID,viewToolIdString);
      }
    }
    catch (NumberFormatException e)
    {
    }
    return result;
  }

  public boolean run()
  {
    int nodeId = Integer.parseInt((String)propertyTable_.get(ActionInputs.NODEID));
    if (!isStaleNode(nodeId))
    {
      // Ensure that the node is visible.
      makeNodeVisible(nodeManager_.getNode(nodeId));
      setSelectedNodeId(nodeId);
      selectedNode_ = nodeManager_.getSelectedNode();
      int toolId = Integer.parseInt((String)propertyTable_.get(ActionInputs.TOOLID));
      ToolManager toolManager = selectedNode_.getToolManager();
      toolManager.setSelectedToolId(toolId);
      selectedTool_ = toolManager.getSelectedTool();
      String viewIdString = ((String)propertyTable_.get(ActionInputs.VIEWID));
      if (viewIdString != null)
      {
        int viewId = Integer.parseInt(viewIdString);
        setSelectedViewId(viewId);
        if (viewId != ActionInputs.VIEWID_DEFAULT)
        {
          String viewToolIdString = ((String)propertyTable_.get(ActionInputs.VIEWTOOLID));
          ViewTool viewTool = (ViewTool)selectedTool_;
          if (viewToolIdString != null)
          {
            int viewToolId = Integer.parseInt(viewToolIdString);
            ToolManager viewToolManager = selectedNode_.getViewToolManager();
            if (viewToolManager == null)
            {
              if (!isHistoryAction())
              {
                viewToolManager = viewTool.createToolManager(viewId);
                viewToolId = viewToolManager.getSelectedToolId();
              }
              else
              {
                setStaleBreadCrumb();
                return false;
              }
            }
            viewToolManager.setSelectedToolId(viewToolId);
          }
        }
      }
      else
        setSelectedViewId(ActionInputs.VIEWID_DEFAULT);
      addToHistory(getPerspectiveId(),getActionLinkForHistory());
      return true;
    }
    setStaleBreadCrumb();
    return false;
  }

  public ITransformer[] getTransformers()
  {
    return new ITransformer[] {new CurrentNodeSelectionTransformer(controller_)};
  }

  public final Tool getSelectedViewTool()
  {
    if (propertyTable_.get(ActionInputs.VIEWID) != null)
      return selectedNode_.getViewToolManager().getSelectedTool();
    return null;
  }

  public final Tool getSelectedTool()
  {
    return selectedTool_;
  }

  // Selecting a node tool updates the properties content. Also, in the event
  // of a history switch, nodes may need to be selected resulting in changes to
  // both the treeview content and the properties container. These requirements are
  // covered through the base class.
  public abstract String getPropertiesContentVar();
  public abstract String getPropertiesContentPage();
  public String getStatusContentVar()
  {
    return null;
  }

  public String getStatusContentPage()
  {
    return null;
  }
  
  public abstract int getPerspectiveId();
}
