Package org.olat.repository.controllers

Source Code of org.olat.repository.controllers.RepositoryEntryImageController

/**
* 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.repository.controllers;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

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.gui.UserRequest;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.image.ImageComponent;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
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.gui.media.FileMediaResource;
import org.olat.core.gui.translator.Translator;
import org.olat.core.util.FileUtils;
import org.olat.core.util.ImageHelper;
import org.olat.core.util.vfs.LocalFolderImpl;
import org.olat.core.util.vfs.Quota;
import org.olat.core.util.vfs.VFSContainer;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;

/**
* <h3>Description:</h3>
* <p>
* The repository entry image upload controller offers a workflow to upload an
* image for a learning resource
* <p>
* Events fired by this controller:
* <ul>
* <li>CANCELLED_EVENT</li>
* <li>DONE_EVENT</li>
* </ul>
*
* @author Ingmar Kroll
*/
public class RepositoryEntryImageController extends BasicController {
  private VelocityContainer vContainer;
  private Link deleteButton;
  private FileUploadController uploadCtr;
  private RepositoryEntry repositoryEntry;

  private File repositoryEntryImageFile = null;
  private File newFile = null;
  private final int PICTUREWIDTH = 570;

 
  /**
   * Display upload form to upload a file to the given currentPath.
   * @param uploadDir 
   * @param wControl
   * @param translator
   * @param limitKB
   */
  public RepositoryEntryImageController(UserRequest ureq, WindowControl wControl, RepositoryEntry repositoryEntry, Translator translator,
      int limitKB) {
    super(ureq, wControl, translator);
    // use velocity files and translations from folder module package
    setBasePackage(RepositoryManager.class);
   
    this.repositoryEntryImageFile = new File(new File(FolderConfig.getCanonicalRoot() + FolderConfig.getRepositoryHome()),
        getImageFilename(repositoryEntry));
    this.repositoryEntry = repositoryEntry;
    this.vContainer = createVelocityContainer("imageupload");
    // Init upload controller
    Set<String> mimeTypes = new HashSet<String>();
    mimeTypes.add("image/gif");
    mimeTypes.add("image/jpg");
    mimeTypes.add("image/jpeg");
    mimeTypes.add("image/png");
    File uploadDir = new File(FolderConfig.getCanonicalRoot() + FolderConfig.getRepositoryHome());
    VFSContainer uploadContainer = new LocalFolderImpl(uploadDir);
    uploadCtr = new FileUploadController(getWindowControl(), uploadContainer, ureq, limitKB, Quota.UNLIMITED, mimeTypes, false);
    uploadCtr.hideTitleAndFieldset();
    listenTo(uploadCtr);
    vContainer.put("uploadCtr", uploadCtr.getInitialComponent());
    // init the delete button
    deleteButton = LinkFactory.createButtonSmall("cmd.delete", this.vContainer, this);
    // init the image itself
    vContainer.contextPut("hasPortrait", Boolean.FALSE);
    displayImage();
    // finished
    putInitialPanel(vContainer);
  }

  /**
   * @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 == deleteButton){
      repositoryEntryImageFile.delete();
    }
    displayImage();
  }

  /**
   * @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 == uploadCtr) {
      // catch upload event
      if (event instanceof FolderEvent && event.getCommand().equals(FolderEvent.UPLOAD_EVENT)) {
        FolderEvent folderEvent = (FolderEvent) event;
        // Get file from temp folder location
        String uploadFileName = folderEvent.getFilename();
        File uploadDir = new File(FolderConfig.getCanonicalRoot() + FolderConfig.getRepositoryHome());
        newFile = new File(uploadDir, uploadFileName);
        if (!newFile.exists()) {
          showError("Failed");
        } else {
          // Scale uploaded image
          File pBigFile = new File(uploadDir, getImageFilename(repositoryEntry));
          boolean ok = ImageHelper.scaleImage(newFile, pBigFile, PICTUREWIDTH,PICTUREWIDTH);
          // Cleanup original file
          newFile.delete();
          // And finish workflow
          if (ok) {     
            fireEvent(ureq, Event.DONE_EVENT);
          } else {
            showError("NoImage");
          }         
        }
      }
      // redraw image
      displayImage();
    }
  }

 
 
  /**
   * Internal helper to create the image component and push it to the view
   */
  private void displayImage() {
    ImageComponent ic = getImageComponentForRepositoryEntry("image",this.repositoryEntry);
    if (ic != null) {
      // display only within 400x200 in form
      ic.setMaxWithAndHeightToFitWithin(400, 200);
      vContainer.put("image", ic);
      vContainer.contextPut("hasImage",Boolean.TRUE);
    }else{
      vContainer.contextPut("hasImage",Boolean.FALSE);
    }
  }

  /**
   * Internal helper to create the image name
   * @param re
   * @return
   */
  public static String getImageFilename(RepositoryEntry re) {
    return re.getResourceableId() + ".jpg";
  }

  /**
   * Check if the repo entry does have an images and if yes create an image
   * component that displays the image of this repo entry.
   *
   * @param componentName
   * @param repositoryEntry
   * @return The image component or NULL if the repo entry does not have an
   *         image
   */
  public static ImageComponent getImageComponentForRepositoryEntry(String componentName, RepositoryEntry repositoryEntry){
    File repositoryEntryImageFile= new File(new File(FolderConfig.getCanonicalRoot() + FolderConfig.getRepositoryHome()),
        getImageFilename(repositoryEntry));
    if (!repositoryEntryImageFile.exists()) {
      return null;
    }
    ImageComponent imageComponent = new ImageComponent(componentName);
    imageComponent.setMediaResource(new FileMediaResource(repositoryEntryImageFile));
    return imageComponent;
  }

  /**
   * Copy the repo entry image from the source to the target repository entry.
   * If the source repo entry does not exists, nothing will happen
   *
   * @param src
   * @param target
   * @return
   */
  public static boolean copyImage(RepositoryEntry src, RepositoryEntry target) {
    File srcFile = new File(new File(FolderConfig.getCanonicalRoot() + FolderConfig.getRepositoryHome()),
      getImageFilename(src));
    File targetFile = new File(new File(FolderConfig.getCanonicalRoot() + FolderConfig.getRepositoryHome()),
      getImageFilename(target));
    if (srcFile.exists()) {
      try {
        targetFile.createNewFile();
        FileUtils.copy(new BufferedInputStream(new FileInputStream(srcFile)), new BufferedOutputStream(new FileOutputStream(targetFile)));
      } catch (IOException ioe) {
        return false;
      }
    }
    return true;
  }
 
  /**
   *
   * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
   */
  protected void doDispose() {
    // controllers autodisposed by basic controller
  }

  /**
   * Method to remove the image for the given repo entry from disk
   * @param re
   */
  public static void deleteImage(RepositoryEntry re) {
    File srcFile = new File(new File(FolderConfig.getCanonicalRoot() + FolderConfig.getRepositoryHome()),
      getImageFilename(re));
    if (srcFile.exists()) srcFile.delete();
  }

}
TOP

Related Classes of org.olat.repository.controllers.RepositoryEntryImageController

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.