Package org.olat.commons.file.filechooser

Source Code of org.olat.commons.file.filechooser.FileChooserController

/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <p>
*/

package org.olat.commons.file.filechooser;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.olat.core.commons.controllers.filechooser.FileChoosenEvent;
import org.olat.core.commons.controllers.filechooser.FileChooserUIFactory;
import org.olat.core.commons.modules.bc.FileUploadController;
import org.olat.core.commons.modules.bc.FolderConfig;
import org.olat.core.commons.modules.bc.FolderEvent;
import org.olat.core.commons.modules.bc.FolderModule;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.panel.Panel;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.ControllerEventListener;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.util.CodeHelper;
import org.olat.core.util.FileUtils;
import org.olat.core.util.Util;
import org.olat.core.util.vfs.LocalFileImpl;
import org.olat.core.util.vfs.LocalFolderImpl;
import org.olat.core.util.vfs.Quota;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.core.util.vfs.VFSItem;
import org.olat.core.util.vfs.VFSLeaf;
import org.olat.core.util.vfs.filters.VFSItemFilter;
import org.olat.user.PersonalFolderManager;

/**
* Description:
* <p>
* This Controller offers first to choose from local folder or to upload files.
* Then the two subworkflows are triggered.
* <p>
* This workflow should not be used in any new workflows, it is very confusing,
* needs to be reimplemented from sratch with better navigation (e.g. crumb
* path)
* <p>
* @author Felix Jost
* @author Florian Gnägi
* @deprecated
*/
public class FileChooserController extends BasicController {

  private static final String CMD_SELECT = "select";

  private static final String PARAM_SELECT_RADIO = "sel";

  private static final String PACKAGE = Util.getPackageName(FileChooserController.class);
  private static final String VELOCITY_ROOT = Util.getPackageVelocityRoot(PACKAGE);

  private boolean fileFromUpload = false;
  private VFSContainer selectedContainer = null;
  private VFSLeaf selectedFile = null;
  private File uploadedFile = null;
  private String uploadedFileName;

  private VelocityContainer main;
 
  private int uploadLimitKB;
  private List<String> folderNames;
  private List<VFSContainer> containerRefs;
  private VFSItemFilter suffixFilter;
  private org.olat.core.commons.controllers.filechooser.FileChooserController fileChooserCtr;
  private Boolean showCancelButton;
  private Link foldersButton;
  private Link uploadButton;
  private Link cancelButton;
 
  private FileUploadController fileUploadCtr;
  private Panel panel;
  private File uploadDir;
  private VFSContainer uploadContainer;


  /**
   * @param ureq
   * @param wControl
   * @param cel
   * @param uploadLimitKB
   */
  public FileChooserController(UserRequest ureq, WindowControl wControl, ControllerEventListener cel, int uploadLimitKB, boolean showCancelButton) {
    super(ureq, wControl, Util.createPackageTranslator(FolderModule.class, ureq.getLocale()));
   
    this.uploadLimitKB = uploadLimitKB;
    this.showCancelButton=new Boolean(showCancelButton);

    main = createVelocityContainer("index");
    foldersButton = LinkFactory.createButton("folders", main, this);
    uploadButton = LinkFactory.createButton("upload", main, this);
    cancelButton = LinkFactory.createButton("cancel", main, this);
    // tmp upload container
    uploadDir = new File(FolderConfig.getCanonicalTmpDir() + "/" + CodeHelper.getGlobalForeverUniqueID());
    uploadContainer = new LocalFolderImpl(uploadDir);
   
    folderNames = new ArrayList<String>(3);
    containerRefs = new ArrayList<VFSContainer>(3);
    //folderNames.add("groupFolder1");
    //containerRefs.add(new Path("/groups/gr1"));
    main.contextPut("folderList", folderNames);
    main.contextPut("maxUpload", new Long(uploadLimitKB * 1024));
    main.contextPut("showcancelbutton",this.showCancelButton);
    //
    panel = putInitialPanel(main);
    addControllerListener(cel);
  }

  /**
   * @see java.lang.Object#finalize()
   */
  protected void finalize() throws Throwable {
    super.finalize();
    release();
  }

  /**
   *
   */
  public void release() {
    if (uploadedFile != null && uploadedFile.exists()) uploadedFile.delete();
    if (uploadDir != null && uploadDir.exists()) FileUtils.deleteDirsAndFiles(uploadDir, true, true);
  }

  /**
   * @param suffixFilter
   */
  public void setSuffixFilter(VFSItemFilter suffixFilter) {
    this.suffixFilter = suffixFilter;
  }

  /**
   * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
   *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
   */
  public void event(UserRequest ureq, Component source, Event event) {
    if (source == main) {
      if (event.getCommand().equals(CMD_SELECT)) {
        if (ureq.getParameter("cancel") != null) {
          notifyCanceled(ureq);
          return;
        } else {
          int selectedFolder;
          try {
            selectedFolder = Integer.parseInt(ureq.getParameter(PARAM_SELECT_RADIO));
          } catch (NumberFormatException nfe) {
            getWindowControl().setError(translate("general.error"));
            return;
          }
          selectedContainer = null;
          if (selectedFolder == 0) { // personal folder
            selectedContainer = PersonalFolderManager.getInstance().getContainer(ureq.getIdentity());
          } else { // process other folders
            selectedContainer = (VFSContainer)containerRefs.get(selectedFolder - 1);
          }
          initializeSelectionTree(ureq, selectedContainer);
          main.setPage(VELOCITY_ROOT + "/selectfile.html");
         
          return;
        }
      }
     
    } else if (source == foldersButton){
      main.setPage(VELOCITY_ROOT + "/folders.html");
      main.contextPut("showcancelbutton",this.showCancelButton);
     
    } else if (source == uploadButton){
      // Delegate upload process to file upload controller
      removeAsListenerAndDispose(fileUploadCtr);
      fileUploadCtr = new FileUploadController(getWindowControl(), uploadContainer, ureq,  uploadLimitKB, Quota.UNLIMITED, null, false);
      listenTo(fileUploadCtr);
      panel.setContent(fileUploadCtr.getInitialComponent());
     
    } else if (source == cancelButton){
      notifyCanceled(ureq);
      return;
     
    }
    main.contextPut("folderList", folderNames);
  }

  /**
   * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
   */
  public void event(UserRequest ureq, Controller source, Event event) {
    if (source == fileUploadCtr) {
      // catch upload event
      if (event instanceof FolderEvent && event.getCommand().equals(FolderEvent.UPLOAD_EVENT)) {
        FolderEvent folderEvent = (FolderEvent) event;
        // Get file from temp folder location
        uploadedFileName = folderEvent.getFilename();
        VFSItem file = uploadContainer.resolve(uploadedFileName);
        if (file != null) {
          // remove old files first from a previous upload
          if (uploadedFile != null && uploadedFile.exists()) uploadedFile.delete();
          // We knot it is a local file, cast is necessary to get file reference
          uploadedFile = ((LocalFileImpl)file).getBasefile();
          fileFromUpload = true;
          notifyFinished(ureq);
        } else {
          showError("error.general");
        }
      }
      // in any case move back to main view
      panel.setContent(main);
     
    } else if (source == fileChooserCtr) {
      if (event instanceof FileChoosenEvent) {
        String selectedPath = FileChooserUIFactory.getSelectedRelativeItemPath((FileChoosenEvent) event, selectedContainer, null);       
        selectedFile = (VFSLeaf)selectedContainer.resolve(selectedPath);
        notifyFinished(ureq);
        return;
      } else {
        notifyCanceled(ureq);
        return;
      }
    }
  }
 
  private void notifyFinished(UserRequest ureq) {
    fireEvent(ureq, Event.DONE_EVENT);
  }

  private void notifyCanceled(UserRequest ureq) {
    fireEvent(ureq, Event.CANCELLED_EVENT);
  }

  private void initializeSelectionTree(UserRequest ureq, VFSContainer selContainer) {
    removeAsListenerAndDispose(fileChooserCtr);
    fileChooserCtr = FileChooserUIFactory.createFileChooserController(ureq, getWindowControl(), selContainer, suffixFilter, true);
    listenTo(fileChooserCtr);
    main.put("selectionTree", fileChooserCtr.getInitialComponent());
  }

  /**
   * @return
   */
  public boolean isFileFromUpload() {
    return fileFromUpload;
  }

  /**
   * @return
   */
  public boolean isFileFromFolder() {
    return !fileFromUpload;
  }

  /**
   * @return
   */
  public VFSLeaf getFileSelection() {
    return selectedFile;
  }

  /**
   * @return
   */
  public File getUploadedFile() {
    return uploadedFile;
  }

  /**
   * @return
   */
  public String getUploadedFileName() {
    return uploadedFileName;
  }

  /**
   * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
   */
  protected void doDispose() {
  // do nothing here yet
  }

}
TOP

Related Classes of org.olat.commons.file.filechooser.FileChooserController

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.