/*******************************************************************************
* Copyright (c) 2007 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.seam.internal.core.project.facet;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.tools.ant.types.FilterSetCollection;
import org.apache.tools.ant.util.FileUtils;
import org.eclipse.osgi.util.NLS;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.core.SeamCorePlugin;
/**
*
* @author eskimo
*
*/
public class AntCopyUtils {
public static class FileSet {
File dir = null;
List<Pattern> include = new ArrayList<Pattern>();
List<Pattern> exclude = new ArrayList<Pattern>();
public FileSet(String dir) {
this.dir = new File(dir);
}
public FileSet(File dir) {
this.dir = dir;
}
public FileSet(FileSet template) {
addTemplate(template);
}
public void addTemplate(FileSet template){
include.addAll(template.getIncluded());
exclude.addAll(template.getExcluded());
}
public FileSet() {
}
public FileSet add(FileSet set) {
addTemplate(set);
return this;
}
public FileSet dir(String dir) {
this.dir = new File(dir);
return this;
}
public FileSet dir(File dir) {
this.dir = dir;
return this;
}
public FileSet include(String pattern) {
include.add(Pattern.compile(pattern));
return this;
}
public FileSet exclude(String pattern) {
exclude.add(Pattern.compile(pattern));
return this;
}
public boolean isIncluded(String file) {
int i = dir.getAbsolutePath().length()+1;
String relatedPath = file.substring(i);
for (Pattern pattern : include) {
if(pattern.matcher(relatedPath.replace('\\', '/')).matches() ) {
return !isExcluded(relatedPath);
}
}
return false;
}
public boolean isExcluded(String file){
for (Pattern pattern : exclude) {
if(pattern.matcher(file.replace('\\', '/')).matches()) return true;
}
return false;
}
public List<Pattern> getExcluded() {
return Collections.unmodifiableList(exclude);
}
public List<Pattern> getIncluded() {
return Collections.unmodifiableList(include);
}
/**
* @return
*/
public File getDir() {
return dir;
}
}
public static class FileSetFileFilter implements FileFilter {
FileSet set;
public FileSetFileFilter(FileSet set) {
this.set = set;
}
public boolean accept(File pathname){
return set.isIncluded(pathname.getAbsolutePath());
}
}
public static void copyFilesAndFolders(File sourceFolder, File destinationFolder, FilterSetCollection set, boolean override) {
copyFilesAndFolders(sourceFolder, destinationFolder,null, set, override);
}
public static void copyFilesAndFolders(File sourceFolder, File destinationFolder,
AntCopyUtils.FileSetFileFilter fileSetFilter,
FilterSetCollection filterSetCollection, boolean override) {
if(!sourceFolder.exists()) {
throw new IllegalArgumentException(NLS.bind(SeamCoreMessages.ANT_COPY_UTILS_COPY_FAILED,sourceFolder));
}
File[] files = fileSetFilter==null?sourceFolder.listFiles():sourceFolder.listFiles(fileSetFilter);
if(files==null) {
if(fileSetFilter==null) {
throw new IllegalArgumentException(NLS.bind(SeamCoreMessages.ANT_COPY_UTILS_COULD_NOT_FIND_FOLDER,sourceFolder));
}
}
for (File file : files) {
if(file.isDirectory()) {
copyFilesAndFolders(file,new File(destinationFolder,file.getName()),fileSetFilter,filterSetCollection,override);
} else {
try {
if(!destinationFolder.exists())
destinationFolder.mkdirs();
FileUtils.getFileUtils().copyFile(file, new File(destinationFolder,file.getName()),filterSetCollection,override);
} catch (IOException e) {
SeamCorePlugin.getPluginLog().logError(e);
}
}
}
if(files.length==0 && !destinationFolder.exists()) {
destinationFolder.mkdir();
}
}
public static void copyFileToFolder(File source, File dest, boolean override) {
copyFileToFolder(source, dest,new FilterSetCollection(),override);
}
public static void copyFileToFolder(File source, File dest, FilterSetCollection filterSetCollection, boolean override ) {
try {
File destFile = new File(dest,source.getName());
if(!source.getCanonicalPath().equals(destFile.getCanonicalPath())) {
FileUtils.getFileUtils().copyFile(source, destFile ,filterSetCollection,override);
}
} catch (IOException e) {
SeamCorePlugin.getPluginLog().logError(e);
}
}
public static void copyFileToFile(File source, File dest, FilterSetCollection filterSetCollection, boolean override ) {
try {
FileUtils.getFileUtils().copyFile(source, dest,filterSetCollection,override);
} catch (IOException e) {
SeamCorePlugin.getPluginLog().logError(e);
}
}
public static void copyFiles(File source, File dest, FileFilter filter, boolean override) {
dest.mkdir();
File[] listFiles = source.listFiles(filter);
if(listFiles==null) {
throw new IllegalArgumentException(NLS.bind(SeamCoreMessages.ANT_COPY_UTILS_COULD_NOT_FIND_FOLDER,source));
}
for (File file:listFiles) {
if(file.isDirectory())continue;
try {
FileUtils.getFileUtils().copyFile(file, new File(dest, file.getName()), new FilterSetCollection(), override);
} catch (IOException e) {
SeamCorePlugin.getPluginLog().logError(e);
}
}
}
public static void copyFiles(File source, File dest, FileFilter filter) {
copyFiles(source, dest, filter, true);
}
public static void copyFiles(String[] files, File dest) {
copyFiles(files,dest, true);
}
public static void copyFiles(String[] files, File dest,boolean override) {
for (String fileName : files) {
File file = new File(fileName);
if(file.exists() && file.isFile()) {
copyFileToFolder(file, dest, null, override);
} else {
try {
SeamCorePlugin.getPluginLog().logError(NLS.bind(SeamCoreMessages.ANT_COPY_UTILS_CANNOT_COPY_JDBC_DRIVER_JAR,file.getCanonicalPath()));
} catch (IOException e) {
SeamCorePlugin.getPluginLog().logError(e);
}
}
}
}
}