/*******************************************************************************
 * 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.jst.ws.internal.consumption.ui.widgets;

import java.util.Hashtable;
import java.util.List;
import java.util.Vector;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jst.j2ee.internal.webservice.WebServiceNavigatorGroupType;
import org.eclipse.jst.j2ee.internal.webservices.WebServiceEditModel;
import org.eclipse.jst.j2ee.internal.webservices.WebServicesManager;
import org.eclipse.jst.j2ee.webservice.wsdd.Handler;
import org.eclipse.jst.j2ee.webservice.wsdd.PortComponent;
import org.eclipse.jst.j2ee.webservice.wsdd.WebServiceDescription;
import org.eclipse.jst.j2ee.webservice.wsdd.WebServices;
import org.eclipse.jst.j2ee.webservice.wsdd.WsddResource;
import org.eclipse.jst.ws.internal.common.ResourceUtils;
import org.eclipse.jst.ws.internal.consumption.ui.widgets.object.HandlerTableItem;
import org.eclipse.wst.command.env.core.common.Environment;
import org.eclipse.wst.command.env.core.common.MessageUtils;
import org.eclipse.wst.command.env.core.common.SimpleStatus;
import org.eclipse.wst.command.env.core.common.Status;
import org.eclipse.wst.wsdl.Service;
import org.eclipse.wst.wsdl.internal.impl.ServiceImpl;
import org.eclipse.wst.wsdl.util.WSDLResourceImpl;

import org.eclipse.jem.util.emf.workbench.ProjectUtilities;

/**
 * ServiceHandlersWidgetDefaultingCommand
 * 
 * Initialize and load the handlers data
 */
public class ServiceHandlersWidgetDefaultingCommand extends AbstractHandlersWidgetDefaultingCmd {

  private HandlerTableItem[] handlers_;
  private MessageUtils msgUtils_;
  private boolean isGenSkeletonEnabled_;
  private IPath sourceOutputLocation_;
  private WebServiceDescription wsDescription_;
  private WsddResource wsddResource_;
  private WebServicesManager webServicesManager_;
  private IProject project_;
  private Hashtable wsDescToHandlers_;
  private Hashtable serviceDescNameToDescObj_;
  private String descriptionName_ = null;

  public Status execute(Environment env) {
    String pluginId = "org.eclipse.jst.ws.consumption.ui";
    msgUtils_ = new MessageUtils(pluginId + ".plugin", this);
    Status status = new SimpleStatus("");

    webServicesManager_ = new WebServicesManager();
    IStructuredSelection selection = getInitialSelection();
    if (selection == null) {
      status = new SimpleStatus("", msgUtils_.getMessage("MSG_ERROR_TASK_EXCEPTED"), Status.ERROR, null);
      env.getStatusHandler().reportError(status);
      return status;
    }

    status = processHandlers(env);
    return status;

  }

  public Status processHandlers(Environment env) {
    try {
      Vector handlers = new Vector();
      wsDescToHandlers_ = new Hashtable();
      serviceDescNameToDescObj_ = new Hashtable();
      
      WebServiceEditModel wsed = getWebServiceEditModel();
      if (wsed == null)
        wsddResource_ = getWsddResourceFromSelection();
      else
        wsddResource_ = wsed.getWebServicesXmlResource();

      if (wsddResource_ == null) {
        Status status = new SimpleStatus("", msgUtils_.getMessage("MSG_ERROR_TASK_EXCEPTED"), Status.ERROR, null);
        env.getStatusHandler().reportError(status);
        return status;
      }

      WebServices webServices = wsddResource_.getWebServices();
      if (webServices != null) {
        List wsDescriptions = wsddResource_.getWebServices().getWebServiceDescriptions();
        for (int i = 0; i < wsDescriptions.size(); i++) {

          wsDescription_ = (WebServiceDescription) wsDescriptions.get(i);
          
          List wsPortComponents = wsDescription_.getPortComponents();
          for (int j = 0; j < wsPortComponents.size(); j++) {
            PortComponent wsPort = (PortComponent) wsPortComponents.get(j);
            String portName = wsPort.getPortComponentName();
            List wsHandlers = wsPort.getHandlers();
            HandlerTableItem[] handlerItems = new HandlerTableItem[wsHandlers.size()];            
            for (int k = 0; k < wsHandlers.size(); k++) {

              Handler wsHandler = (Handler) wsHandlers.get(k);

              HandlerTableItem handlerItem = new HandlerTableItem();
              handlerItem.setHandler(wsHandler);
              handlerItem.setHandlerName(wsHandler.getHandlerName());
              handlerItem.setHandlerClassName(wsHandler.getHandlerClass());
              handlerItem.setPort(wsPort);
              handlerItem.setPortName(portName);
              handlerItem.setWsDescRef(wsDescription_);
              handlerItems[k] = handlerItem;
              
              handlers.add(handlerItem);
            }
            String wsDescName = wsDescription_.getWebServiceDescriptionName();
            wsDescToHandlers_.put(wsDescName, handlerItems);
            serviceDescNameToDescObj_.put(wsDescName, wsDescription_);
            
          }

        }

        handlers_ = (HandlerTableItem[]) handlers.toArray(new HandlerTableItem[0]);
      }
    }
    catch (Exception e) {
      e.printStackTrace();
      return new SimpleStatus("", msgUtils_.getMessage("MSG_ERROR_TASK_EXCEPTED"), Status.ERROR, e);
    }
    return new SimpleStatus("");
  }

  public HandlerTableItem[] getHandlers() {
    return this.handlers_;
  }

  /**
   * @return Returns the isGenSkeletonEnabled_.
   */
  public boolean getGenSkeletonEnabled() {
    return true;
  }

  /**
   * @return Returns the sourceOutputLocation_.
   */
  public IPath[] getSourceOutputLocation() {
    IPath[] locations = null;
    IProject project = getProject();

    if (project != null) {
      locations = ResourceUtils.getAllJavaSourceLocations(project);
    }
    else {
      project = project_;
      if (project != null) {
        locations = ResourceUtils.getAllJavaSourceLocations(project);
      }
    }
    return locations;
  }

  public WsddResource getWsddResource() {
    return wsddResource_;
  }

  private WsddResource getWsddResourceFromSelection() {
    IStructuredSelection initSel = getInitialSelection();
    if (initSel != null && initSel.size() == 1) {
      Object obj = initSel.getFirstElement();
      if (obj instanceof ServiceImpl) {
        // Service object
        Service service = (Service) obj;
        descriptionName_ = service.getQName().getLocalPart();
        project_ = ProjectUtilities.getProject(service);
        return webServicesManager_.getWsddResource(service);
      }
      else if (obj instanceof WSDLResourceImpl) {
        // WSDL resource
        WSDLResourceImpl res = (WSDLResourceImpl) obj;
        project_ = ProjectUtilities.getProject(res);
        List wsdlResources = webServicesManager_.getWSDLServices(res);
        return webServicesManager_.getWsddResource((Service) wsdlResources.get(0));
      }
      else if (obj instanceof WebServiceNavigatorGroupType) {
        WebServiceNavigatorGroupType wsngt = (WebServiceNavigatorGroupType) obj;
        Service service = (Service)wsngt.getWsdlService();
        descriptionName_ = service.getQName().getLocalPart();        
        project_ = ProjectUtilities.getProject(service);
        return webServicesManager_.getWsddResource(service);
      }
    }
    
    return null;

  }

  /**
   * @deprecated
   */
  public WebServiceDescription getWsDescription() {
    return wsDescription_;
  }
  
  public String getDescriptionName(){
    return descriptionName_;
  }
  
  public Hashtable getWsRefsToHandlers(){
    return wsDescToHandlers_;
  }
  
  public Hashtable getServiceDescNameToDescObj(){
    return this.serviceDescNameToDescObj_;
  }
  
  
}