Project: ant4eclipse
/**********************************************************************
 * Copyright (c) 2005-2009 ant4eclipse project team. 
 * 
 * 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: 
 *     Nils Hartmann, Daniel Kasmeroglu, Gerd Wuetherich 
 **********************************************************************/
package org.ant4eclipse.ant.core; 
 
import org.apache.tools.ant.BuildException; 
import org.apache.tools.ant.Task; 
import org.apache.tools.ant.taskdefs.Ant; 
 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.lang.reflect.Field; 
 
/**
 * <p> 
 *  
 * </p> 
 *  
 * @author Gerd Wütherich ([email protected]
 */
 
public class AntCall extends Ant { 
 
  /**
   * <p> 
   * Creates a new instance of type {@link AntCall}. 
   * </p> 
   */
 
  public AntCall() { 
    super(); 
  } 
 
  /**
   * <p> 
   * Creates a new instance of type {@link AntCall}. 
   * </p> 
   *  
   * @param owner 
   */
 
  public AntCall(Task owner) { 
    super(owner); 
  } 
 
  /**
   * {@inheritDoc} 
   *  
   * <p> 
   * Overrides the <code>execute()</code> method of the {@link Ant} super class. This method will return <b>without</b> 
   * an exception if the defined ant file or the defined target is not available. 
   * </p> 
   */
 
  @Override 
  public void execute() throws BuildException { 
 
    // configure ant4eclipse 
    AntConfigurator.configureAnt4Eclipse(getProject()); 
    try { 
      // execute the super class 
      super.execute(); 
    } catch (BuildException buildException) { 
      // get the cause of the BuildException 
      Throwable cause = getCause(buildException); 
 
      if (cause instanceof FileNotFoundException 
          && (cause.getMessage().indexOf(getAntFile()) != -1 || getAntFile() == null)) { 
        // ignore - FileNotFoundException is thrown because the given ant file doesn't exist. 
        // That's OK here... 
      } else if ((buildException.getMessage().indexOf("does not exist in the project") != -1)) { 
        buildException.printStackTrace(); 
        // ignore 
      } else { 
        throw buildException; 
      } 
    } 
  } 
 
  /**
   * <p> 
   * Gets the cause of the {@link BuildException}. 
   * </p> 
   *  
   * @param throwable 
   *          the exception for which the cause should be returned 
   * @return the cause 
   */
 
  private Throwable getCause(Throwable throwable) { 
    if (throwable instanceof BuildException) { 
      return getCause(((BuildException) throwable).getException()); 
    } 
    return throwable; 
  } 
 
  /**
   * <p> 
   * Helper method that reads the (private) field <code>antfile</code> from the {@link Ant} class. If the private field 
   * can't be read, <code>null</code> will be returned. 
   * </p> 
   *  
   * @return the content of the <code>antfile</code> field 
   */
 
  private String getAntFile() { 
    try { 
      // retrieve the private field 'antFile' from the super class. 
      Field field = Ant.class.getDeclaredField("antFile"); 
      // make it accessible 
      field.setAccessible(true); 
      // convert string to file 
      File file = new File((String) field.get(this)); 
      return file.getAbsolutePath(); 
    } catch (Exception e) { 
      // in case that an exception is thrown, null should be returned 
      return null
    } 
  } 
}