/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.hdt.core.cluster.utils;

import java.io.File;
import java.util.logging.Logger;

import org.apache.hdt.core.Activator;
import org.apache.hdt.core.dialogs.ErrorMessageDialog;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.ui.jarpackager.IJarExportRunnable;
import org.eclipse.jdt.ui.jarpackager.JarPackageData;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;

/**
 * Methods for interacting with the jar file containing the
 * Mapper/Reducer/Driver classes for a MapReduce job.
 */

public class JarModule implements IRunnableWithProgress {

  static Logger log = Logger.getLogger(JarModule.class.getName());

  private IResource resource;

  private File jarFile;

  public JarModule(IResource resource) {
    this.resource = resource;
  }

  public String getName() {
    return resource.getProject().getName() + "/" + resource.getName();
  }

  /**
   * Creates a JAR file containing the given resource (Java class with
   * main()) and all associated resources
   * 
   * @param resource the resource
   * @return a file designing the created package
   */
  public void run(IProgressMonitor monitor) {

    log.fine("Build jar");
    JarPackageData jarrer = new JarPackageData();

    jarrer.setExportJavaFiles(true);
    jarrer.setExportClassFiles(true);
    jarrer.setExportOutputFolders(true);
    jarrer.setOverwrite(true);

    try {
      // IJavaProject project =
      // (IJavaProject) resource.getProject().getNature(JavaCore.NATURE_ID);

      // check this is the case before letting this method get called
      Object element = resource.getAdapter(IJavaElement.class);
      IType type = ((ICompilationUnit) element).findPrimaryType();
      jarrer.setManifestMainClass(type);

      // Create a temporary JAR file name
      File baseDir = Activator.getDefault().getStateLocation().toFile();

      String prefix =
          String.format("%s_%s-", resource.getProject().getName(), resource
              .getName());
      File jarFile = File.createTempFile(prefix, ".jar", baseDir);
      jarrer.setJarLocation(new Path(jarFile.getAbsolutePath()));

      jarrer.setElements(resource.getProject().members(IResource.FILE));
      IJarExportRunnable runnable =
          jarrer.createJarExportRunnable(Display.getDefault()
              .getActiveShell());
      runnable.run(monitor);

      this.jarFile = jarFile;

    } catch (Exception e) {
      e.printStackTrace();
      throw new RuntimeException(e);
    }
  }

  /**
   * Allow the retrieval of the resulting JAR file
   * 
   * @return the generated JAR file
   */
  public File getJarFile() {
    return this.jarFile;
  }

  /**
   * Static way to create a JAR package for the given resource and showing a
   * progress bar
   * 
   * @param resource
   * @return
   */
  public static File createJarPackage(IResource resource) {

    JarModule jarModule = new JarModule(resource);
    try {
      PlatformUI.getWorkbench().getProgressService().run(false, true,
          jarModule);

    } catch (Exception e) {
      e.printStackTrace();
      return null;
    }

    File jarFile = jarModule.getJarFile();
    if (jarFile == null) {
      ErrorMessageDialog.display("Run on Hadoop",
          "Unable to create or locate the JAR file for the Job");
      return null;
    }

    return jarFile;
  }

}
