blob: b705d0ae34d0f0902355cea2485665eaaf387d87 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2006 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.operations;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
import org.eclipse.jst.j2ee.commonarchivecore.internal.exception.SaveFailureException;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveManifest;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.SaveStrategy;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.SaveStrategyImpl;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
import org.eclipse.wst.common.componentcore.internal.operation.CreateReferenceComponentsDataModelProvider;
import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
/**
* @deprecated this will be deleted post WTP 3.2. This code is no longer
* called because the IArchive API is used to handle imports.
*
* @author jsholl
*/
public abstract class ComponentSaveStrategyImpl extends SaveStrategyImpl {
protected IDataModel dataModel;
protected IVirtualComponent vComponent;
protected IOverwriteHandler overwriteHandler;
protected IProgressMonitor progressMonitor;
private String archiveComponentsDeployPath;
private List archiveComponents;
private Map archiveComponentURIMap;
private Map archiveComponentDeployPathMap;
public ComponentSaveStrategyImpl(IVirtualComponent vComponent) {
super();
if (null == vComponent) {
throw new NullPointerException();
}
this.vComponent = vComponent;
}
public void setDataModel(IDataModel dataModel) {
this.dataModel = dataModel;
}
public void setOverwriteHandler(IOverwriteHandler newOverwriteHandler) {
overwriteHandler = newOverwriteHandler;
}
public void setProgressMonitor(IProgressMonitor newProgressMonitor) {
progressMonitor = newProgressMonitor;
}
protected void validateEdit(IFile aFile) {
if (overwriteHandler == null)
return;
if (!(aFile.exists() && aFile.isReadOnly()))
return;
overwriteHandler.validateEdit(aFile);
}
protected boolean shouldOverwrite(String uri) {
if (overwriteHandler.isOverwriteNone())
return false;
return (overwriteHandler.isOverwriteResources() || overwriteHandler.isOverwriteAll() || overwriteHandler.shouldOverwrite(uri));
}
@Override
protected SaveStrategy createNestedSaveStrategy(Archive anArchive) throws IOException {
return null;
}
@Override
protected OutputStream getOutputStreamForResource(Resource aResource) throws IOException {
// this method has no references in the hirarchy
return null;
}
@Override
protected void saveFiles() throws SaveFailureException {
super.saveFiles();
linkArchiveComponents();
}
@Override
public void save(File aFile, InputStream in) throws SaveFailureException {
try {
progressMonitor.subTask(aFile.getURI());
IPath projectRelativePath = getOutputPathForFile(aFile);
if (aFile.isArchive()) {
saveAsArchiveComponent((Archive) aFile, projectRelativePath, in);
} else if (!aFile.isDirectoryEntry()) {
saveToOutputPath(projectRelativePath, in);
} else {
createDirectory(projectRelativePath);
}
} catch (OverwriteHandlerException ohe) {
throw ohe;
} catch (Exception e) {
String errorString = EJBArchiveOpsResourceHandler.ARCHIVE_OPERATION_SaveFile + aFile.getName();
throw new SaveFailureException(errorString, e);
} finally {
progressMonitor.worked(1);
}
}
//TODO this should be renamed to getProjectRelativePath
/**
* Returns the project relative path for where the specified file should be
* saved.
*
* @param aFile
* @return
*/
protected IPath getOutputPathForFile(File aFile) {
String uri = aFile.getURI();
IFile iFile = null;
if(uri.startsWith(IModuleConstants.DOT_SETTINGS)){
iFile = vComponent.getProject().getFile(new Path(uri));
}else {
IVirtualFolder rootFolder = vComponent.getRootFolder();
IVirtualFile vFile = rootFolder.getFile(aFile.getURI());
iFile = vFile.getUnderlyingFile();
}
return iFile.getProjectRelativePath();
}
//TODO This isn't referenced in WTP it should be deleted.
/**
* @deprecated
*/
protected void saveToWorkbenchPath(IPath workbenchPath, InputStream in) throws Exception {
IFile iFile = ResourcesPlugin.getWorkspace().getRoot().getFile(workbenchPath);
saveToIFile(iFile, in);
}
/**
* Creates the IFolder specified by the project relative path.
*
* @param projectRelativePath
* @throws CoreException
*/
protected void createDirectory(IPath projectRelativePath) throws CoreException {
IFolder iFolder = vComponent.getProject().getFolder(projectRelativePath);
if (!iFolder.exists()) {
mkdirs(iFolder);
}
}
/**
* Creates the specified IFolder
*
* @param folder
* @throws CoreException
*/
protected void mkdirs(IFolder folder) throws CoreException {
IContainer container = folder.getParent();
if (!container.exists()) {
mkdirs((IFolder) container);
}
folder.create(true, true, null);
}
/**
* Save the specified Archive to the specified project relative path
* using the passed input stream.
*
* @param archive
* @param projectRelativePath
* @param in
* @throws Exception
*/
protected void saveAsArchiveComponent(Archive archive, IPath projectRelativePath, InputStream in) throws Exception {
IFile iFile = saveToOutputPath(projectRelativePath, in);
//TODO investigate removing this block and related variables and linkArchiveComponents(); see bugzilla 159160
if (shouldLinkAsComponentRef(archive)) {
IVirtualComponent archiveComponent = ComponentCore.createArchiveComponent(vComponent.getProject(), VirtualArchiveComponent.LIBARCHIVETYPE + iFile.getFullPath().toString());
if (archiveComponents == null) {
archiveComponents = new ArrayList();
archiveComponentURIMap = new HashMap();
archiveComponentDeployPathMap = new HashMap();
archiveComponentsDeployPath = IPath.SEPARATOR + (new Path(archive.getURI())).removeLastSegments(1).toString();
}
archiveComponents.add(archiveComponent);
archiveComponentURIMap.put(archiveComponent, iFile.getName());
archiveComponentDeployPathMap.put(archiveComponent, IPath.SEPARATOR + (new Path(archive.getURI())).removeLastSegments(1).toString());
}
}
protected boolean shouldLinkAsComponentRef(Archive archive) {
return false;
}
protected void linkArchiveComponents() {
if (archiveComponents != null && archiveComponents.size() > 0) {
IDataModel createReferencesDataModel = DataModelFactory.createDataModel(new CreateReferenceComponentsDataModelProvider());
createReferencesDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.SOURCE_COMPONENT, vComponent);
createReferencesDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH, archiveComponentsDeployPath);
createReferencesDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH_MAP, archiveComponentDeployPathMap);
createReferencesDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, archiveComponents);
createReferencesDataModel.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP, archiveComponentURIMap);
try {
createReferencesDataModel.getDefaultOperation().execute(null, null);
} catch (ExecutionException e) {
J2EEPlugin.logError(e);
}
}
}
/**
* Saves to the specified project relative output path.
*
* @param projectRelativePath
* @param in
* @throws Exception
*/
protected IFile saveToOutputPath(IPath projectRelativePath, InputStream in) throws Exception {
IFile iFile = vComponent.getProject().getFile(projectRelativePath);
saveToIFile(iFile, in);
return iFile;
}
protected void saveToIFile(IFile iFile, InputStream in) throws Exception {
validateEdit(iFile);
if (iFile.exists())
iFile.setContents(in, true, true, null);
else {
mkdirs(iFile.getFullPath().removeLastSegments(1), ResourcesPlugin.getWorkspace().getRoot());
iFile.create(in, true, null);
}
}
protected void mkdirs(IPath path, IWorkspaceRoot root) throws CoreException {
if (path.segmentCount() <= 1)
return;
IFolder folder = root.getFolder(path);
if (!folder.exists()) {
mkdirs(path.removeLastSegments(1), root);
folder.create(true, true, null);
}
}
public void save(ArchiveManifest aManifest) throws SaveFailureException {
}
}