ExtractCommandExecutor.java

package cn.bluejoe.elfinder.controller.executors;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.json.JSONObject;

import cn.bluejoe.elfinder.controller.executor.AbstractJsonCommandExecutor;
import cn.bluejoe.elfinder.controller.executor.FsItemEx;
import cn.bluejoe.elfinder.service.FsService;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.io.IwcmFile;
import sk.iway.iwcm.io.IwcmOutputStream;
import sk.iway.iwcm.system.zip.ZipEntry;
import sk.iway.iwcm.system.zip.ZipInputStream;
import sk.iway.iwcm.users.UsersDB;

/**
 *  ExtractCommandExecutor.java
 *
 *@Title        webjet8
 *@Company      Interway s.r.o. (www.interway.sk)
 *@Copyright    Interway s.r.o. (c) 2001-2015
 *@author       $Author: jeeff suchy $
 *@version      $Revision: 1.3 $
 *@created      Date: Sep 22, 2015 12:34:02 PM
 *@modified     $Date: 2004/08/16 06:26:11 $
 */
public class ExtractCommandExecutor extends AbstractJsonCommandExecutor
{
	@Override
	public void execute(FsService fsService, HttpServletRequest request, ServletContext servletContext, JSONObject json)
			throws Exception
	{
		String target = request.getParameter("target");

		FsItemEx fsi = super.findItem(fsService, target);
		Prop prop = Prop.getInstance(request);
		Identity user = sk.iway.iwcm.system.elfinder.FsService.getCurrentUser();
		if (user!=null && UsersDB.isFolderWritable(user.getWritableFolders(), fsi.getPath()))
		{
			String zipFile = fsi.getPath();

			FsItemEx makedir = null;
			if ("1".equals(request.getParameter("makedir")))
			{
				// outputFolder += "/unzip-"+Tools.getNow();
				fsi = new FsItemEx(fsi.getParent(), "unzip-"+Tools.getNow()+"/"+fsi.getName());
				fsi.getParent().createFolder();
				makedir = fsi.getParent();
			}

			String outputFolder = fsi.getParent().getPath().replace(".zip", "");

			List<FsItemEx> added = unZipFile(zipFile, outputFolder, fsi);
			if (makedir != null) added.add(0, makedir);

			json.put("added", files2JsonArray(request, added));
		}
		else
		{
			json.put("error", prop.getText("components.elfinder.commands.extract.error", fsi.getPath()));
			json.put("added", new Object[] {});
		}


	}

	public static List<String> getAllowedTypes()
	{
		return Arrays.asList(
					"application/zip"
					);
	}

	protected List<FsItemEx> unZipFile(String zipFile, String outputFolder, FsItemEx fsi)
	{
		Logger.debug(this.getClass(), "unzipFile, outputFolder="+outputFolder);

		List<FsItemEx> added = new ArrayList<FsItemEx>();

		byte[] buffer = new byte[64000];
		try
		{
			IwcmFile folder = new IwcmFile(sk.iway.iwcm.Tools.getRealPath(outputFolder));
			if(!folder.exists()){
				folder.mkdir();
			}
			ZipInputStream zis = new ZipInputStream(new FileInputStream(sk.iway.iwcm.Tools.getRealPath(zipFile)));
			ZipEntry ze = zis.getNextEntry();

			Set<String> allreadyAddedFolders = new HashSet<String>();

			while(ze != null)
			{
				String fileName = ze.getName();
				Logger.debug(this.getClass(), "ZE fileName="+fileName);
				IwcmFile newFile = new IwcmFile(folder.getPath() + File.separator + fileName);

				if (newFile.getParentFile().exists()==false)
				{
					new IwcmFile(newFile.getParent()).mkdirs();
					if (ze.getName().indexOf("/")>1)
					{
						//je tam indexOf namiesto lastIndexOf lebo chceme tam pridat len root priecinky a nie tie posledne
						String folderName = ze.getName().substring(0, ze.getName().indexOf("/"));
						if (allreadyAddedFolders.contains(folderName)==false)
						{
							allreadyAddedFolders.add(folderName);
							FsItemEx addedFile = new FsItemEx(fsi.getParent(), folderName);
							added.add(addedFile);
						}
					}
				}

				if (ze.isDirectory())
				{
					newFile.mkdirs();
					FsItemEx addedFile = new FsItemEx(fsi.getParent(), ze.getName());
					added.add(addedFile);
				}
				else
				{
					IwcmOutputStream fos = new IwcmOutputStream(newFile);

					int len;
					while ((len = zis.read(buffer)) > 0)
					{
						fos.write(buffer, 0, len);
					}
					fos.close();
				}

				FsItemEx addedFile = new FsItemEx(fsi.getParent(), ze.getName());
				added.add(addedFile);

				ze = zis.getNextEntry();
			}

			zis.closeEntry();
			zis.close();
		}
		catch(IOException ex)
		{
			sk.iway.iwcm.Logger.error(ex);
		}
		return added;
	}
}