package org.eclipse.jst.jsf.designtime.internal.resources; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import org.eclipse.jst.jsf.common.internal.resource.ContentTypeResolver; import org.eclipse.jst.jsf.core.internal.JSFCorePlugin; /** * A JSF Resource that references an entry in the jar. Because of changes in the * underlying system since it was created, there is no guarantee that the jarURI * is still valid. Callers should call isAccessible to determine this. * * @author cbateman * */ public class JarBasedJSFResource extends JSFResource implements IJarBasedJSFResource { private final URL _jarURL; /** * @param id * @param jarURL * @param contentTypeResolver */ public JarBasedJSFResource(final ResourceIdentifier id, final URL jarURL, final ContentTypeResolver contentTypeResolver) { super(id, contentTypeResolver); _jarURL = jarURL; } /** * @return the uri pointing in the the jar where the resource lives. */ public URL getJarURL() { return _jarURL; } /** * @return the jar entry name for this resource. */ public String getJarEntryName() { return String.format("META-INF/resources/%s", getId().toString()); //$NON-NLS-1$ } private ZipEntry getZipEntry(final JarFile jarFile) { return jarFile.getEntry(getJarEntryName()); } /** * @return true if is accessible. */ @Override public boolean isAccessible() { JarFile jarFile = null; try { jarFile = getJarFile(); if (jarFile != null) { final ZipEntry entry = getZipEntry(jarFile); return entry != null; } } finally { if (jarFile != null) { try { jarFile.close(); } catch (IOException ioex) { JSFCorePlugin.log("Error closing jar file", ioex); //$NON-NLS-1$ } } } return false; } private JarFile getJarFile() { URLConnection connection; try { connection = _jarURL.openConnection(); connection.connect(); if (connection instanceof JarURLConnection) { return ((JarURLConnection) connection).getJarFile(); } } catch (IOException e) { // fall through } return null; } }