blob: 19b1dcc5ea280b6171524dd65eeae6865a4a7f16 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation, WSO2 Inc. 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:
* WSO2 Inc. - initial API and implementation
* yyyymmdd bug Email and other contact information
* -------- -------- -----------------------------------------------------------
* IBM Corporation, WSO2 Inc. - initial API and implementation
* WSO2 Inc. - initial extended API and implementation
* 20070213 168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2
* facet to the framework for 168766
* 20070426 183046 sandakith@wso2.com - Lahiru Sandakith
* 20070606 177421 sandakith@wso2.com - fix web.xml wiped out when Axis2 facet
* 20070808 194906 sandakith@wso2.com - Lahiru Sandakith, Fixing 194906 Runtime lib issue
* 20070813 196173 sandakith@wso2.com - Lahiru Sandakith, Fix 196173, DWP custom location fix
* 20080616 237363 samindaw@wso2.com - Saminda Wijeratne, get ResourceContext from environment instead of preference
*******************************************************************************/
package org.eclipse.jst.ws.axis2.facet.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
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.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.ws.axis2.core.plugin.messages.Axis2CoreUIMessages;
import org.eclipse.jst.ws.internal.plugin.WebServicePlugin;
import org.eclipse.osgi.util.NLS;
import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
import org.eclipse.wst.command.internal.env.core.context.ResourceContext;
import org.eclipse.wst.command.internal.env.eclipse.BaseEclipseEnvironment;
import org.eclipse.wst.common.environment.IEnvironment;
public class ContentCopyUtils {
private static IWorkspaceRoot root_ = null;
private static IWorkspace workspace_ = null;
private List fileAndDirectoriesList = new ArrayList();
FileInputStream finStream = null;
private List checkList = null;
private IEnvironment environment;
public ContentCopyUtils(IEnvironment env){
environment = env;
}
/**
* This method will copy the source directory into the eclipse workspace
* according to the Eclipse Framework API
* @param sourceDir
* @param destinationDir
* @param monitor
* @param statusHandler
* @return IStatus : Status of the operation
*/
public IStatus copyDirectoryRecursivelyIntoWorkspace(String sourceDir,
String destinationDir,IProgressMonitor monitor, boolean includeListSet) {
IStatus status = Status.OK_STATUS;
//First of all clear the content in the targeted list
fileAndDirectoriesList.clear();
File axis2WebappFolder = new File(sourceDir);
if (includeListSet) {
visitAllDirsAndFilesWithIncludeList(axis2WebappFolder,checkList);
}else{
visitAllDirsAndFilesWithIgnoreList(axis2WebappFolder,checkList);
}
List deployFiles = new ArrayList();
deployFiles= fileAndDirectoriesList;
try {
//Import the axis2 dependency plugin according to the Resources API of eclipse
ResourceContext context;
if (environment==null)
context = WebServicePlugin.getInstance().getResourceContext();
else
context = ((BaseEclipseEnvironment) environment).getResourceContext();
IPath outputPath = new Path (destinationDir);
String fileName;
IPath targetPath=null;
boolean isDirectory = false;
String deployFile;
Iterator iterator;
String tempOutputDir = axis2WebappFolder.toString();
iterator = deployFiles.iterator();
while (iterator.hasNext()) {
deployFile = (String) iterator.next();
File source = new File(deployFile);
if (source.isDirectory()) {
isDirectory =true;
}else{
isDirectory=false;
finStream = new FileInputStream(source);
}
if (deployFile.startsWith(tempOutputDir)) {
fileName = deployFile.substring(tempOutputDir.length());
targetPath = outputPath.append(fileName).makeAbsolute();
if (isDirectory){
makeFolderPathAtLocation(context,
targetPath,
monitor);
}else{
if (finStream != null) {
createFileAtLocation(context,
targetPath,
finStream,
monitor);
}
finStream.close();
}
}
}
} catch (IOException e) {
status = StatusUtils.errorStatus(
NLS.bind(Axis2CoreUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
new String[]{e.getLocalizedMessage()}), e);
} catch (CoreException e) {
status = StatusUtils.errorStatus(
NLS.bind(Axis2CoreUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
new String[]{e.getLocalizedMessage()}), e);
}
return status;
}
public void updateCheckList(List list){
checkList = list;
}
/**
* Load the list with directory contents (files/folders) excluding the ignore list
* @param dir
* @param ignoreList
*/
private void visitAllDirsAndFilesWithIgnoreList(File dir, List ignoreList) {
if(!checkCheckListHit(dir,ignoreList)){
fileAndDirectoriesList.add(dir.getAbsolutePath());
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
visitAllDirsAndFilesWithIgnoreList(new File(dir, children[i]),ignoreList);
}
}
}
}
/**
* Load the list with directory contents (files/folders) only match with the include list
* @param dir
* @param includeList
*/
private void visitAllDirsAndFilesWithIncludeList(File dir, List includeList) {
if(checkCheckListHit(dir,includeList)){
fileAndDirectoriesList.add(dir.getAbsolutePath());
}
if (dir.isDirectory()) {
String[] children = dir.list();
for (int i=0; i<children.length; i++) {
visitAllDirsAndFilesWithIncludeList(new File(dir, children[i]),includeList);
}
}
}
/**
* Check the <code>file</code> pass in, matches a file in the <code>list</code>
* @param file
* @param list
* @return result of the check
*/
private boolean checkCheckListHit(File file, List list){
if(list != null){
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String elem = (String) iterator.next();
if(elem.equals(file.getAbsoluteFile().toString())){
return true;
}
}
}
return false;
}
private static IFolder makeFolder (
ResourceContext resourceContext,
IContainer parent,
String folderName,
IProgressMonitor progressMonitor )
throws CoreException
{
IResource child = parent.findMember(folderName);
if( child == null )
{
IFolder folder = parent.getFolder(new Path(folderName));
folder.create(true,true,null);
return folder;
}
else if( child.getType() == IResource.FOLDER )
{
return (IFolder)child;
}
else
{
throw new CoreException(
new Status( IStatus.ERROR,
"ResourceUtils",
0,
NLS.bind("ERROR",//EnvironmentMessages.MSG_ERROR_RESOURCE_NOT_FOLDER,
new Object[]{ parent.getFullPath().append(folderName).toString() }),
null ) );
}
}
public static IContainer makeFolderPathAtLocation (
ResourceContext resourceContext,
IContainer resource,
IProgressMonitor progressMonitor )
throws CoreException
{
if (resource.exists())
{
if (resource instanceof IContainer)
{
return (IContainer) resource;
}
else
{
throw new CoreException(
new Status( IStatus.ERROR,
"ResourceUtils",
0,
NLS.bind("ERROR",
new Object[]{ resource.getFullPath().toString() }),
null ) );
}
}
else
{
IContainer parent = makeFolderPathAtLocation(resourceContext,
resource.getParent(),
progressMonitor );
String folderName = resource.getName();
return makeFolder(resourceContext, parent, folderName, progressMonitor );
}
}
/**
* Creates a path of folders.
* Do not call with an absolutePath of less than one segment.
* @param resourceContext the resource context for making folders.
* @param absolutePath the path of folders that will be created.
* @param progressMonitor the progress monitor to be used.
* @param statusHandler the status handler.
* @return returns the IContainer of the created folder.
*/
public static IContainer makeFolderPathAtLocation (
ResourceContext resourceContext,
IPath absolutePath,
IProgressMonitor progressMonitor )
throws CoreException
{
return makeFolderPathAtLocation(resourceContext,
getWorkspaceRoot().getContainerForLocation(absolutePath),
//getWorkspaceRoot().getContainerForLocation(new Path("/home/sandakith/temp/Test/Test/WebContent")),
//"/home/sandakith/Eclipse_Workspace/workspace/testThis"
progressMonitor);
}
public static IWorkspaceRoot getWorkspaceRoot ()
{
if (root_ == null)
{
root_ = ResourcesPlugin.getWorkspace().getRoot();
}
return root_;
}
public static IFile createFileAtLocation (
ResourceContext resourceContext,
IPath absolutePath,
InputStream inputStream,
IProgressMonitor progressMonitor )
throws CoreException
{
if (!absolutePath.isAbsolute())
{
throw new CoreException(new Status(IStatus.ERROR, "ResourceUtils",0,
NLS.bind("ERROR",//EnvironmentMessages.MSG_ERROR_PATH_NOT_ABSOLUTE,
new Object[] {absolutePath.toString()}),null));
}
if (absolutePath.segmentCount() < 1)
{
throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,
NLS.bind("ERROR",//EnvironmentMessages.MSG_ERROR_PATH_EMPTY,
new Object[] {absolutePath.toString()}),null));
}
if (absolutePath.segmentCount() < 2)
{
throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,
NLS.bind("ERROR",//EnvironmentMessages.MSG_ERROR_PATH_NOT_FOLDER,
new Object[] {absolutePath.toString()}),null));
}
IContainer parent = makeFolderPathAtLocation(resourceContext,
absolutePath.removeLastSegments(1), progressMonitor);
String fileName = absolutePath.lastSegment();
return makeFile(resourceContext, parent, fileName, inputStream, progressMonitor);
}
private static IFile makeFile (
ResourceContext resourceContext,
IContainer parent,
String fileName,
InputStream inputStream,
IProgressMonitor progressMonitor )
throws CoreException
{
IResource child = parent.findMember(fileName);
if( child != null )
{
if( child.getType() == IResource.FILE )
{
//We have permission to overwrite so check if file is read-only
if(child.getResourceAttributes()!=null &&
child.getResourceAttributes().isReadOnly() )
{
IFile[] files = new IFile[1];
files[0] = (IFile)child;
}
//Change the contents of the existing file.
IFile file = parent.getFile( new Path(fileName) );
file.setContents( inputStream, true, true, null );
return file;
}
else
{
throw new CoreException(
new Status( IStatus.ERROR,
"ResourceUtils",
0,
NLS.bind("ERROR",
new Object[] {parent.getFullPath().append(fileName)}),
null ) );
}
}
else
{
//Create a new file.
IFile file = parent.getFile( new Path(fileName) );
file.create( inputStream, true, null);
return file;
}
}
public static IWorkspace getWorkspace ()
{
if (workspace_ == null)
{
if (root_ == null)
{
root_ = ResourcesPlugin.getWorkspace().getRoot();
}
workspace_ = root_.getWorkspace();
}
return workspace_;
}
}