Dateiverwaltung für die WebBox
ulrich
2017-02-20 5dfab6ee05a6926a84c068ee0ebcabab1480c9c5
src/java/de/uhilger/filecms/api/FileMgr.java
@@ -1,62 +1,181 @@
/*
    Dateiverwaltung - File management in your browser
    Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.
    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package de.uhilger.filecms.api;
import de.uhilger.filecms.web.Initialiser;
import de.uhilger.filesystem.FileRef;
import de.uhilger.transit.web.RequestKontext;
import de.uhilger.transit.web.WebKontext;
import de.uhilger.filesystem.LocalFileSystem;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
/**
 *
 * @author ulrich
 */
public class FileMgr implements WebKontext, RequestKontext {
public class FileMgr extends Api {
  private static final Logger logger = Logger.getLogger(FileMgr.class.getName());
  
  public static final String FILE_BASE = "fileBase";
  public static final String PUB_DIR_PATH = "www/";
  public static final String HOME_DIR_PATH = "home/";
  public static final String PUB_DIR_NAME = "Oeffentlich";
  public static final String HOME_DIR_NAME = "Persoenlicher Ordner";
  
  private ServletContext ctx;
  private HttpServletRequest req;
  private FileRef homeFolder;
  private FileRef publicFolder;
  private FileRef namedHomeFolder;
  private FileRef namedPublicFolder;
  
  public FileRef getBase() {
    FileRef ref = null;
    //String fileBase = getServletContext().getInitParameter(FILE_BASE);
    // -Dfilecms.base=/pfad/zu/daten
    String fileBase = System.getProperty("filecms.base");
    File file = new File(fileBase);
    logger.info(file.getAbsolutePath());
    logger.info(getWebappsDir().getAbsolutePath());
    ref = new FileRef(file.getAbsolutePath(), file.isDirectory());
    return ref;
  public String hallo() {
    return "Hallo Welt!";
  }
  public List<FileRef> list(String relPath) {
    List<FileRef> files = new ArrayList();
    if(relPath.length() == 0) {
      /*
      publicFolder = new FileRef(getUserPubDir().getAbsolutePath(), true);
      logger.info(publicFolder.getAbsolutePath());
      homeFolder = new FileRef(getUserHomeDir().getAbsolutePath(), true);
      logger.info(homeFolder.getAbsolutePath());
      */
      namedPublicFolder = new FileRef(PUB_DIR_NAME, true);
      logger.finer(namedPublicFolder.getAbsolutePath());
      namedHomeFolder = new FileRef(HOME_DIR_NAME, true);
      logger.finer(namedHomeFolder.getAbsolutePath());
      files = new ArrayList<FileRef>();
      files.add(namedHomeFolder);
      files.add(namedPublicFolder);
    } else {
      logger.info(relPath);
      String targetPath = null;
      if(relPath.startsWith(PUB_DIR_NAME)) {
        targetPath = PUB_DIR_PATH + getUserName() + "/" + relPath.substring(PUB_DIR_NAME.length());
      } else if(relPath.startsWith(HOME_DIR_NAME)) {
        targetPath = HOME_DIR_PATH + getUserName() + "/" + relPath.substring(HOME_DIR_NAME.length());
      } else {
        // kann eigentlich nicht sein..
      }
      logger.info(targetPath);
      File targetDir = new File(getBase().getAbsolutePath(), targetPath);
      LocalFileSystem fs = new LocalFileSystem();
      FileRef[] fileRefs = fs.list(new FileRef(targetDir.getAbsolutePath(), true));
      for(int i = 0; i < fileRefs.length; i++) {
        files.add(fileRefs[i]);
      }
      //files = Arrays.asList(fileRefs);
    }
    return files;
  }
  private FileRef getBase() {
    FileRef base = null;
    Object o = getServletContext().getAttribute(Initialiser.FILE_BASE);
    if(o instanceof FileRef) {
      base = (FileRef) o;
    }
    return base;
  }
  private File getUserPubDir() {
    File userDir = null;
    File daten = new File(getBase().getAbsolutePath());
    Object p = getRequest().getUserPrincipal();
    if(p instanceof Principal) {
      userDir = new File(daten, PUB_DIR_PATH + ((Principal) p).getName());
    }
    return userDir;
  }
  private String getUserName() {
    String userName = null;
    Object p = getRequest().getUserPrincipal();
    if(p instanceof Principal) {
      userName = ((Principal) p).getName();
    }
    return userName;
  }
  private File getUserHomeDir() {
    File userDir = null;
    File daten = new File(getBase().getAbsolutePath());
    Object p = getRequest().getUserPrincipal();
    if(p instanceof Principal) {
      userDir = new File(daten, HOME_DIR_PATH + ((Principal) p).getName());
    }
    return userDir;
  }
  public FileRef saveTextFile(String relPath, String fileName, String contents) {
    FileRef savedFile = null;
    try {
      FileRef datenRef = getBase();
      File daten = new File(datenRef.getAbsolutePath());
      Object p = getRequest().getUserPrincipal();
      if(p instanceof Principal) {
        File userDir = new File(daten, "www/" + ((Principal) p).getName());
        File saveDir = new File(userDir, relPath);
        File targetFile = new File(saveDir, fileName);
        if(targetFile.exists()) {
          /*
            muss delete() sein?
            pruefen: ueberschreibt der FileWriter den alteen Inhalt oder
            entsteht eine unerwuenschte Mischung aus altem und neuem
            Inhalt?
          */
          targetFile.delete();
        } else {
          targetFile.getParentFile().mkdirs();
        }
        targetFile.createNewFile();
        FileWriter w = new FileWriter(targetFile);
        w.write(contents);
        w.flush();
        w.close();
        savedFile = new FileRef(
                targetFile.getAbsolutePath(),
                targetFile.isDirectory(),
                targetFile.isHidden(),
                targetFile.lastModified(),
                targetFile.length());
      }
    } catch (IOException ex) {
      logger.log(Level.SEVERE, null, ex);
    }
    return savedFile;
  }
  
  private File getWebappsDir() {
    File cfile = new File(this.getClass().getResource(this.getClass().getSimpleName() + ".class").getFile());
    File cfile = new File(this.getClass().getResource(
            this.getClass().getSimpleName() + ".class").getFile());
    String path = cfile.getAbsolutePath();
    return new File(path.substring(0, path.indexOf(req.getContextPath())));
    return new File(path.substring(0, path.indexOf(getRequest().getContextPath())));
  }
  @Override
  public ServletContext getServletContext() {
    return ctx;
  }
  @Override
  public void setServletContext(ServletContext servletContext) {
    this.ctx = servletContext;
  }
  @Override
  public HttpServletRequest getRequest() {
    return req;
  }
  @Override
  public void setRequest(HttpServletRequest r) {
    this.req = r;
  }
}