package org.eclipse.jst.jsf.common.internal.resource; import java.io.File; import java.io.IOException; import java.util.jar.JarFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.IPath; import org.eclipse.jst.jsf.common.JSFCommonPlugin; /** * Represents a jar that is available on the classpath. Encapsulates the jar * as well as information about where it is provided from. * * The jar itself may have been deleted in which case, exists() will return false. * * @author cbateman * */ public class ClasspathJarFile { private final IProject _project; private final IPath _iPath; /** * @param project * @param iPath */ public ClasspathJarFile(final IProject project, final IPath iPath) { _project = project; _iPath = iPath; } /** * @return the project that this jar file is being referenced from. Note that this * is not necessarily the same as the project that owns it (if it is in the * workspace) and a jar file may be referenced by more than one project. */ public IProject getProject() { return _project; } /** * @return the class path entry */ public IPath getPath() { return _iPath; } /** * @return a new JarFile for the underlying jar. Caller MUST close the jar when * done. */ public JarFile getJarFile() { JarFile jarFileFromCPE = null; try { jarFileFromCPE = getJarFileFromCPE(_iPath, _project.getWorkspace()); } catch (final IOException e) { JSFCommonPlugin.log(e); } return jarFileFromCPE; } /** * TODO: Merge into JSFAppConfigUtils. * * @param entry * @param workspace * @return */ private JarFile getJarFileFromCPE(final IPath entry, final IWorkspace workspace) throws IOException { IPath path = _iPath; if (path.getFileExtension() != null && path.getFileExtension().length() > 0) { final IWorkspaceRoot workspaceRoot = workspace.getRoot(); if (path.getDevice() == null && workspaceRoot.getProject(path.segment(0)) .exists()) { path = workspaceRoot.getFile(path) .getLocation(); } final String libraryPathString = path.toString(); final File file = new File(libraryPathString); if (file.exists()) { return new JarFile(file); } } return null; } @Override public boolean equals(Object obj) { if (obj == this) { return true; } if (! (obj instanceof ClasspathJarFile)) { return false; } ClasspathJarFile other = (ClasspathJarFile) obj; return _project.equals(other._project) && _iPath.equals(other._iPath); } @Override public int hashCode() { return _project.hashCode() ^ _iPath.hashCode(); } @Override public String toString() { return String.format("ClasspathJarFile for project=%s, entry=%s", _project, _iPath); //$NON-NLS-1$ } }