blob: b404f5d374342340f633aafd9a0f9d87b6ab218c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2005 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.commonarchivecore.internal.strategy;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveURIConverterImpl;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
/**
* Implementer that knows how to save an archives contents to a directory on the local file system
*/
public class DirectorySaveStrategyImpl extends SaveStrategyImpl implements SaveStrategy {
protected String directoryName;
protected URIConverter uriConverter;
/** Indicates which type of archives should be expanded */
protected int expansionFlags;
/**
* DirectoryDumpStrategy constructor comment.
*/
public DirectorySaveStrategyImpl() {
super();
}
/**
* DirectoryDumpStrategy constructor comment.
*/
public DirectorySaveStrategyImpl(String dirName, int flags) {
super();
setDirectoryName(dirName);
setExpansionFlags(flags);
initialize();
}
/**
* @see com.ibm.etools.archive.impl.SaveStrategyImpl
*/
protected SaveStrategy createNestedDirectoryStrategy(Archive anArchive) {
String uri = org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil.getOSUri(getDirectoryName(), anArchive.getURI());
return new DirectorySaveStrategyImpl(uri, getExpansionFlags());
}
/**
* @see com.ibm.etools.archive.impl.SaveStrategyImpl
*/
protected SaveStrategy createNestedSaveStrategy(Archive anArchive) throws IOException {
if (shouldExpand(anArchive))
return createNestedDirectoryStrategy(anArchive);
return createNestedZipStrategy(anArchive);
}
/**
* @see com.ibm.etools.archive.impl.SaveStrategyImpl
*/
protected SaveStrategy createNestedZipStrategy(Archive anArchive) throws IOException {
OutputStream out = getUriConverter().createOutputStream(URI.createURI(anArchive.getURI()));
return new ZipStreamSaveStrategyImpl(out);
}
/**
* Insert the method's description here. Creation date: (11/15/00 2:26:37 PM)
*
* @return java.lang.String
*/
public java.lang.String getDirectoryName() {
return directoryName;
}
/**
* Insert the method's description here. Creation date: (12/19/00 10:18:21 AM)
*
* @return int
*/
public int getExpansionFlags() {
return expansionFlags;
}
/**
* @see com.ibm.etools.archive.impl.SaveStrategyImpl
*/
protected java.io.OutputStream getOutputStreamForResource(Resource aResource) throws java.io.IOException {
return getUriConverter().createOutputStream(aResource.getURI());
}
/**
* Insert the method's description here. Creation date: (12/08/00 4:50:32 PM)
*
* @return org.eclipse.emf.ecore.resource.URIConverter
*/
public org.eclipse.emf.ecore.resource.URIConverter getUriConverter() {
return uriConverter;
}
public void initialize() {
ArchiveURIConverterImpl converter = new ArchiveURIConverterImpl(getArchive(), getDirectoryName());
converter.setOutputFilepath(getDirectoryName());
setUriConverter(converter);
}
/**
* @see com.ibm.etools.archive.SaveStrategy
*/
public boolean isDirectory() {
return true;
}
protected void mkdirs(String directoryPath) {
File aDirectory = new File(getDirectoryName() + File.separatorChar + directoryPath);
aDirectory.mkdirs();
}
/**
* @see com.ibm.etools.archive.SaveStrategy
*/
public void save(org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest aManifest) throws SaveFailureException {
try {
OutputStream out = getUriConverter().createOutputStream(URI.createURI(J2EEConstants.MANIFEST_URI));
aManifest.write(out);
out.close();
if (getArchive().getOptions().isReadOnly())
setTimestampAfterSaving(J2EEConstants.MANIFEST_URI);
} catch (IOException iox) {
throw new SaveFailureException(J2EEConstants.MANIFEST_URI, iox);
}
}
/**
* @see com.ibm.etools.archive.impl.SaveStrategyImpl
*/
public void save(org.eclipse.jst.j2ee.commonarchivecore.internal.File aFile, InputStream in) throws SaveFailureException {
String entryName = aFile.getURI();
if (aFile.isDirectoryEntry())
mkdirs(entryName);
else {
try {
OutputStream out = getUriConverter().createOutputStream(URI.createURI(entryName));
ArchiveUtil.copy(in, out);
setTimestampAfterSaving(aFile);
} catch (IOException iox) {
throw new SaveFailureException(aFile.getURI(), iox);
}
}
}
protected void saveMofResource(org.eclipse.emf.ecore.resource.Resource aResource, OutputStream os) throws IOException {
super.saveMofResource(aResource, os);
os.close();
}
/**
* Insert the method's description here. Creation date: (11/15/00 2:26:37 PM)
*
* @param newDirectoryName
* java.lang.String
*/
public void setDirectoryName(java.lang.String newDirectoryName) {
directoryName = newDirectoryName;
}
/**
* Insert the method's description here. Creation date: (12/19/00 10:18:21 AM)
*
* @param newExpansionFlags
* int
*/
public void setExpansionFlags(int newExpansionFlags) {
expansionFlags = newExpansionFlags;
}
protected void setTimestampAfterSaving(org.eclipse.jst.j2ee.commonarchivecore.internal.File aFile) {
long lastMod = aFile.getLastModified();
if (lastMod == 0)
return;
String absPath = ArchiveUtil.getOSUri(getDirectoryName(), aFile.getURI());
File ioFile = new File(absPath);
ioFile.setLastModified(lastMod);
}
protected void setTimestampAfterSaving(String uri) {
org.eclipse.jst.j2ee.commonarchivecore.internal.File aFile = null;
try {
aFile = getArchive().getFile(uri);
} catch (FileNotFoundException mustBeANewEntry) {
return;
}
setTimestampAfterSaving(aFile);
}
/**
* Insert the method's description here. Creation date: (12/08/00 4:50:32 PM)
*
* @param newUriConverter
* org.eclipse.emf.ecore.resource.URIConverter
*/
public void setUriConverter(org.eclipse.emf.ecore.resource.URIConverter newUriConverter) {
uriConverter = newUriConverter;
}
protected boolean shouldExpand(Archive anArchive) {
int flag = 0;
if (anArchive.isWARFile())
flag = Archive.EXPAND_WAR_FILES;
else if (anArchive.isEARFile())
flag = Archive.EXPAND_EAR_FILES;
else if (anArchive.isRARFile())
flag = Archive.EXPAND_RAR_FILES;
else if (anArchive.isEJBJarFile())
flag = Archive.EXPAND_EJBJAR_FILES;
else if (anArchive.isApplicationClientFile())
flag = Archive.EXPAND_APPCLIENT_FILES;
else
flag = Archive.EXPAND_ARCHIVES;
return (getExpansionFlags() & flag) != 0;
}
protected boolean shouldIterateOver(Archive anArchive) {
return super.shouldIterateOver(anArchive) || shouldExpand(anArchive);
}
}