/*******************************************************************************
 * 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.wsdl.ui.internal.commands;

import java.util.Iterator;
import javax.xml.namespace.QName;

import org.eclipse.wst.wsdl.Definition;
import org.eclipse.wst.wsdl.Message;
import org.eclipse.wst.wsdl.Part;
import org.eclipse.wst.wsdl.WSDLElement;
import org.eclipse.wst.wsdl.WSDLFactory;
import org.eclipse.wst.wsdl.ui.internal.actions.SmartRenameAction;
import org.eclipse.wst.wsdl.ui.internal.util.NameUtil;
import org.eclipse.wst.wsdl.util.WSDLConstants;


public final class AddMessageCommand extends WSDLElementCommand
{
  private Definition definition;
  private String localName;
  private Message message;
  private Message originalMessage;
  
  private boolean createPart = false;
  private final String DEFAULT_PART_NAME = "NewPart";
  
  public AddMessageCommand
  	(Definition definition,  
  	 String localName)
  {
    this.definition = definition;
    this.localName = localName;
  }
  
  public AddMessageCommand
		(Definition definition, 
		 String localName,
		 boolean createPart)
	{
	  this.definition = definition;
	  this.localName = localName;
	  this.createPart = createPart;
	}
  
  /*
   * Constructor used to create a Message based on the given Message.  In essence, this will
   * create a copy of the given Message.
   */
  public AddMessageCommand(Definition definition, Message originalMessage, String localName, boolean copyPart) {
    this.definition = definition;
	this.localName = localName;
	this.createPart = copyPart;
  	this.originalMessage = originalMessage;
  }
  
  public void run()
  {
    message = WSDLFactory.eINSTANCE.createMessage();
    message.setQName(new QName(definition.getTargetNamespace(),localName));
    message.setEnclosingDefinition(definition);
    definition.addMessage(message);
    
    if (originalMessage == null) {
    	if (createPart)
    	{
    		AddPartCommand command = 
    			new AddPartCommand(message,DEFAULT_PART_NAME,WSDLConstants.SCHEMA_FOR_SCHEMA_URI_2001,"string",true);
    		command.run();
    	}
    }
    else {
    	if (originalMessage.getEParts() != null) {
    		Iterator it = originalMessage.getEParts().iterator();
    		
    		while (it.hasNext()) {
    			Part part = (Part) it.next();
    			AddPartCommand command;
    			if (SmartRenameAction.isPartNameGenerated(part.getName(), originalMessage.getQName().getLocalPart()))
    				command = new AddPartCommand(message, part, NameUtil.buildUniquePartName(message, message.getQName().getLocalPart()));	
    			else
    				command = new AddPartCommand(message, part, part.getName());
    			
    			
    			command.run();
    		}
    	}
    }
  }

  public void setLocalName(String name)
  {
    this.localName = name;
  }
  
  public WSDLElement getWSDLElement()
  {
    return message;
  }
}
