blob: fdfdcfbefb1baa0287f287227829609588caa9dc [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;
import java.io.File;
import java.io.FileFilter;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectNature;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.QualifiedName;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
/**
* Class to configure and deconfigure an Eclipse project with the MapReduce
* project nature.
*/
public class MapReduceNature implements IProjectNature {
public static final String ID = "org.apache.hadoop.eclipse.Nature";
private IProject project;
static Logger log = Logger.getLogger(MapReduceNature.class.getName());
/**
* Configures an Eclipse project as a Map/Reduce project by adding the
* Hadoop libraries to a project's classpath.
*/
public void configure() throws CoreException {
String path =
project.getPersistentProperty(new QualifiedName(Activator.PLUGIN_ID,
"hadoop.runtime.path"));
File dir = new File(path);
final ArrayList<File> coreJars = new ArrayList<File>();
dir.listFiles(new FileFilter() {
public boolean accept(File pathname) {
String fileName = pathname.getName();
// get the hadoop core jar without touching test or examples
// older version of hadoop don't use the word "core" -- eyhung
if ((fileName.indexOf("hadoop") != -1) && (fileName.endsWith("jar"))
&& (fileName.indexOf("test") == -1)
&& (fileName.indexOf("examples") == -1)) {
coreJars.add(pathname);
}
return false; // we don't care what this returns
}
});
File dir2 = new File(path + File.separatorChar + "lib");
if (dir2.exists() && dir2.isDirectory()) {
dir2.listFiles(new FileFilter() {
public boolean accept(File pathname) {
if ((!pathname.isDirectory())
&& (pathname.getName().endsWith("jar"))) {
coreJars.add(pathname);
}
return false; // we don't care what this returns
}
});
}
// Add Hadoop libraries onto classpath
IJavaProject javaProject = JavaCore.create(getProject());
// Bundle bundle = Activator.getDefault().getBundle();
try {
IClasspathEntry[] currentCp = javaProject.getRawClasspath();
IClasspathEntry[] newCp =
new IClasspathEntry[currentCp.length + coreJars.size()];
System.arraycopy(currentCp, 0, newCp, 0, currentCp.length);
final Iterator<File> i = coreJars.iterator();
int count = 0;
while (i.hasNext()) {
// for (int i = 0; i < s_coreJarNames.length; i++) {
final File f = (File) i.next();
// URL url = FileLocator.toFileURL(FileLocator.find(bundle, new
// Path("lib/" + s_coreJarNames[i]), null));
URL url = f.toURI().toURL();
log.finer("hadoop library url.getPath() = " + url.getPath());
newCp[newCp.length - 1 - count] =
JavaCore.newLibraryEntry(new Path(url.getPath()), null, null);
count++;
}
javaProject.setRawClasspath(newCp, new NullProgressMonitor());
} catch (Exception e) {
log.log(Level.SEVERE, "IOException generated in "
+ this.getClass().getCanonicalName(), e);
}
}
/**
* Deconfigure a project from MapReduce status. Currently unimplemented.
*/
public void deconfigure() throws CoreException {
// TODO Auto-generated method stub
}
/**
* Returns the project to which this project nature applies.
*/
public IProject getProject() {
return this.project;
}
/**
* Sets the project to which this nature applies. Used when instantiating
* this project nature runtime.
*/
public void setProject(IProject project) {
this.project = project;
}
}