/*******************************************************************************
 * 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.uddi.actions;

import org.eclipse.wst.ws.internal.explorer.platform.actions.*;
import org.eclipse.wst.ws.internal.explorer.platform.datamodel.*;
import org.eclipse.wst.ws.internal.explorer.platform.perspective.*;
import org.eclipse.wst.ws.internal.explorer.platform.uddi.datamodel.*;
import org.eclipse.wst.ws.internal.explorer.platform.uddi.perspective.*;
import org.eclipse.wst.ws.internal.explorer.platform.uddi.util.Uddi4jHelper;

import org.uddi4j.datatype.service.BusinessService;
import org.uddi4j.datatype.tmodel.TModel;

import java.io.*;
import javax.wsdl.Definition;

public class UDDILaunchWebServiceWizardAction extends LaunchWebServiceWizardAction
{
  public UDDILaunchWebServiceWizardAction(Controller controller)
  {
    super(controller);
  }

  public FormTool getSelectedFormTool()
  {
    UDDIPerspective uddiPerspective = controller_.getUDDIPerspective();
    return (FormTool)uddiPerspective.getNavigatorManager().getSelectedNode().getCurrentToolManager().getSelectedTool();
  }

  public boolean run()
  {
    UDDIPerspective uddiPerspective = controller_.getUDDIPerspective();
    MessageQueue messageQueue = uddiPerspective.getMessageQueue();
    NodeManager nodeManager = uddiPerspective.getNavigatorManager();
    Node node = nodeManager.getSelectedNode();
    TreeElement element = node.getTreeElement();
    Uddi4jHelper uddi4jHelper = new Uddi4jHelper();
    String wsdlUrl = null;
    if (element instanceof ServiceElement)
    {
      ServiceElement serviceElement = (ServiceElement)element;
      BusinessService bs = serviceElement.getBusinessService();
      wsdlUrl = uddi4jHelper.getWSDL(bs, serviceElement.getRegistryElement().getProxy());
    }
    else if (element instanceof ServiceInterfaceElement)
    {
      TModel tModel = ((ServiceInterfaceElement)element).getTModel();
      wsdlUrl = uddi4jHelper.getWSDL(tModel);
    }

    try
    {
      if (wsdlUrl != null)
      {
        Definition def = uddi4jHelper.getWSDLDefinition(wsdlUrl);
        File tempFile = File.createTempFile("temp",".wsdl");
        UDDIImportWSDLToFileSystemAction action = new UDDIImportWSDLToFileSystemAction(controller_);
        action.writeWSDLDefinition(new FileOutputStream(tempFile),def);
        wsdlUrl = tempFile.toURL().toString();
        return launchWizard(wsdlUrl);
      }
    }
    catch (Throwable t)
    {
      messageQueue.addMessage(controller_.getMessage("MSG_ERROR_RETRIEVING_WSDL_DOC"));
    }
    return false;
  }

  public final String getStatusContentVar()
  {
    return controller_.getUDDIPerspective().getStatusContentVar();
  }

  public final String getStatusContentPage()
  {
    return controller_.getUDDIPerspective().getStatusContentPage();
  }
}
