Package com.dotmarketing.portlets.files.action

Source Code of com.dotmarketing.portlets.files.action.UploadMultipleFilesAction

package com.dotmarketing.portlets.files.action;

import static com.dotmarketing.business.PermissionAPI.PERMISSION_CAN_ADD_CHILDREN;

import java.io.IOException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

import com.dotcms.repackage.javax.portlet.ActionRequest;
import com.dotcms.repackage.javax.portlet.ActionResponse;
import com.dotcms.repackage.javax.portlet.PortletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.dotcms.repackage.org.apache.struts.action.ActionForm;
import com.dotcms.repackage.org.apache.struts.action.ActionMapping;

import com.dotcms.util.exceptions.DuplicateFileException;
import com.dotmarketing.beans.Host;
import com.dotmarketing.business.APILocator;
import com.dotmarketing.business.PermissionAPI;
import com.dotmarketing.business.web.WebAPILocator;
import com.dotmarketing.cache.StructureCache;
import com.dotmarketing.db.HibernateUtil;
import com.dotmarketing.exception.DotDataException;
import com.dotmarketing.exception.DotSecurityException;
import com.dotmarketing.exception.WebAssetException;
import com.dotmarketing.portal.struts.DotPortletAction;
import com.dotmarketing.portlets.contentlet.model.Contentlet;
import com.dotmarketing.portlets.fileassets.business.FileAssetAPI;
import com.dotmarketing.portlets.files.business.FileAPI;
import com.dotmarketing.portlets.files.model.File;
import com.dotmarketing.portlets.files.struts.FileForm;
import com.dotmarketing.portlets.folders.business.FolderAPI;
import com.dotmarketing.portlets.folders.model.Folder;
import com.dotmarketing.util.Logger;
import com.dotmarketing.util.UtilMethods;
import com.dotmarketing.util.WebKeys;
import com.liferay.portal.language.LanguageException;
import com.liferay.portal.language.LanguageUtil;
import com.liferay.portal.model.User;
import com.liferay.portal.struts.ActionException;
import com.liferay.portal.util.Constants;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portlet.ActionRequestImpl;
import com.liferay.util.ParamUtil;
import com.liferay.util.servlet.SessionMessages;
import com.liferay.util.servlet.UploadPortletRequest;

/**
* @author Maria
* @author David H Torres 2009
*/

public class UploadMultipleFilesAction extends DotPortletAction {


  public void processAction(
       ActionMapping mapping, ActionForm form, PortletConfig config,
       ActionRequest req, ActionResponse res)
     throws Exception {

        String cmd = req.getParameter(Constants.CMD);
    String referer = req.getParameter("referer");

    //wraps request to get session object
    ActionRequestImpl reqImpl = (ActionRequestImpl)req;
    HttpServletRequest httpReq = reqImpl.getHttpServletRequest();

    if ((referer!=null) && (referer.length()!=0)) {
      referer = URLDecoder.decode(referer,"UTF-8");
    }
    Logger.debug(this, "UploadMultipleFilesAction cmd=" + cmd);

    User user = _getUser(req);
    if(cmd != null && cmd.equals(Constants.EDIT)) {
          HibernateUtil.startTransaction();
      try {
        Logger.debug(this, "Calling Retrieve method");
        _retrieveWebAsset(req, res, config, form, user, File.class, WebKeys.FILE_EDIT);
              Logger.debug(this, "Calling Edit Method");
        _editWebAsset(req, res, config, form, user);
      }
      catch (Exception ae) {
        _handleException(ae, req);
        return;
      }
          HibernateUtil.commitTransaction();
    }
    else if (cmd != null && cmd.equals(Constants.ADD)) {
            try {
                Logger.debug(this, "Calling Save Method");
        String subcmd = req.getParameter("subcmd");
        _saveFileAsset(req, res, config, form, user, subcmd);
        _sendToReferral(req,res,referer);
            }
            catch (ActionException ae) {
        _handleException(ae, req);
        if (ae.getMessage().equals("message.file_asset.error.filename.exists")) {
          _sendToReferral(req,res,referer);
        }
        else if (ae.getMessage().equals(WebKeys.USER_PERMISSIONS_EXCEPTION)) {
          SessionMessages.add(httpReq, "error", "message.insufficient.permissions.to.save");
          _sendToReferral(req,res,referer);
        }
            }
        }
    else {
      Logger.debug(this, "Unspecified Action");
    }
    setForward(req, "portlet.ext.files.upload_multiple");
    }

  public void _editWebAsset(ActionRequest req, ActionResponse res,PortletConfig config,ActionForm form, User user)
  throws Exception {

    FileAPI fileAPI = APILocator.getFileAPI();
    FolderAPI folderAPI = APILocator.getFolderAPI();

    // calls edit method from super class that returns parent folder
    super._editWebAsset(req, res, config, form, user, WebKeys.FILE_EDIT);

    // This can't be done on the WebAsset so it needs to be done here.
    File file = (File) req.getAttribute(WebKeys.FILE_EDIT);

       Folder parentFolder = null;

    if(req.getParameter("parent") != null) {
      parentFolder = folderAPI.find(req.getParameter("parent"),user,false);
    } else {
      parentFolder = fileAPI.getFileFolder(file,WebAPILocator.getHostWebAPI().getCurrentHost(req), user, false);
    }

    // setting parent folder path and inode on the form bean
    if(parentFolder != null) {
      FileForm cf = (FileForm) form;
      cf.setSelectedparent(parentFolder.getName());
      cf.setParent(parentFolder.getInode());
      cf.setSelectedparentPath(APILocator.getIdentifierAPI().find(parentFolder).getPath());
      file.setParent(parentFolder.getInode());
    }



    req.setAttribute("PARENT_FOLDER",parentFolder);

  }

  private String checkMACFileName(String fileName)
  {
    if (UtilMethods.isSet(fileName)) {
        if (fileName.contains("/"))
          fileName = fileName.substring(fileName.lastIndexOf("/") + 1, fileName.length());
          if (fileName.contains("\\"))
           fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
        fileName = fileName.replaceAll("'","");
      }
    return fileName;
  }

  private String getFriendlyName(String fileName){

    String val = fileName;
    boolean test = false;
    String newVal = "";
    for(int i=0 ; i < val.length() ; i++){
      String c =     val.substring(i,i+1);
       if(c == "_") {
           c = " ";
      }
      if(test == true || i == 0){
         test = false;
           c = c.toUpperCase();
      }
      if(c == " "){
                test = true;
      }


        if(c == ".") break;
      newVal = newVal +   c;
    }

    return newVal;
  }

  public void _saveFileAsset(ActionRequest req, ActionResponse res,PortletConfig config,ActionForm form, User user, String subcmd)
  throws WebAssetException, ActionException, DotDataException, DotSecurityException, LanguageException {

      boolean isAdmin = com.dotmarketing.business.APILocator.getRoleAPI().doesUserHaveRole(user,com.dotmarketing.business.APILocator.getRoleAPI().loadCMSAdminRole());

      com.liferay.portlet.RenderRequestImpl reqImpl = (com.liferay.portlet.RenderRequestImpl) req;
        HttpServletRequest httpReq = reqImpl.getHttpServletRequest();
        HttpSession session = httpReq.getSession();

    UploadPortletRequest uploadReq = PortalUtil.getUploadPortletRequest(req);

    String parent = ParamUtil.getString(req, "parent");

    //parent folder
    Folder folder = (Folder) APILocator.getFolderAPI().find(parent, user, false);

    String hostId=folder.getHostId();
    boolean isRootHost=APILocator.getFolderAPI().findSystemFolder().equals(folder);
    if(isRootHost)
        hostId=(String)session.getAttribute(com.dotmarketing.util.WebKeys.CMS_SELECTED_HOST_ID);

    Host host=APILocator.getHostAPI().find(hostId, user, false);

    //check permissions
    if(isRootHost) {
        if(!APILocator.getPermissionAPI().doesUserHavePermission(host, PERMISSION_CAN_ADD_CHILDREN, user))
            throw new ActionException(WebKeys.USER_PERMISSIONS_EXCEPTION);
    }
    else {
        _checkUserPermissions(folder, user, PERMISSION_CAN_ADD_CHILDREN);
    }

    String fileNamesStr = ParamUtil.getString(req, "fileNames");
    if(!UtilMethods.isSet(fileNamesStr))
      throw new ActionException(LanguageUtil.get(user, "message.file_asset.alert.please.upload"));

    String selectedStructureInode = ParamUtil.getString(req, "selectedStructure");
    if(!UtilMethods.isSet(selectedStructureInode))
      selectedStructureInode = StructureCache.getStructureByVelocityVarName(FileAssetAPI.DEFAULT_FILE_ASSET_STRUCTURE_VELOCITY_VAR_NAME).getInode();

    String[] fileNamesArray = fileNamesStr.split(WebKeys.CONTENTLET_FORM_NAME_VALUE_SEPARATOR);
    String customMessage = LanguageUtil.get(user, "message.file_asset.error.filename.filters") + ": ";
    if(fileNamesArray.length > 2)
      SessionMessages.add(req, "custommessage", LanguageUtil.get(user, "message.contentlets.batch.reindexing.background"));
    boolean filterError = false;

    List<String> existingFileNames = new ArrayList<String>();
    for (int k=0;k<fileNamesArray.length;k++) {
      try{
        HibernateUtil.startTransaction();
        Contentlet contentlet = new Contentlet();
        contentlet.setStructureInode(selectedStructureInode);
        contentlet.setHost(hostId);
        contentlet.setFolder(folder.getInode());
        String fileName = fileNamesArray[k];
        String title = getFriendlyName(fileName);

        fileName = checkMACFileName(fileName);

        if(!APILocator.getFolderAPI().matchFilter(folder,fileName))
              {
           customMessage += fileName + ", ";
                 filterError = true;
                 continue;
              }

        if (fileName.length()>0) {

                    //sets filename for this new file
                    contentlet.setStringProperty("title", title);
                    contentlet.setStringProperty("fileName", fileName);

                    java.io.File uploadedFile = uploadReq.getFile(fileName);
                    contentlet.setBinary("fileAsset", uploadedFile);

                    if ( uploadedFile != null ) {

                        //checks if another identifier with the same name exists in the same folder
                        if (APILocator.getFileAssetAPI().fileNameExists(host, folder, fileName, "")) {
                            throw new DuplicateFileException(fileName);
                        }

                        contentlet = APILocator.getContentletAPI().checkin( contentlet, user, false );
                        if ( (subcmd != null) && subcmd.equals( com.dotmarketing.util.Constants.PUBLISH ) ) {
                            if ( isRootHost
                                    && !APILocator.getPermissionAPI().doesUserHaveInheriablePermissions( host, File.class.getCanonicalName(), PermissionAPI.PERMISSION_PUBLISH, user )
                                    && !isAdmin ) {
                                throw new ActionException( WebKeys.USER_PERMISSIONS_EXCEPTION );
                            }

                            APILocator.getVersionableAPI().setLive( contentlet );
                        }

                        HibernateUtil.commitTransaction();
                        APILocator.getContentletAPI().isInodeIndexed(contentlet.getInode());

                    }
        }
      }
      catch (DuplicateFileException e){
        existingFileNames.add(e.getMessage());
        HibernateUtil.rollbackTransaction();
      }
      catch (IOException e) {
        Logger.error(this, "Exception saving file: " + e.getMessage());
        SessionMessages.add(req, "error", e.getMessage());
        HibernateUtil.rollbackTransaction();
      }
      catch (Exception e) {
        Logger.error(this, e.getMessage());
        SessionMessages.add(req, "error", e.getMessage());
        HibernateUtil.rollbackTransaction();
      }
    }

    if(!existingFileNames.isEmpty()){
      StringBuffer messageText = new StringBuffer();
      if(existingFileNames.size()>1){
        messageText.append(LanguageUtil.get(user, "The-following-uploaded-files-already-exist"));
      }else{
        messageText.append(LanguageUtil.get(user, "The-uploaded-file-already-exists"));
      }

      for(int i=0;i<existingFileNames.size();i++){
        if(i==0){
          messageText.append(existingFileNames.get(i));
        }else{
          messageText.append(", "  + existingFileNames.get(i));
        }
      }
      SessionMessages.add(req, "custommessage", messageText.toString());
    }

    if(filterError)
    {
      customMessage = customMessage.substring(0,customMessage.lastIndexOf(","));
      SessionMessages.add(req, "custommessage",customMessage);
    }
  }
}
TOP

Related Classes of com.dotmarketing.portlets.files.action.UploadMultipleFilesAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.