/******************************************************************************* * Copyright (c) 2005, 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.jee.archive; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jst.jee.archive.internal.ArchiveResourceImpl; import org.eclipse.jst.jee.archive.internal.ZipStreamArchiveSaveAdapterImpl; /** * Abstract implementation of {@link IArchiveLoadAdapter} intended for * subclassing by clients. See {@link IArchiveLoadAdapter} for details. */ public abstract class AbstractArchiveLoadAdapter extends AbstractArchiveAdapter implements IArchiveLoadAdapter { /** * Subclasses may wish to override. */ public void close() { } /** * Utility method for creating an {@link IArchiveResource} representing a * directory entry for the passed {@link IPath}. * * @param path * @return */ protected IArchiveResource createDirectory(IPath archiveRelativePath) { verifyRelative(archiveRelativePath); IArchiveResource aFile = null; aFile = new ArchiveResourceImpl(); aFile.setPath(archiveRelativePath); aFile.setType(IArchiveResource.DIRECTORY_TYPE); aFile.setArchive(getArchive()); return aFile; } /** * Utility method for creating an {@link IArchiveResource} representing a * file entry for the passed {@link IPath}. * * @param path * @return */ protected IArchiveResource createFile(IPath archiveRelativePath) { verifyRelative(archiveRelativePath); IArchiveResource aFile = null; aFile = new ArchiveResourceImpl(); aFile.setPath(archiveRelativePath); aFile.setType(IArchiveResource.FILE_TYPE); aFile.setArchive(getArchive()); return aFile; } /** * Utility method for creating an empty {@link IArchiveResource} manfiest * file. * * @param manifestPath * @return */ protected IArchiveResource createManifest(IPath manifestPath) { verifyRelative(manifestPath); IArchiveResource manifest = null; manifest = new ArchiveResourceImpl() { @Override public InputStream getInputStream() throws FileNotFoundException, IOException { String manifestContents = "Manifest-Version: 1.0\r\n\r\n"; //$NON-NLS-1$ return new BufferedInputStream(new ByteArrayInputStream(manifestContents.getBytes())); } }; manifest.setPath(manifestPath); manifest.setType(IArchiveResource.FILE_TYPE); manifest.setArchive(getArchive()); return manifest; } public static void verifyRelative(IPath archiveRelativePath) { if (archiveRelativePath.isAbsolute() && !archiveRelativePath.equals(IArchive.EMPTY_MODEL_PATH)) { throw new RuntimeException(archiveRelativePath + " must be relative."); //$NON-NLS-1$ } } /** * Default implementation; subclasses should override as necessary. */ public InputStream getInputStream(IArchiveResource archiveResource) throws IOException, FileNotFoundException { if (archiveResource.getType() == IArchive.ARCHIVE_TYPE) { IArchive thisArchive = (IArchive) archiveResource; ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); IArchiveSaveAdapter saveAdapter = new ZipStreamArchiveSaveAdapterImpl(byteOut); ArchiveOptions archiveOptions = new ArchiveOptions(); archiveOptions.setOption(ArchiveOptions.SAVE_ADAPTER, saveAdapter); try { IArchiveFactory.INSTANCE.saveArchive(thisArchive, archiveOptions, new NullProgressMonitor()); } catch (ArchiveSaveFailureException e) { throw new IOException("Unable to save nested Archive " + archiveResource.getPath() + " nested exception = " + e.getMessage()); //$NON-NLS-1$//$NON-NLS-2$ } return new ByteArrayInputStream(byteOut.toByteArray()); } return null; } /** * Default implementation; subclasses should override as necessary. */ public boolean containsArchiveResource(IPath resourcePath) { return false; } /** * Default implementation; subclasses should override as necessary. */ public boolean containsModelObject(IPath modelObjectPath) { return false; } /** * Default implementation; subclasses should override as necessary. */ public IArchiveResource getArchiveResource(IPath resourcePath) throws FileNotFoundException { return null; } /** * Default implementation; subclasses should override as necessary. */ public List<IArchiveResource> getArchiveResources() { return null; } /** * Default implementation; subclasses should override as necessary. */ public Object getModelObject(IPath modelObjectPath) throws ArchiveModelLoadException { return null; } }