Dateien verwalten mit Modul jdk.httpserver
ulrich
2021-07-04 7fdd7ef5017900baaf0ba3159f8d1dfe9a3a136e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
  http-cm - File management extensions to jdk.httpserver
  Copyright (C) 2021  Ulrich Hilger
 
  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 <https://www.gnu.org/licenses/>.
 */
package de.uhilger.httpserver.cm;
 
import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.logging.Logger;
 
/**
 * Ein FileVisitor zum Verschieben oder Kopieren ganzer Ordnerstrukturen mit
 * Hilfe der Methode Files.walkFileTree von java.nio.
 *
 * @author Ulrich Hilger
 * @version 1, 14. Mai 2021
 */
public class OrdnerBearbeiter extends FileTransporter implements FileVisitor {
 
  /* Der Logger fuer diesen ListFileHandler */
  private static final Logger logger = Logger.getLogger(OrdnerBearbeiter.class.getName());
 
  private Path targetDir;
  private int operation;
 
  public void setTargetDir(Path targetDir) {
    this.targetDir = targetDir;
    logger.fine("targetDir: " + targetDir.toString());
  }
 
  /**
   * OP_COPY oder OP_MOVE
   *
   * @param op
   */
  public void setOperation(int op) {
    this.operation = op;
  }
 
  @Override
  public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException {
    if (operation != FileManager.OP_DELETE) {
      if (dir instanceof Path) {
        Path sourceDir = (Path) dir;
        File destFile = targetDir.resolve(sourceDir.getFileName()).toFile();
        logger.fine("sourceDir: " + sourceDir + ", destFile: " + destFile);
        if (destFile.exists()) {
          File newDir = getNewFileName(destFile);
          destFile.renameTo(newDir);
        }
        destFile.mkdir();
        this.targetDir = destFile.toPath();
        logger.fine("targetDir now: " + targetDir.toString());
      }
    }
    return FileVisitResult.CONTINUE;
  }
 
  @Override
  public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException {
    if(operation != FileManager.OP_DELETE) {
      if (file instanceof Path) {
        Path source = (Path) file;
        File destFile = targetDir.resolve(source.getFileName()).toFile();
        if (destFile.exists()) {
          destFile = getNewFileName(destFile);
        }
        if (operation == FileManager.OP_MOVE) {
          logger.fine("move source: " + source.toString() + ", destFile: " + destFile.getAbsolutePath());
          Files.move(source, destFile.toPath());
        } else if (operation == FileManager.OP_COPY) {
          logger.fine("copy source: " + source.toString() + ", destFile: " + destFile.getAbsolutePath());
          Files.copy(source, destFile.toPath());
        }
      }
    } else {
     Files.delete((Path) file);
    }
    return FileVisitResult.CONTINUE;
  }
 
  @Override
  public FileVisitResult visitFileFailed(Object file, IOException exc) throws IOException {
    return FileVisitResult.CONTINUE;
  }
 
  @Override
  public FileVisitResult postVisitDirectory(Object dir, IOException exc) throws IOException {
    if (operation != FileManager.OP_DELETE) {
      if (dir instanceof Path) {
        Path finishedDir = (Path) dir;
        targetDir = targetDir.getParent();
        if(operation == FileManager.OP_MOVE) {
          logger.fine("delete " + finishedDir.toString());
          Files.delete(finishedDir);
        }
      }
      logger.fine("targetDir now: " + targetDir.toString());
    } else {
      Files.delete((Path) dir);
    }
    return FileVisitResult.CONTINUE;
  }
 
}