blob: 828e205cefe43f5ef7e940954117357bd79159d5 [file] [log] [blame]
/**
* 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.hadoop.eclipse.server;
import java.io.File;
import java.util.logging.Logger;
import org.apache.hadoop.eclipse.Activator;
import org.apache.hadoop.eclipse.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;
}
}