Dateiverwaltung für die WebBox
ulrich
2017-03-06 fab80c872af697d61f200fd410a7ecc64ca0a537
src/java/de/uhilger/filecms/api/FileMgr.java
@@ -21,10 +21,13 @@
import de.uhilger.filecms.data.FileRef;
import de.uhilger.filecms.web.Initialiser;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.security.Principal;
import java.util.ArrayList;
import java.util.Iterator;
@@ -32,6 +35,7 @@
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringEscapeUtils;
/**
 *
@@ -103,9 +107,12 @@
    
    Object p = getRequest().getUserPrincipal();
    if(p instanceof Principal) {
      FileReader reader = null;
      Reader reader = null;
      try {
        File targetFile = new File(getTargetDir(relPath), fileName);
        //reader = new InputStreamReader(new FileInputStream(targetFile), "UTF8");
        reader = new FileReader(targetFile);
        StringBuffer buf = new StringBuffer();
        char[] readBuffer = new char[1024];
@@ -166,6 +173,14 @@
  }
  
  public String copyFiles(String fromPath, String toPath, List fileNames) {
    return copyOrMoveFiles(fromPath, toPath, fileNames, OP_COPY);
  }
  public String moveFiles(String fromPath, String toPath, List fileNames) {
    return copyOrMoveFiles(fromPath, toPath, fileNames, OP_MOVE);
  }
  private String copyOrMoveFiles(String fromPath, String toPath, List fileNames, int operation) {
    String result = null;
    try {
      File srcDir = getTargetDir(fromPath);
@@ -177,11 +192,17 @@
          ArrayList al = (ArrayList) o;
          File srcFile = new File(srcDir, al.get(0).toString());
          if(srcFile.isDirectory()) {
            logger.fine("copy dir " + srcFile.getAbsolutePath() + " to dir " + targetDir.getAbsolutePath());
            FileUtils.copyDirectoryToDirectory(srcFile, targetDir);
            if(operation == OP_MOVE) {
              FileUtils.moveDirectoryToDirectory(srcFile, targetDir, false);
            } else {
              FileUtils.copyDirectoryToDirectory(srcFile, targetDir);
            }
          } else {
            logger.fine("copy srcFile " + srcFile.getAbsolutePath() + " to dir " + targetDir.getAbsolutePath());
            FileUtils.copyFileToDirectory(srcFile, targetDir);
            if(operation == OP_MOVE) {
              FileUtils.moveFileToDirectory(srcFile, targetDir, false);
            } else {
              FileUtils.copyFileToDirectory(srcFile, targetDir);
            }
          }
        }
      }
@@ -191,62 +212,90 @@
    return result;
  }
  
  public String moveFiles(String fromPath, String toPath, List fileNames) {
    String result = null;
    try {
      File srcDir = getTargetDir(fromPath);
      File targetDir = getTargetDir(toPath);
      Iterator i = fileNames.iterator();
      while(i.hasNext()) {
        Object o = i.next();
        if (o instanceof ArrayList) {
          ArrayList al = (ArrayList) o;
          File srcFile = new File(srcDir, al.get(0).toString());
          if(srcFile.isDirectory()) {
            FileUtils.moveDirectoryToDirectory(srcFile, targetDir, false);
          } else {
            FileUtils.moveFileToDirectory(srcFile, targetDir, false);
          }
        }
  public FileRef saveTextFileAs(String relPath, String fileName, String contents) {
    FileRef savedFile = null;
    logger.fine(relPath + " " + fileName);
    //FileRef datenRef = getBase();
    Object p = getRequest().getUserPrincipal();
    if(p instanceof Principal) {
      File targetFile = new File(getTargetDir(relPath), fileName);
      if(targetFile.exists()) {
        targetFile = getNewFileName(targetFile);
      } else {
        targetFile.getParentFile().mkdirs();
      }
      saveToFile(targetFile, contents);
    }
    return savedFile;
  }
  private File getNewFileName(File file) {
    File dir = file.getParentFile();
    String targetName = file.getName();
    logger.fine("targetName: " + targetName);
    String ext = "";
    int dotpos = targetName.indexOf(".");
    if(dotpos > -1) {
      ext = targetName.substring(dotpos);
      targetName = targetName.substring(0, dotpos);
    }
    logger.fine("targetName: " + targetName + ", ext: " + ext);
    int i = 1;
    while(file.exists()) {
      StringBuffer buf = new StringBuffer();
      buf.append(targetName);
      buf.append("-");
      buf.append(i);
      if(ext.length() > 0) {
        buf.append(ext);
      }
      file = new File(dir, buf.toString());
      i++;
    }
    logger.fine("new file: " + file.getName());
    return file;
  }
  private FileRef saveToFile(File targetFile, String contents) {
    FileRef savedFile = null;
    try {
      targetFile.createNewFile();
      FileWriter w = new FileWriter(targetFile);
      //w.write(StringEscapeUtils.unescapeHtml(contents));
      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, ex.getLocalizedMessage(), ex);
    }
    return result;
    return savedFile;
  }
  
  public FileRef saveTextFile(String relPath, String fileName, String contents) {
    FileRef savedFile = null;
    try {
      FileRef datenRef = getBase();
      Object p = getRequest().getUserPrincipal();
      if(p instanceof Principal) {
        File targetFile = new File(getTargetDir(relPath), 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());
    logger.fine(relPath + " " + fileName);
    //FileRef datenRef = getBase();
    Object p = getRequest().getUserPrincipal();
    if(p instanceof Principal) {
      File targetFile = new File(getTargetDir(relPath), 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();
      }
    } catch (IOException ex) {
      logger.log(Level.SEVERE, null, ex);
      saveToFile(targetFile, contents);
    }
    return savedFile;
  }