// Path: src/main/java/org/grapheco/elfinder/service/FsItemFilter.java
// public interface FsItemFilter
// {
// 	// TODO: bad designs: FsItemEx should not used here
// 	// top level interfaces should only know FsItem instead of FsItemEx
// 	public boolean accepts(FsItemEx item);
// }
// 
// Path: src/main/java/org/grapheco/elfinder/service/FsService.java
// public interface FsService
// {
// 	FsItem fromHash(String hash) throws IOException;
// 
// 	String getHash(FsItem item) throws IOException;
// 
// 	FsSecurityChecker getSecurityChecker();
// 
// 	String getVolumeId(FsVolume volume);
// 
// 	FsVolume[] getVolumes();
// 
// 	FsServiceConfig getServiceConfig();
// 
// 	/**
// 	 * find files by name pattern, this provides a simple recursively iteration
// 	 * based method lucene engines can be introduced to improve it! This
// 	 * searches across all volumes.
// 	 *
// 	 * @param filter
// 	 *            The filter to apply to select files.
// 	 * @return A collection of files that match the filter and gave the root as
// 	 *         a parent.
// 	 */
// 	// TODO: bad designs: FsItemEx should not used here top level interfaces
// 	// should only know FsItem instead of FsItemEx
// 	FsItemEx[] find(FsItemFilter filter);
// }
// 
// Path: src/main/java/org/grapheco/elfinder/util/FsItemFilterUtils.java
// public abstract class FsItemFilterUtils
// {
// 	public static FsItemFilter FILTER_ALL = new FsItemFilter()
// 	{
// 		@Override
// 		public boolean accepts(FsItemEx item)
// 		{
// 			return true;
// 		}
// 	};
// 
// 	public static FsItemFilter FILTER_FOLDER = new FsItemFilter()
// 	{
// 		@Override
// 		public boolean accepts(FsItemEx item)
// 		{
// 			return item.isFolder();
// 		}
// 	};
// 
// 	public static FsItemFilter createFileNameKeywordFilter(final String keyword)
// 	{
// 		return new FsItemFilter()
// 		{
// 			@Override
// 			public boolean accepts(FsItemEx item)
// 			{
// 				return item.getName().contains(keyword);
// 			}
// 		};
// 	}
// 
// 	public static FsItemEx[] filterFiles(FsItemEx[] sourceFiles,
// 			FsItemFilter filter)
// 	{
// 		List<FsItemEx> filtered = new ArrayList<FsItemEx>();
// 		for (FsItemEx file : sourceFiles)
// 		{
// 			if (filter.accepts(file))
// 				filtered.add(file);
// 		}
// 
// 		return filtered.toArray(new FsItemEx[0]);
// 	}
// 
// 	/**
// 	 * returns a FsItemFilter according to given mimeFilters
// 	 * 
// 	 * @param mimeFilters
// 	 *            An array of MIME types, if <code>null</code> no filtering is
// 	 *            done
// 	 * @return A filter that only accepts the supplied MIME types.
// 	 */
// 	public static FsItemFilter createMimeFilter(final String[] mimeFilters)
// 	{
// 		if (mimeFilters == null || mimeFilters.length == 0)
// 			return FILTER_ALL;
// 
// 		return new FsItemFilter()
// 		{
// 			@Override
// 			public boolean accepts(FsItemEx item)
// 			{
// 				String mimeType = item.getMimeType().toUpperCase();
// 
// 				for (String mf : mimeFilters)
// 				{
// 					mf = mf.toUpperCase();
// 					if (mimeType.startsWith(mf + "/") || mimeType.equals(mf))
// 						return true;
// 				}
// 				return false;
// 			}
// 		};
// 	}
// 
// }
// 
// Path: src/main/java/org/grapheco/elfinder/util/FsServiceUtils.java
// public abstract class FsServiceUtils
// {
// 	public static FsItemEx findItem(FsService fsService, String hash)
// 			throws IOException
// 	{
// 		FsItem fsi = fsService.fromHash(hash);
// 		if (fsi == null)
// 		{
// 			return null;
// 		}
// 
// 		return new FsItemEx(fsi, fsService);
// 	}
// }


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.grapheco.elfinder.service.FsItemFilter;
import org.grapheco.elfinder.service.FsService;
import org.grapheco.elfinder.util.FsItemFilterUtils;
import org.grapheco.elfinder.util.FsServiceUtils;

	protected void createAndCopyFile(FsItemEx src, FsItemEx dst)
			throws IOException
	{
		dst.createFile();
		InputStream is = src.openInputStream();
		dst.writeStream(is);
	}

	protected void createAndCopyFolder(FsItemEx src, FsItemEx dst)
			throws IOException
	{
		dst.createFolder();

		for (FsItemEx c : src.listChildren())
		{
			if (c.isFolder())
			{
				createAndCopyFolder(c, new FsItemEx(dst, c.getName()));
			}
			else
			{
				createAndCopyFile(c, new FsItemEx(dst, c.getName()));
			}
		}
	}

	@Override
	public void execute(CommandExecutionContext ctx) throws Exception
	{
// Path: src/main/java/org/grapheco/elfinder/service/FsItemFilter.java
// public interface FsItemFilter
// {
// 	// TODO: bad designs: FsItemEx should not used here
// 	// top level interfaces should only know FsItem instead of FsItemEx
// 	public boolean accepts(FsItemEx item);
// }
// 
// Path: src/main/java/org/grapheco/elfinder/service/FsService.java
// public interface FsService
// {
// 	FsItem fromHash(String hash) throws IOException;
// 
// 	String getHash(FsItem item) throws IOException;
// 
// 	FsSecurityChecker getSecurityChecker();
// 
// 	String getVolumeId(FsVolume volume);
// 
// 	FsVolume[] getVolumes();
// 
// 	FsServiceConfig getServiceConfig();
// 
// 	/**
// 	 * find files by name pattern, this provides a simple recursively iteration
// 	 * based method lucene engines can be introduced to improve it! This
// 	 * searches across all volumes.
// 	 *
// 	 * @param filter
// 	 *            The filter to apply to select files.
// 	 * @return A collection of files that match the filter and gave the root as
// 	 *         a parent.
// 	 */
// 	// TODO: bad designs: FsItemEx should not used here top level interfaces
// 	// should only know FsItem instead of FsItemEx
// 	FsItemEx[] find(FsItemFilter filter);
// }
// 
// Path: src/main/java/org/grapheco/elfinder/util/FsItemFilterUtils.java
// public abstract class FsItemFilterUtils
// {
// 	public static FsItemFilter FILTER_ALL = new FsItemFilter()
// 	{
// 		@Override
// 		public boolean accepts(FsItemEx item)
// 		{
// 			return true;
// 		}
// 	};
// 
// 	public static FsItemFilter FILTER_FOLDER = new FsItemFilter()
// 	{
// 		@Override
// 		public boolean accepts(FsItemEx item)
// 		{
// 			return item.isFolder();
// 		}
// 	};
// 
// 	public static FsItemFilter createFileNameKeywordFilter(final String keyword)
// 	{
// 		return new FsItemFilter()
// 		{
// 			@Override
// 			public boolean accepts(FsItemEx item)
// 			{
// 				return item.getName().contains(keyword);
// 			}
// 		};
// 	}
// 
// 	public static FsItemEx[] filterFiles(FsItemEx[] sourceFiles,
// 			FsItemFilter filter)
// 	{
// 		List<FsItemEx> filtered = new ArrayList<FsItemEx>();
// 		for (FsItemEx file : sourceFiles)
// 		{
// 			if (filter.accepts(file))
// 				filtered.add(file);
// 		}
// 
// 		return filtered.toArray(new FsItemEx[0]);
// 	}
// 
// 	/**
// 	 * returns a FsItemFilter according to given mimeFilters
// 	 * 
// 	 * @param mimeFilters
// 	 *            An array of MIME types, if <code>null</code> no filtering is
// 	 *            done
// 	 * @return A filter that only accepts the supplied MIME types.
// 	 */
// 	public static FsItemFilter createMimeFilter(final String[] mimeFilters)
// 	{
// 		if (mimeFilters == null || mimeFilters.length == 0)
// 			return FILTER_ALL;
// 
// 		return new FsItemFilter()
// 		{
// 			@Override
// 			public boolean accepts(FsItemEx item)
// 			{
// 				String mimeType = item.getMimeType().toUpperCase();
// 
// 				for (String mf : mimeFilters)
// 				{
// 					mf = mf.toUpperCase();
// 					if (mimeType.startsWith(mf + "/") || mimeType.equals(mf))
// 						return true;
// 				}
// 				return false;
// 			}
// 		};
// 	}
// 
// }
// 
// Path: src/main/java/org/grapheco/elfinder/util/FsServiceUtils.java
// public abstract class FsServiceUtils
// {
// 	public static FsItemEx findItem(FsService fsService, String hash)
// 			throws IOException
// 	{
// 		FsItem fsi = fsService.fromHash(hash);
// 		if (fsi == null)
// 		{
// 			return null;
// 		}
// 
// 		return new FsItemEx(fsi, fsService);
// 	}
// }


// Path: src/main/java/org/grapheco/elfinder/controller/executor/AbstractCommandExecutor.java
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.grapheco.elfinder.service.FsItemFilter;
import org.grapheco.elfinder.service.FsService;
import org.grapheco.elfinder.util.FsItemFilterUtils;
import org.grapheco.elfinder.util.FsServiceUtils;


	protected void createAndCopyFile(FsItemEx src, FsItemEx dst)
			throws IOException
	{
		dst.createFile();
		InputStream is = src.openInputStream();
		dst.writeStream(is);
	}

	protected void createAndCopyFolder(FsItemEx src, FsItemEx dst)
			throws IOException
	{
		dst.createFolder();

		for (FsItemEx c : src.listChildren())
		{
			if (c.isFolder())
			{
				createAndCopyFolder(c, new FsItemEx(dst, c.getName()));
			}
			else
			{
				createAndCopyFile(c, new FsItemEx(dst, c.getName()));
			}
		}
	}

	@Override
	public void execute(CommandExecutionContext ctx) throws Exception
	{
		FsService fileService = ctx.getFsServiceFactory().getFileService(