/*******************************************************************************
 * 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
 *******************************************************************************/
/*
 * Command to add axis.jar to the build path of a project as an external variable
 */
package org.eclipse.jst.ws.internal.axis.consumption.ui.command;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.IPluginRegistry;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.wst.command.env.core.SimpleCommand;
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;


/**
 * @author rsinha
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class AddAxisJARToBuildPathCommand extends SimpleCommand
{
  private String pluginId_ = "org.eclipse.jst.ws.axis.consumption.ui";
  private MessageUtils msgUtils;
  private String jarPluginId = "org.eclipse.wst.ws.apache.axis";
  private String jarPluginRelPath = "lib";
  private String jarName = "axis.jar";
  private IProject project;
  
  
  /* (non-Javadoc)
   * @see org.eclipse.wst.command.env.core.Command#execute(org.eclipse.wst.command.env.core.common.Environment)
   */
  public Status execute(Environment environment)
  {
    msgUtils = new MessageUtils( pluginId_ + ".plugin", this );
    Status status = new SimpleStatus("");

    //Add JARs to the classpath
    IClasspathEntry[] oldClasspath;
    IClasspathEntry[] newClasspath;
    IJavaProject javaProject;
    
    //Get the old classpath
    try
    {    
      javaProject = JavaCore.create(project);    
      if (javaProject == null)
      {
        Status wStatus = new SimpleStatus("", msgUtils.getMessage("MSG_WARNING_NOT_COMPILE"), Status.WARNING);
        return wStatus;
      }

      oldClasspath = javaProject.getRawClasspath();
    }
    catch (JavaModelException e)
    {
      Status wStatus = new SimpleStatus("", msgUtils.getMessage("MSG_WARNING_NOT_COMPILE"), Status.WARNING);
      return wStatus;
    }
    
    //Check if the axis.jar is already on the build path
    boolean found = false;
	for (int i=0; i<oldClasspath.length; i++)
	{
	  found = found || oldClasspath[i].getPath().toString().toLowerCase().endsWith(jarName.toLowerCase());
    }

	if (found) 
	{
	  return status;
	}    
    
	//Add axis.jar to the build path
	newClasspath = new IClasspathEntry[oldClasspath.length + 1];
    int i = 0;
    for (i=0 ; i < oldClasspath.length; i++)
    {
      newClasspath[i] = oldClasspath[i];
    }
    
    IClasspathEntry newEntry = getClasspathEntry();
    if (newEntry==null)
    {
      Status wStatus = new SimpleStatus("", msgUtils.getMessage("MSG_WARNING_NOT_COMPILE"), Status.WARNING);
      return wStatus;
    }
    newClasspath[i] = newEntry;
    
    try
    {
      javaProject.setRawClasspath(newClasspath,null);
    }
    catch (JavaModelException e)
    {
      Status wStatus = new SimpleStatus("", msgUtils.getMessage("MSG_WARNING_NOT_COMPILE"), Status.WARNING);
      return wStatus;
    }
    
    
    return status;
    
  }
  
  private IClasspathEntry getClasspathEntry()
  {
    try
    {
      IPluginRegistry pluginRegistry = Platform.getPluginRegistry();
      IPluginDescriptor pluginDescriptor = pluginRegistry.getPluginDescriptor(jarPluginId);

      StringBuffer theJar = new StringBuffer();
      theJar.append(jarPluginRelPath);

      if (jarPluginRelPath.length()>0)
        theJar.append(IPath.SEPARATOR);

      theJar.append(jarName);
      
      URL localURL = Platform.asLocalURL(new URL(pluginDescriptor.getInstallURL(),theJar.toString()));
      Path jarPath =  new Path(localURL.getFile());
      IClasspathEntry cpEntry = JavaCore.newLibraryEntry(jarPath, null, null);
      return cpEntry;
    }
    catch (MalformedURLException e)
    {
      return null;
    }
    catch (IOException e)
    {
      return null;
    }

  }
 
  
  /**
   * @param project The project to set.
   */
  public void setProject(IProject project)
  {
    this.project = project;
  }
}
