PasteCommandExecutor.java
package cn.bluejoe.elfinder.controller.executors;
import java.util.ArrayList;
import java.util.List;
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.Constants;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.doc.DocDB;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.system.UrlRedirectDB;
import sk.iway.iwcm.system.elfinder.FolderPropertiesService;
import sk.iway.iwcm.system.elfinder.IwcmDocGroupFsVolume;
import sk.iway.iwcm.users.UsersDB;
public class PasteCommandExecutor extends AbstractJsonCommandExecutor
{
@Override
public void execute(FsService fsService, HttpServletRequest request, ServletContext servletContext, JSONObject json)
throws Exception
{
String[] targets = request.getParameterValues("targets[]");
//String src = request.getParameter("src");
String dst = request.getParameter("dst");
boolean cut = "1".equals(request.getParameter("cut"));
List<FsItemEx> added = new ArrayList<FsItemEx>();
List<String> removed = new ArrayList<String>();
//FsItemEx fsrc = super.findItem(fsService, src);
FsItemEx fdst = super.findItem(fsService, dst);
//skontrolujem prava na zapis do cieloveho adresara
Prop prop = Prop.getInstance(request);
Identity user = sk.iway.iwcm.system.elfinder.FsService.getCurrentUser();
if (user!=null && UsersDB.isFolderWritable(user.getWritableFolders(), fdst.getPath()))
{
for (String target : targets)
{
FsItemEx ftgt = super.findItem(fsService, target);
String name = ftgt.getName();
FsItemEx newFile = new FsItemEx(fdst, name);
//JEEFF: upravene pre podporu nasho DocGroup
if (ftgt.getVolumeId().equals(IwcmDocGroupFsVolume.VOLUME_ID))
{
((IwcmDocGroupFsVolume)ftgt.getVolume()).createAndCopy(ftgt, fdst, cut);
}
else
{
super.createAndCopy(ftgt, newFile, request);
if (cut)
{
if (UsersDB.isFolderWritable(user.getWritableFolders(), ftgt.getParent().getPath()))
{
//#20481 - po vystrihnuti/premenovani vytvori redirect
if(isAllowedFolder(ftgt.getPath(), Constants.getString("elfinderRedirectFolders")))
createRedirect(ftgt, ftgt.getPath(), newFile.getPath(), request);
//ak chcem povodny vymazat, musim mat pravo na zapis aj do zdrojoveho
ftgt.delete();
FolderPropertiesService.deleteFolderProperties(ftgt.getPath(), request);
}
else
{
json.put("error", prop.getText("components.elfinder.commands.paste.cut.error", ftgt.getParent().getPath()));
}
}
}
added.add(newFile);
if (cut)
{
//JEEFF: upravene, ma sa vratit zoznam hashov a nie objektov
removed.add(ftgt.getHash());
}
}
}
else
{
json.put("error", prop.getText("components.elfinder.commands.paste.error", fdst.getPath()));
}
json.put("added", files2JsonArray(request, added));
//JEEFF: upravene, ma sa vratit zoznam hashov a nie objektov
json.put("removed", removed.toArray());
}
/**
* vrati true, ak path zacina na niektory allowed adresar(adresare oddelene ciarkou)
*
* @param path
* @param allowed
* @return
*/
static boolean isAllowedFolder(String path, String allowed)
{
if(Tools.isNotEmpty(allowed) && Tools.isNotEmpty(path))
{
//zero or more whitespace, a literal comma, zero or more whitespace
String[] allowedFolders = allowed.split("\\s*,\\s*");
for(String folder : allowedFolders)
{
if(path.startsWith(folder))
return true;
}
}
return false;
}
/**
* rekurzivne prejde vsetky subory zadaneho adresara a vytvori presmerovania na ich novu lokaciu
*
* @param file
* @param originalLink
* @param newLink
* @param request
*/
static void createRedirect(FsItemEx file, String originalLink, String newLink, HttpServletRequest request)
{
if(Tools.isNotEmpty(originalLink) && newLink!=null)
{
if(file.isFolder())
{
for(FsItemEx child : file.listChildren())
{
createRedirect(child, originalLink, newLink, request);
}
}
else
{
try
{
//nahradime staru(original) cestu za novu
UrlRedirectDB.addRedirect(file.getPath(), newLink+file.getPath().substring(originalLink.length()), DocDB.getDomain(request), 301);
}
catch(Exception e){sk.iway.iwcm.Logger.error(e);}
}
}
}
}