blob: 945bf2e13ea293a82f18d1072706126c195a3f09 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.j2ee.internal.archive;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jst.common.internal.modulecore.SingleRootUtil;
import org.eclipse.jst.j2ee.classpathdep.IClasspathDependencyConstants;
import org.eclipse.jst.j2ee.componentcore.J2EEModuleVirtualComponent;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.archive.operations.EARArchiveOpsResourceHandler;
import org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyManifestUtil;
import org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyVirtualComponent;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.jee.archive.AbstractArchiveLoadAdapter;
import org.eclipse.jst.jee.archive.ArchiveModelLoadException;
import org.eclipse.jst.jee.archive.IArchive;
import org.eclipse.jst.jee.archive.IArchiveLoadAdapter;
import org.eclipse.jst.jee.archive.IArchiveResource;
import org.eclipse.jst.jee.archive.internal.ArchiveURIConverter;
import org.eclipse.jst.jee.archive.internal.ArchiveUtil;
import org.eclipse.wst.common.componentcore.UnresolveableURIException;
import org.eclipse.wst.common.componentcore.internal.ComponentResource;
import org.eclipse.wst.common.componentcore.internal.DependencyType;
import org.eclipse.wst.common.componentcore.internal.StructureEdit;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
public abstract class ComponentArchiveLoadAdapter extends AbstractArchiveLoadAdapter {
protected static final String DOT_SQLJ = ".sqlj"; //$NON-NLS-1$
protected static final String DOT_JSP = ".jsp"; //$NON-NLS-1$
protected static final String DOT_PROJECT = ".project"; //$NON-NLS-1$
protected static final String DOT_CLASSPATH = ".classpath"; //$NON-NLS-1$
protected static final String DOT_SETTINGS = ".settings"; //$NON-NLS-1$
protected static final String DOT_CVS_IGORE = ".cvsignore"; //$NON-NLS-1$
protected IVirtualComponent vComponent;
protected boolean exportSource = true;
protected boolean optimizeMembers = false;
private List<ZipFile> zipFiles = new ArrayList<ZipFile>();
private List<String> javaClasspathURIs = new ArrayList<String>();
protected boolean includeClasspathComponents = true;
protected class FilesHolder {
private Map<IPath, IArchiveResource> pathsToArchiveResources = new HashMap<IPath, IArchiveResource>();
private Map<IPath, IResource> pathsToWorkbenchResources = new HashMap<IPath, IResource>();
private Map<IResource, IPath> workbenchResourcesToPaths = new HashMap<IResource, IPath>();
private Map<IPath, java.io.File> pathsToDiskFiles = new HashMap<IPath, java.io.File>();
private Map pathsToZipEntry = new HashMap();
public void removeIFile(IFile file) {
IPath path = workbenchResourcesToPaths.get(file);
remove(path);
}
public void remove(IPath path) {
pathsToArchiveResources.remove(path);
Object resource = pathsToWorkbenchResources.remove(path);
if (resource != null) {
workbenchResourcesToPaths.remove(resource);
}
pathsToDiskFiles.remove(path);
}
public void addFile(IArchiveResource file) {
IPath path = file.getPath();
pathsToArchiveResources.put(path, file);
}
public void addFile(IArchiveResource file, java.io.File externalDiskFile) {
IPath path = file.getPath();
pathsToArchiveResources.put(path, file);
pathsToDiskFiles.put(path, externalDiskFile);
}
public void addFile(IArchiveResource file, IResource resource) {
IPath path = file.getPath();
pathsToArchiveResources.put(path, file);
pathsToWorkbenchResources.put(path, resource);
}
public InputStream getInputStream(IPath path) throws IOException, FileNotFoundException {
java.io.File diskFile = null;
if (pathsToDiskFiles.containsKey(path)) {
diskFile = pathsToDiskFiles.get(path);
} else if (pathsToWorkbenchResources.containsKey(path)) {
IResource resource = pathsToWorkbenchResources.get(path);
diskFile = new java.io.File(resource.getLocation().toOSString());
}
if (diskFile != null) {
return new FileInputStream(diskFile);
} else if (pathsToZipEntry.containsKey(path)) {
Map fileURIMap = (Map) pathsToZipEntry.get(path);
Iterator it = fileURIMap.keySet().iterator();
String sourceFileUri = ""; //$NON-NLS-1$
ZipFile zipFile = null;
// there is only one key, pair
while (it.hasNext()) {
sourceFileUri = (String) it.next();
zipFile = (ZipFile) fileURIMap.get(sourceFileUri);
}
if(zipFile != null){
ZipEntry entry = zipFile.getEntry(sourceFileUri);
InputStream in = zipFile.getInputStream(entry);
return in;
}
throw new IOException();
} else {
IArchiveResource res = getArchiveResource(path);
return ComponentArchiveLoadAdapter.this.getSuperInputStream(res);
}
}
public List<IArchiveResource> getFiles() {
return new ArrayList<IArchiveResource>(pathsToArchiveResources.values());
}
public boolean contains(IPath path) {
return pathsToArchiveResources.containsKey(path);
}
public IArchiveResource getArchiveResource(IPath path) {
return pathsToArchiveResources.get(path);
}
public void addEntry(ZipEntry entry, ZipFile zipFile, IPath runtimePath) {
IPath innerRuntimePath = runtimePath;
if (innerRuntimePath != null) {
if (!innerRuntimePath.equals("/")) //$NON-NLS-1$
innerRuntimePath = innerRuntimePath.append(entry.getName());
else
innerRuntimePath = new Path(entry.getName());
} else {
innerRuntimePath = new Path(entry.getName());
}
IArchiveResource file = createFile(innerRuntimePath);
Map<String, ZipFile> fileURIMap = new HashMap<String, ZipFile>();
fileURIMap.put(entry.getName(), zipFile);
pathsToZipEntry.put(file.getPath(), fileURIMap);
pathsToArchiveResources.put(file.getPath(), file);
}
}
protected FilesHolder filesHolder;
private IVirtualFile manifestFile = null;
public ComponentArchiveLoadAdapter(IVirtualComponent vComponent) {
this(vComponent, true);
}
public ComponentArchiveLoadAdapter(IVirtualComponent vComponent, boolean includeClasspathComponents) {
this.vComponent = vComponent;
filesHolder = new FilesHolder();
setIncludeClasspathComponents(includeClasspathComponents);
}
public void setIncludeClasspathComponents(boolean includeClasspathComponents) {
this.includeClasspathComponents = includeClasspathComponents;
if (includeClasspathComponents) {
this.manifestFile = vComponent.getRootFolder().getFile(new Path(J2EEConstants.MANIFEST_URI));
saveJavaClasspathReferences();
} else {
this.manifestFile = null;
javaClasspathURIs.clear();
}
}
@Override
public IArchiveResource getArchiveResource(IPath resourcePath) throws FileNotFoundException {
initArchiveResource(resourcePath);
return filesHolder.getArchiveResource(resourcePath);
}
@Override
public boolean containsArchiveResource(IPath path) {
initArchiveResource(path);
return filesHolder.contains(path);
}
/**
* Will lazily initialize File type ArchiveResources contained in the component structure without loading the entire
* archive. If the File can not be found, then the entire structure will be loaded.
* @param resourcePath
*/
protected void initArchiveResource(IPath resourcePath) {
if(archiveResourcesInitialized) {
//if the entire archive has been initialized, there is no need to repeat
return;
}
if(filesHolder.contains(resourcePath)){
//if the archive already knows about the resource return
return;
}
initSourceRoots();
// want to be quick if possible, so only try to load from the component structure
// if the file is not present there, then look everywhere
IVirtualFolder rootFolder = vComponent.getRootFolder();
IVirtualFile vFile = rootFolder.getFile(resourcePath);
if (vFile.exists()) {
IPath runtimePath = vFile.getRuntimePath();
if (runtimePath != null){
runtimePath = runtimePath.setDevice(null).makeRelative();
if(runtimePath.equals(resourcePath)){
boolean inJavaSrc = inJavaSrc(vFile);
if(aggregateResource(vFile, runtimePath, inJavaSrc, IArchiveResource.FILE_TYPE) != null){
return; //found the file and added it
}
}
}
}
//if it was not found above then do the full initialize
initArchiveResources();
}
protected boolean sourceRootsInitialized = false;
protected void initSourceRoots() {
if(!sourceRootsInitialized){
sourceRootsInitialized = true;
try {
IPackageFragmentRoot[] srcPkgs = J2EEProjectUtilities.getSourceContainers(vComponent.getProject());
sourceRoots = new IResource[srcPkgs.length];
for (int i = 0; i < srcPkgs.length; i++) {
sourceRoots[i] = srcPkgs[i].getCorrespondingResource();
}
inJavaSrc = false;
} catch (CoreException e) {
J2EEPlugin.logError(e);
}
}
}
protected boolean archiveResourcesInitialized = false;
protected boolean membersOptimized = false;
protected void initArchiveResources() {
if (!archiveResourcesInitialized) {
archiveResourcesInitialized = true;
if (shouldOptimize()) {
attemptOptimization();
}
if (!membersOptimized) {
aggregateSourceFiles();
aggregateClassFiles();
}
addUtilities();
}
}
protected void attemptOptimization() {
SingleRootUtil util = new SingleRootUtil(getComponent());
IContainer rootContainer = util.getSingleRoot();
if (rootContainer != null) {
try {
membersOptimized = true;
optimizeMembers(Path.EMPTY, rootContainer);
} catch (CoreException e) {
J2EEPlugin.logError(e);
}
}
}
@Override
public List<IArchiveResource> getArchiveResources() {
initArchiveResources();
return filesHolder.getFiles();
}
public IResource getWorkbenchResources(IPath path) {
return filesHolder.pathsToWorkbenchResources.get(path);
}
public File getExternalFiles(IPath path) {
return filesHolder.pathsToDiskFiles.get(path);
}
/**
* Adds library cp entries that point to class folders and have been tagged with the publish/export attribute.
*/
protected void addMappedClassFolders(final IPath targetRuntimePath) {
// retrieve all mapped class folders
if (vComponent instanceof J2EEModuleVirtualComponent) {
try {
final J2EEModuleVirtualComponent j2eeComponent = (J2EEModuleVirtualComponent) vComponent;
final IVirtualReference[] cpRefs = j2eeComponent.getJavaClasspathReferences();
for (int j = 0; j < cpRefs.length; j++) {
final IVirtualReference ref = cpRefs[j];
final IPath runtimePath = ref.getRuntimePath();
// only process mappings with the specified runtime path
if (ref.getReferencedComponent() instanceof ClasspathDependencyVirtualComponent) {
if (runtimePath.equals(targetRuntimePath) || runtimePath.equals(IClasspathDependencyConstants.WEB_INF_CLASSES_PATH)) {
final ClasspathDependencyVirtualComponent comp = (ClasspathDependencyVirtualComponent) ref.getReferencedComponent();
if (comp.isClassFolder()) {
final IContainer classFolder = comp.getClassFolder();
if (classFolder != null && classFolder.exists()) {
aggregateOutputFiles(new IResource[]{classFolder}, runtimePath.makeRelative(), classFolder.getProjectRelativePath().segmentCount());
}
}
}
}
}
} catch (CoreException e) {
J2EEPlugin.logError(e);
}
}
}
protected void saveJavaClasspathReferences() {
if (vComponent instanceof J2EEModuleVirtualComponent) {
final J2EEModuleVirtualComponent j2eeComp = (J2EEModuleVirtualComponent) vComponent;
final IVirtualReference[] refs = j2eeComp.getJavaClasspathReferences();
if (refs == null) {
return;
}
for (int i = 0; i < refs.length; i++) {
if (refs[i].getRuntimePath().equals(IClasspathDependencyConstants.RUNTIME_MAPPING_INTO_CONTAINER_PATH)) {
javaClasspathURIs.add(refs[i].getArchiveName());
}
}
}
}
protected void addUtilities() {
IVirtualReference[] components = vComponent.getReferences();
for (int i = 0; i < components.length; i++) {
IVirtualReference reference = components[i];
IVirtualComponent referencedComponent = reference.getReferencedComponent();
if (referencedComponent.isBinary() && reference.getDependencyType() == DependencyType.CONSUMES) {
java.io.File diskFile = (java.io.File) referencedComponent.getAdapter(java.io.File.class);
ZipFile zipFile;
IPath path = reference.getRuntimePath();
try {
zipFile = ArchiveUtil.newZipFile(diskFile);
zipFiles.add(zipFile);
Enumeration enumeration = zipFile.entries();
while (enumeration.hasMoreElements()) {
ZipEntry entry = (ZipEntry) enumeration.nextElement();
filesHolder.addEntry(entry, zipFile, path);
}
} catch (ZipException e) {
J2EEPlugin.logError(e);
} catch (IOException e) {
J2EEPlugin.logError(e);
}
}
}
}
/**
* This is a cache of the IResource roots for all java source folders and is
* used by {@link #inJavaSrc(IVirtualResource)}.
*/
private IResource[] sourceRoots = null;
protected void aggregateSourceFiles() {
try {
initSourceRoots();
IVirtualFolder rootFolder = vComponent.getRootFolder();
IVirtualResource[] members = rootFolder.members();
inJavaSrc = false;
aggregateFiles(members);
} catch (CoreException e) {
J2EEPlugin.logError(e);
}
}
protected void aggregateClassFiles() {
StructureEdit se = null;
try {
IPackageFragmentRoot[] sourceRoots = J2EEProjectUtilities.getSourceContainers(vComponent.getProject());
se = StructureEdit.getStructureEditForRead(vComponent.getProject());
for (int i = 0; i < sourceRoots.length; i++) {
IPath outputPath = sourceRoots[i].getRawClasspathEntry().getOutputLocation();
if (outputPath == null) {
IProject project = vComponent.getProject();
if (project.hasNature(JavaCore.NATURE_ID)) {
IJavaProject javaProject = JavaCore.create(project);
outputPath = javaProject.getOutputLocation();
}
}
if (outputPath != null) {
IContainer javaOutputContainer = outputPath.segmentCount() > 1 ? (IContainer) ResourcesPlugin.getWorkspace().getRoot().getFolder(outputPath) : (IContainer) ResourcesPlugin
.getWorkspace().getRoot().getProject(outputPath.lastSegment());
IPath runtimePath = null;
try {
ComponentResource[] componentResources = se.findResourcesBySourcePath(sourceRoots[i].getResource().getProjectRelativePath());
if (componentResources.length > 0) {
IPath tmpRuntimePath = componentResources[0].getRuntimePath();
IPath tmpSourcePath = componentResources[0].getSourcePath();
if (!tmpRuntimePath.equals(tmpSourcePath)) {
while (tmpSourcePath.segmentCount() > 0 && tmpRuntimePath.segmentCount() > 0 && tmpRuntimePath.lastSegment().equals(tmpSourcePath.lastSegment())) {
tmpRuntimePath = tmpRuntimePath.removeLastSegments(1);
tmpSourcePath = tmpSourcePath.removeLastSegments(1);
}
if (tmpRuntimePath.segmentCount() != 0) {
runtimePath = tmpRuntimePath.makeRelative();
}
}
}
} catch (UnresolveableURIException e) {
J2EEPlugin.logError(e);
}
if (null == runtimePath) {
runtimePath = new Path(""); //$NON-NLS-1$
}
aggregateOutputFiles(new IResource[] { javaOutputContainer }, runtimePath, javaOutputContainer.getProjectRelativePath().segmentCount());
}
}
} catch (CoreException e) {
J2EEPlugin.logError(e);
} finally {
if (se != null) {
se.dispose();
}
}
}
protected boolean aggregateOutputFiles(IResource[] resources, final IPath runtimePathPrefix, int outputFolderSegmentCount) throws CoreException {
boolean fileAdded = false;
for (int i = 0; i < resources.length; i++) {
IArchiveResource cFile = null;
if (!resources[i].exists()) {
continue;
}
// We have to avoid duplicates between the source and output folders
// (non-java
// resources)
IPath runtimePath = runtimePathPrefix.append(resources[i].getProjectRelativePath().removeFirstSegments(outputFolderSegmentCount));
if (runtimePath == null)
continue;
if (resources[i].getType() == IResource.FILE) {
if (!shouldInclude(runtimePath))
continue;
cFile = createFile(runtimePath);
cFile.setLastModified(getLastModified(resources[i]));
filesHolder.addFile(cFile, resources[i]);
fileAdded = true;
} else if (shouldInclude((IContainer) resources[i])) {
IResource[] nestedResources = ((IContainer) resources[i]).members();
aggregateOutputFiles(nestedResources, runtimePathPrefix, outputFolderSegmentCount);
if (!filesHolder.contains(runtimePath)) {
if (!shouldInclude(runtimePath))
continue;
cFile = createDirectory(runtimePath);
cFile.setLastModified(getLastModified(resources[i]));
filesHolder.addFile(cFile, resources[i]);
fileAdded = true;
}
}
}
return fileAdded;
}
/**
* This is used to track whether {@link #aggregateFiles(IVirtualResource[])}
* is currently within a Java Source folder.
*/
private boolean inJavaSrc = false;
protected boolean aggregateFiles(IVirtualResource[] virtualResources) throws CoreException {
boolean fileAdded = false;
for (int i = 0; i < virtualResources.length; i++) {
if (!virtualResources[i].exists()) {
continue;
}
// We have to avoid duplicates between the source and output folders
// (non-java
// resources)
IPath runtimePath = virtualResources[i].getRuntimePath();
if (runtimePath == null)
continue;
runtimePath = runtimePath.setDevice(null).makeRelative();
if (filesHolder.contains(runtimePath))
continue;
if (virtualResources[i].getType() == IVirtualResource.FILE) {
if(aggregateResource(virtualResources[i], runtimePath, inJavaSrc, IArchiveResource.FILE_TYPE) != null){
fileAdded = true;
}
} else if (shouldInclude((IVirtualContainer) virtualResources[i])) {
boolean inJavaSrcAtThisLevel = inJavaSrc;
try {
if (!inJavaSrc) {
// if not already inside a Java src dir, check again
inJavaSrc = inJavaSrc(virtualResources[i]);
}
IVirtualResource[] nestedVirtualResources = ((IVirtualContainer) virtualResources[i]).members();
aggregateFiles(nestedVirtualResources);
if (!filesHolder.contains(runtimePath)) {
if(aggregateResource(virtualResources[i], runtimePath, inJavaSrc, IArchiveResource.DIRECTORY_TYPE) != null){
fileAdded = true;
}
}
} finally {
inJavaSrc = inJavaSrcAtThisLevel;
}
}
}
return fileAdded;
}
protected IArchiveResource aggregateResource(IVirtualResource virtualResource, IPath runtimePath, boolean inJavaSrc, int archiveResourceType){
if (!shouldInclude(runtimePath)){
return null;
}
IResource resource = virtualResource.getUnderlyingResource();
// want to ignore derived resources nested within Java src
// directories; this covers the case where
// a user has nested a Java output directory within a Java src
// directory (note: should ideally be
// respecting Java src path exclusion filters)
if (inJavaSrc && resource.isDerived()) {
return null;
}
IArchiveResource cFile = null;
switch(archiveResourceType){
case IArchiveResource.FILE_TYPE:
cFile = createFile(runtimePath);
break;
case IArchiveResource.DIRECTORY_TYPE:
cFile = createDirectory(runtimePath);
break;
default:
return null;
}
cFile.setLastModified(getLastModified(resource));
filesHolder.addFile(cFile, resource);
return cFile;
}
/**
* Determines if the specified IVirtualResource maps to a IResource that is
* contained within a Java src root.
*
* @param virtualResource
* IVirtualResource to check.
* @param sourceRoots
* Current Java src roots.
* @return True if contained in a Java src root, false otherwise.
*/
protected boolean inJavaSrc(final IVirtualResource virtualResource) {
if (sourceRoots.length == 0) {
return false;
}
// all mapped resources must be associated with Java src for the
// resource to be considered in Java src
final IResource[] resources = virtualResource.getUnderlyingResources();
boolean inJavaSrc = false;
for (int i = 0; i < resources.length; i++) {
inJavaSrc = false;
for (int j = 0; j < sourceRoots.length; j++) {
if (sourceRoots[j].getFullPath().isPrefixOf(resources[i].getFullPath())) {
inJavaSrc = true;
break;
}
}
// if this one was not in Java src, can break
if (!inJavaSrc) {
break;
}
}
return inJavaSrc;
}
protected long getLastModified(IResource aResource) {
return aResource.getLocation().toFile().lastModified();
}
protected void optimizeMembers(IPath path, IContainer container) throws CoreException {
IResource[] resources;
resources = container.members();
if (resources != null) {
int size = resources.length;
for (int i = 0; i < size; i++) {
IResource resource = resources[i];
IArchiveResource cFile = null;
if (resource != null && resource.exists()) {
IPath deployPath = path.append(resource.getName());
if (filesHolder.contains(deployPath)) {
continue;
}
if (resource instanceof IContainer) {
IContainer container2 = (IContainer) resource;
cFile = createDirectory(deployPath);
optimizeMembers(deployPath, container2);
} else if ((resource instanceof IFile) && (isExportSource() || !isSource(deployPath))) {
cFile = createFile(deployPath);
}
}
if (cFile != null) {
cFile.setLastModified(getLastModified(resource));
filesHolder.addFile(cFile, resource);
}
}
}
}
public void setExportSource(boolean newExportSource) {
exportSource = newExportSource;
}
public boolean isExportSource() {
return exportSource;
}
public void setOptimize(boolean optimize) {
optimizeMembers = optimize;
}
public boolean shouldOptimize() {
return optimizeMembers;
}
public boolean shouldUpdateManifest(IArchiveResource archiveResource) {
IPath path = archiveResource.getPath();
if (includeClasspathComponents && path.equals(new Path(J2EEConstants.MANIFEST_URI)) && !javaClasspathURIs.isEmpty() && manifestFile != null
&& manifestFile.getUnderlyingFile() != null && manifestFile.getUnderlyingFile().exists()) {
return true;
}
return false;
}
protected boolean shouldInclude(IContainer aContainer) {
return true;
}
protected boolean shouldInclude(IVirtualContainer vContainer) {
IContainer iContainer = (IContainer) vContainer.getUnderlyingResource();
return shouldInclude(iContainer);
}
// TODO add a mechanism for ignoring specific file types
protected boolean shouldInclude(IPath path) {
String lastSegment = path.lastSegment();
if (null == lastSegment) {
return false;
}
if (lastSegment.endsWith(DOT_PROJECT) || lastSegment.endsWith(DOT_CLASSPATH) || lastSegment.endsWith(DOT_CVS_IGORE) || path.segment(0).startsWith(DOT_SETTINGS)) {
return false;
}
return isExportSource() || !isSource(path);
}
// TODO add a mechanism for ignoring specific file types
protected boolean isSource(IPath path) {
if (path == null)
return false;
return path.lastSegment().endsWith(JavaEEArchiveUtilities.DOT_JAVA) || path.lastSegment().endsWith(DOT_SQLJ);
}
protected void addExternalFile(IPath path, java.io.File externalDiskFile) {
IArchiveResource aFile = createFile(path);
filesHolder.addFile(aFile, externalDiskFile);
}
protected InputStream getSuperInputStream(IArchiveResource archiveResource) throws IOException, FileNotFoundException {
if (archiveResource.getType() == IArchive.ARCHIVE_TYPE) {
IArchiveLoadAdapter nestedLoadAdapter = ((IArchive)archiveResource).getLoadAdapter();
if(nestedLoadAdapter instanceof ComponentArchiveLoadAdapter){
((ComponentArchiveLoadAdapter)nestedLoadAdapter).setExportSource(isExportSource());
}
}
return super.getInputStream(archiveResource);
}
@Override
public InputStream getInputStream(IArchiveResource archiveResource) throws IOException, FileNotFoundException {
// If the MANIFEST.MF of a module component is being requested and that
// module component references
// Java build path-based components, need to dynamically update the
// manifest classpath to reflect the resolved
// contributions from the build path
if (shouldUpdateManifest(archiveResource)) {
// update the manifest classpath for the component
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ClasspathDependencyManifestUtil.updateManifestClasspath(manifestFile.getUnderlyingFile(), javaClasspathURIs, baos);
return new ByteArrayInputStream(baos.toByteArray());
}
IPath path = archiveResource.getPath();
if (filesHolder.contains(path)) {
return filesHolder.getInputStream(path);
}
IVirtualFolder rootFolder = vComponent.getRootFolder();
IVirtualResource vResource = rootFolder.findMember(path);
String filePath = null;
if (null != vResource && vResource.exists()) {
filePath = vResource.getUnderlyingResource().getLocation().toOSString();
java.io.File file = new java.io.File(filePath);
return new FileInputStream(file);
}
String eString = EARArchiveOpsResourceHandler.ARCHIVE_OPERATION_FileNotFound;
throw new FileNotFoundException(eString);
}
public IVirtualComponent getComponent() {
return vComponent;
}
protected JavaEEEMFArchiveAdapterHelper emfHelper = null;
protected void initEMFHelper() {
if (emfHelper == null) {
emfHelper = new JavaEEEMFArchiveAdapterHelper(getArchive());
emfHelper.setArchiveURIConverter(new ArchiveURIConverter(emfHelper.getArchive()) {
@Override
protected URI convertPathToURI(IPath modelObjectPath) {
// TODO find a better way to getplatformURI
IPath path = getComponent().getRootFolder().getFile(modelObjectPath).getUnderlyingFile().getFullPath();
return URI.createURI("platform:/resource/" + path.toString()); //$NON-NLS-1$
}
});
}
}
@Override
public boolean containsModelObject(IPath modelObjectPath) {
initEMFHelper();
IPath innerModelObjectPath = modelObjectPath;
if (IArchive.EMPTY_MODEL_PATH == innerModelObjectPath) {
innerModelObjectPath = getDefaultModelObjectPath();
}
return emfHelper.containsModelObject(innerModelObjectPath);
}
@Override
public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException {
initEMFHelper();
IPath innerModelObjectPath = modelObjectPath;
if (IArchive.EMPTY_MODEL_PATH == innerModelObjectPath) {
innerModelObjectPath = getDefaultModelObjectPath();
}
return emfHelper.getModelObject(innerModelObjectPath);
}
protected IPath getDefaultModelObjectPath() {
return new Path("/"); //$NON-NLS-1$
}
@Override
public String toString() {
int packageLength = this.getClass().getPackage().getName().length() + 1;
StringBuffer buffer = new StringBuffer(this.getClass().getName().substring(packageLength));
buffer.append(", Component: "); //$NON-NLS-1$
buffer.append(getComponent());
return buffer.toString();
}
/**
* protected IProgressMonitor monitor = null;
*
* public void setProgressMonitor(IProgressMonitor monitor){ this.monitor =
* monitor; }
*
* protected final int FILE_SAVE_WORK = 100;
*
* public FileIterator getFileIterator() throws IOException { return new
* FileIteratorImpl(getContainer().getFiles()){ protected SubProgressMonitor
* lastSubMon = null; boolean firstVisit = true;
*
* public File next() { if(firstVisit){ firstVisit = false; if(monitor !=
* null){
* monitor.beginTask(ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.Exporting_archive,
* new Object [] { getContainer().getURI() }), files.size() *
* FILE_SAVE_WORK); } } if(lastSubMon != null){ lastSubMon.done();
* lastSubMon = null; } else if(monitor != null){
* monitor.worked(FILE_SAVE_WORK); } File file = super.next(); if(monitor !=
* null){ if(file.isContainer() &&
* ComponentArchiveLoadAdapter.class.isInstance(((ContainerImpl)file).getLoadStrategy())){
* ComponentArchiveLoadAdapter ls =
* (ComponentArchiveLoadAdapter)((ContainerImpl)file).getLoadStrategy();
* lastSubMon = new SubProgressMonitor(monitor, FILE_SAVE_WORK,
* SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK);
* ls.setProgressMonitor(lastSubMon); } else {
* monitor.subTask(file.getURI()); } } return file; } }; }
*/
}