1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.waarp.openr66.protocol.utils;
21
22 import org.waarp.common.command.exception.CommandAbstractException;
23 import org.waarp.common.digest.FilesystemBasedDigest;
24 import org.waarp.common.digest.FilesystemBasedDigest.DigestAlgo;
25 import org.waarp.common.file.AbstractDir;
26 import org.waarp.common.logging.WaarpLogger;
27 import org.waarp.openr66.context.R66Session;
28 import org.waarp.openr66.context.filesystem.R66File;
29 import org.waarp.openr66.context.task.exception.OpenR66RunnerErrorException;
30
31 import java.io.IOException;
32 import java.security.NoSuchAlgorithmException;
33
34
35
36
37 public final class FileUtils {
38
39 private static final byte[] EMPTY_ARRAY = {};
40
41 private FileUtils() {
42 }
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 public static R66File getFile(final WaarpLogger logger,
60 final R66Session session,
61 final String filenameSrc,
62 final boolean isPreStart,
63 final boolean isSender, final boolean isThrough,
64 R66File file)
65 throws OpenR66RunnerErrorException {
66 String filename;
67 logger.debug("PreStart: {}", isPreStart);
68 logger.debug("Dir is: {}", session.getDir().getFullPath());
69 logger.debug("File is: {}", filenameSrc);
70 if (isPreStart) {
71 filename = AbstractDir.normalizePath(filenameSrc);
72 filename = AbstractDir.pathFromURI(filename);
73 logger.debug("File becomes: {}", filename);
74 } else {
75 filename = filenameSrc;
76 }
77 if (isSender) {
78 try {
79 if (file == null) {
80 try {
81 file = (R66File) session.getDir().setFile(filename, false);
82 } catch (final CommandAbstractException e) {
83 logger.warn("File not placed in normal directory" + " : {}",
84 e.getMessage());
85
86
87 file = session.getDir().setFileNoCheck(filename);
88 }
89 }
90 if (isThrough) {
91
92 logger.debug("File is in through mode: {}", file);
93 } else if (!file.canRead()) {
94 logger.debug(
95 "File {} cannot be read, so try external from " + filename, file);
96
97
98 final R66File file2 =
99 new R66File(session, session.getDir(), filename);
100 if (!file2.canRead()) {
101 throw new OpenR66RunnerErrorException(
102 "File cannot be read: " + file.getTrueFile().getAbsolutePath());
103 }
104 file = file2;
105 }
106 } catch (final CommandAbstractException e) {
107 throw new OpenR66RunnerErrorException(e);
108 }
109 } else {
110
111 file = new R66File(session, session.getDir(), filename);
112 }
113 return file;
114 }
115
116
117
118
119
120
121
122
123
124 public static byte[] getHash(final byte[] buffer, final int size,
125 final DigestAlgo algo,
126 final FilesystemBasedDigest digestGlobal) {
127 if (buffer == null || size == 0) {
128 return EMPTY_ARRAY;
129 }
130 final byte[] newkey;
131 try {
132 if (digestGlobal == null) {
133 newkey = FilesystemBasedDigest.getHash(buffer, size, algo);
134 } else {
135 final FilesystemBasedDigest digestPacket =
136 new FilesystemBasedDigest(algo);
137 digestPacket.Update(buffer, 0, size);
138 newkey = digestPacket.Final();
139 digestGlobal.Update(buffer, 0, size);
140 }
141 } catch (final IOException e) {
142 return EMPTY_ARRAY;
143 } catch (final NoSuchAlgorithmException e) {
144 return EMPTY_ARRAY;
145 }
146 return newkey;
147 }
148
149
150
151
152
153
154
155
156
157 public static void computeGlobalHash(final FilesystemBasedDigest digestGlobal,
158 final FilesystemBasedDigest digestLocal,
159 final byte[] buffer, final int size) {
160 if (buffer == null || size == 0) {
161 return;
162 }
163 if (digestGlobal != null) {
164 digestGlobal.Update(buffer, 0, size);
165 }
166 if (digestLocal != null) {
167 digestLocal.Update(buffer, 0, size);
168 }
169 }
170 }