/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.core.classpath;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathContainer;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.jboss.tools.common.core.CommonCorePlugin;
import org.jboss.tools.common.core.Messages;
/**
*
* @author Rob Stryker <rob.stryker@redhat.com>
*
*/
public abstract class AbstractClasspathContainer implements IClasspathContainer {
public static final String LIB_FOLDER = "lib"; //$NON-NLS-1$
public static final String LIB_SOURCE_FOLDER = "libsrc"; //$NON-NLS-1$
public final static String CLASSPATH_CONTAINER_PREFIX = "org.jboss.ide.eclipse.as.classpath.core"; //$NON-NLS-1$
protected IClasspathEntry[] entries;
protected IPath path;
protected String description;
protected String libFolder;
protected IJavaProject javaProject;
protected static ClasspathDecorationsManager decorations;
static {
decorations = new ClasspathDecorationsManager();
}
public AbstractClasspathContainer(IPath path, String description,
String libFolder, IJavaProject project) {
this.path = path;
this.description = description;
this.libFolder = libFolder;
this.javaProject = project;
}
public IClasspathEntry[] getClasspathEntries() {
if (entries == null) {
entries = computeEntries();
}
return entries;
}
public String getDescription() {
return this.description;
}
public int getKind() {
return IClasspathContainer.K_APPLICATION;
}
public IPath getPath() {
return this.path;
}
protected IClasspathEntry[] computeEntries() {
ArrayList<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
String baseDir = getBaseDir();
if (baseDir == null)
return new IClasspathEntry[0];
File libDir = new File(baseDir
+ "/" + LIB_FOLDER + "/" + getLibFolder());//$NON-NLS-1$ //$NON-NLS-2$
File libSrcDir = new File(baseDir
+ "/" + LIB_SOURCE_FOLDER + "/" + getLibFolder());//$NON-NLS-1$ //$NON-NLS-2$
// Lists every modules in the lib dir
File[] jars = libDir.listFiles(new FileFilter() {
public boolean accept(File file) {
return (file.toString().endsWith(".jar"));//$NON-NLS-1$
}
});
if (jars != null) {
for (int i = 0; i < jars.length; i++) {
File jarFile = jars[i];
String jarFileName = jarFile.getName();
File jarSrcFile = new File(libSrcDir, jarFileName);
IPath entryPath = new Path(jarFile.toString());
IPath sourceAttachementPath = null;
IPath sourceAttachementRootPath = null;
final ClasspathDecorations dec
= decorations.getDecorations( getDecorationManagerKey(getPath().toString()), entryPath.toString() );
IClasspathAttribute[] attrs = {};
if( dec != null ) {
sourceAttachementPath = dec.getSourceAttachmentPath();
sourceAttachementRootPath = dec.getSourceAttachmentRootPath();
attrs = dec.getExtraAttributes();
} else if (jarSrcFile.exists()) {
sourceAttachementPath = new Path(jarSrcFile.toString());
sourceAttachementRootPath = new Path("/");//$NON-NLS-1$
}
IAccessRule[] access = {};
IClasspathEntry entry = JavaCore.newLibraryEntry( entryPath, sourceAttachementPath,
sourceAttachementRootPath, access, attrs, false );
entries.add(entry);
}
}
return entries.toArray(new IClasspathEntry[entries.size()]);
}
protected String getLibFolder() {
return this.libFolder;
}
protected String getBaseDir() {
try {
URL installURL = FileLocator.toFileURL(CommonCorePlugin
.getDefault().getBundle().getEntry("/")); //$NON-NLS-1$
return installURL.getFile().toString();
} catch (IOException ioe) {
// LOG THE ERROR (one day)
IStatus status = new Status(IStatus.ERROR, CommonCorePlugin.PLUGIN_ID,
Messages.AbstractClasspathContainer_error_loading_container, ioe);
CommonCorePlugin.getDefault().getLog().log(status);
}
return null;
}
public static String getDecorationManagerKey( String container){
return container;
}
protected static ClasspathDecorationsManager getDecorationsManager() {
return decorations;
}
public void install() {
entries = computeEntries();
IJavaProject[] javaProjects = new IJavaProject[] {javaProject};
final IClasspathContainer[] conts = new IClasspathContainer[] { this };
try {
JavaCore.setClasspathContainer(path, javaProjects, conts, null);
} catch (CoreException e) {
CommonCorePlugin.getDefault().logError(e);
}
}
public abstract void refresh();
}