DataTablesInterface.java

package sk.iway.iwcm.system.datatables;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.RandomStringUtils;

import sk.iway.iwcm.FileTools;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.io.IwcmFile;

/**
 *  DataTablesInterface.java
 *  Interface class that allows communication with the DataTables Editor.
 *  For example of implementation see package sk.iway.iwcm.components.enumerations
 *
 *
 * Title        webjet8
 * Company      Interway a.s. (www.interway.sk)
 * Copyright    Interway a.s (c) 2001-2018
 * author       $Author: mhruby $
 * version      $Revision: 1.0 $
 * created      Date: 27.03.2018 12:00:00
 * modified     $Date: 27.03.2018 12:0:00 $
 */


public interface DataTablesInterface {

    /**
     * Perform select all
     * @return List<Object>
     */
    List<Object> list(HttpServletRequest request);

    /**
     * Perform insert/update/delete.
     * @param parsedRequest parsed input map that contains input form fields
     * @return list with inserted/edited object. If input is invalid return null.
     */
    List<Object> save(HttpServletRequest request, Map<Integer,Map<String, String>> parsedRequest);

    /**
     * Getter for input errors.
     * @return List of DataTablesFieldError
     */
    List<DataTablesFieldError> getFieldErrors();

    String getError();

    boolean canSave(Identity user);

    /**
     * Hashtabulka uploadnutych suborov, key je unikatny nazov (idecko) suboru, value je URL uploadnuteho suboru
     * @return
     */
    default Hashtable<String, String> getFiles()
    {
        return null;
    }

    /**
     * Default adresar pre upload suborov
     * @return
     */
    default String getUploadDir()
    {
        return "/images/protected/_upload_temp";
    }

    /**
     * Overenie, ci je dany FileItem mozne uploadnut (kontrola typu, velkosti, ...)
     * @param item
     * @return
     */
    default boolean canUpload(FileItem item) { return true; }

    /**
     * Default implementacia uploadu
     * @param request
     */
    default boolean upload(HttpServletRequest request)
    {
        @SuppressWarnings("unchecked")
        Map<String, FileItem> files = (Map<String,FileItem>)request.getAttribute("MultipartWrapper.files");
        for (Map.Entry<String, FileItem> entry : files.entrySet())
        {
            //String name = entry.getKey();
            FileItem item = entry.getValue();

            String randomName = RandomStringUtils.random(10, true, true);
            if (canUpload(item))
            {
                String ext = FileTools.getFileExtension(item.getName());
                String fileUrl = getUploadDir()+"/"+randomName+"."+ext;
                File dir = new File(Tools.getRealPath(getUploadDir()));
                if (dir.exists()==false) dir.mkdirs();
                File f = new File(Tools.getRealPath(fileUrl));

                FileOutputStream fos = null;
                //item.getInputStream()
                try
                {
                    f.createNewFile();
                    fos = new FileOutputStream(f);
                    IOUtils.write(IOUtils.toByteArray(item.getInputStream()), fos);

                    getFiles().put(randomName, fileUrl);

                    return true;
                } catch (IOException e)
                {
                    sk.iway.iwcm.Logger.error(e);
                    if (fos!=null)
                    {
                        try { fos.close(); } catch (IOException e1) { sk.iway.iwcm.Logger.error(e1); }
                    }
                }
            }
        }

        //zmaz z tempu stare subory
        if (getUploadDir().contains("temp") || getUploadDir().contains("tmp"))
        {
            IwcmFile tempDir = new IwcmFile(Tools.getRealPath(getUploadDir()));
            FileTools.deleteDirTree(tempDir, 8 * 60 * 60 * 1000L);
        }
        return false;
    }
}