Skip to content

Commit 659ffad

Browse files
Merge pull request #220 from wttech/file-manager-repo
File manager - repo
2 parents 3fca05a + 315589f commit 659ffad

File tree

10 files changed

+65
-189
lines changed

10 files changed

+65
-189
lines changed

core/src/main/java/dev/vml/es/acm/core/code/CodeContext.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,6 @@ public class CodeContext {
4040

4141
private final NotificationManager notifier;
4242

43-
private final FileManager fileManager;
44-
4543
public CodeContext(OsgiContext osgiContext, ResourceResolver resourceResolver) {
4644
this.osgiContext = osgiContext;
4745
this.resourceResolver = resourceResolver;
@@ -52,7 +50,6 @@ public CodeContext(OsgiContext osgiContext, ResourceResolver resourceResolver) {
5250
this.activator = new Activator(resourceResolver, osgiContext);
5351
this.formatter = new Formatter();
5452
this.notifier = osgiContext.getService(NotificationManager.class);
55-
this.fileManager = osgiContext.getService(FileManager.class);
5653
this.binding = createBinding();
5754

5855
this.extensionScripts = findExtensionScripts();
@@ -141,8 +138,4 @@ public Formatter getFormatter() {
141138
public NotificationManager getNotifier() {
142139
return notifier;
143140
}
144-
145-
public FileManager getFileManager() {
146-
return fileManager;
147-
}
148141
}

core/src/main/java/dev/vml/es/acm/core/code/CodeOutputFile.java

Lines changed: 0 additions & 90 deletions
This file was deleted.

core/src/main/java/dev/vml/es/acm/core/code/ExecutionQueue.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,6 @@ public class ExecutionQueue implements JobExecutor, EventListener {
6767
@Reference
6868
private Executor executor;
6969

70-
@Reference
71-
private FileManager fileManager;
72-
7370
private ExecutorService jobAsyncExecutor;
7471

7572
private Config config;

core/src/main/java/dev/vml/es/acm/core/code/FileManager.java

Lines changed: 42 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2,97 +2,73 @@
22

33
import dev.vml.es.acm.core.AcmConstants;
44
import dev.vml.es.acm.core.AcmException;
5-
import java.io.*;
6-
import java.nio.file.Files;
7-
import java.text.SimpleDateFormat;
5+
import dev.vml.es.acm.core.repo.Repo;
6+
import dev.vml.es.acm.core.repo.RepoResource;
7+
import java.io.InputStream;
8+
import java.time.LocalDateTime;
9+
import java.time.format.DateTimeFormatter;
810
import java.util.Collections;
9-
import java.util.Date;
1011
import java.util.List;
12+
import java.util.Optional;
1113
import java.util.UUID;
1214
import java.util.stream.Collectors;
13-
import org.apache.commons.io.FileUtils;
14-
import org.apache.commons.io.IOUtils;
15-
import org.osgi.service.component.annotations.Activate;
16-
import org.osgi.service.component.annotations.Component;
15+
import org.apache.commons.lang3.StringUtils;
16+
import org.apache.sling.api.resource.ResourceResolver;
1717

18-
@Component(immediate = true, service = FileManager.class)
1918
public class FileManager {
2019

21-
private static final String ROOT_DIRNAME = "file";
20+
private Repo repo;
2221

23-
private File tempDir;
22+
private RepoResource root;
2423

25-
@Activate
26-
protected void activate() {
27-
this.tempDir =
28-
FileUtils.getTempDirectory().toPath().resolve(AcmConstants.CODE).toFile();
24+
public FileManager(ResourceResolver resolver) {
25+
this.repo = Repo.quiet(resolver);
26+
this.root = repo.get(AcmConstants.VAR_ROOT + "/file");
2927
}
3028

31-
public File tempDir() {
32-
return tempDir;
29+
public Optional<String> find(String path) {
30+
RepoResource resource = findResource(path);
31+
return resource != null ? Optional.of(resource.getPath()) : Optional.empty();
3332
}
3433

35-
public File root() {
36-
return tempDir.toPath().resolve(ROOT_DIRNAME).toFile();
37-
}
38-
39-
public File get(String path) {
40-
File targetFile = new File(path);
41-
validatePath(targetFile);
42-
return targetFile;
43-
}
44-
45-
public File save(InputStream stream, String fileName) {
46-
try {
47-
String datePath = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
48-
String randomDir = UUID.randomUUID().toString();
49-
File dir = new File(root(), datePath + "/" + randomDir);
50-
if (!dir.exists() && !dir.mkdirs()) {
51-
throw new AcmException("File directory cannot be created: " + dir.getAbsolutePath());
52-
}
53-
File file = new File(dir, fileName);
54-
validatePath(file);
55-
if (file.exists()) {
56-
throw new AcmException("File already exists: " + file.getAbsolutePath());
57-
}
58-
try (OutputStream out = Files.newOutputStream(file.toPath())) {
59-
IOUtils.copy(stream, out);
34+
public RepoResource findResource(String path) {
35+
RepoResource relative = root.child(path);
36+
if (relative.exists()) {
37+
return relative;
38+
}
39+
if (StringUtils.startsWith(path, root.getPath() + "/")) {
40+
RepoResource absolute = repo.get(path);
41+
if (absolute.exists()) {
42+
return absolute;
6043
}
61-
return file;
62-
} catch (IOException e) {
63-
throw new AcmException("File cannot be saved: " + fileName, e);
6444
}
45+
return null;
6546
}
6647

67-
public File delete(String path) {
68-
File file = get(path);
69-
if (!file.exists()) {
70-
throw new AcmException(String.format("File to be deleted does not exist '%s'!", path));
71-
}
72-
if (!file.delete()) {
73-
throw new AcmException(String.format("File cannot be deleted '%s'!", path));
74-
}
75-
return file;
48+
public String save(String fileName, InputStream stream) {
49+
LocalDateTime now = LocalDateTime.now();
50+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");
51+
String formattedDate = now.format(formatter);
52+
RepoResource fileResource = root.child(
53+
String.format("%s/%s/%s", formattedDate, UUID.randomUUID().toString(), fileName));
54+
fileResource.parent().ensureRegularFolder();
55+
fileResource.saveFile("application/octet-stream", stream); // TODO tika?
56+
return fileResource.getPath();
7657
}
7758

78-
public List<File> deleteAll(List<String> paths) {
59+
public List<String> deleteAll(List<String> paths) {
7960
if (paths == null || paths.isEmpty()) {
8061
return Collections.emptyList();
8162
}
8263
return paths.stream().map(this::delete).collect(Collectors.toList());
8364
}
8465

85-
private void validatePath(File targetFile) {
86-
try {
87-
File rootDir = root();
88-
String rootCanonical = rootDir.getCanonicalPath();
89-
String targetCanonical = targetFile.getCanonicalPath();
90-
if (!targetCanonical.startsWith(rootCanonical + File.separator) && !targetCanonical.equals(rootCanonical)) {
91-
throw new AcmException(String.format(
92-
"File path '%s' must be within the root directory '%s'!", targetFile.getPath(), rootCanonical));
93-
}
94-
} catch (IOException e) {
95-
throw new AcmException(String.format("File path resolution error '%s'!", targetFile.getPath()), e);
66+
public String delete(String path) {
67+
RepoResource resource = findResource(path);
68+
if (resource == null) {
69+
throw new AcmException(String.format("File to be deleted does not exist '%s'!", path));
9670
}
71+
resource.delete();
72+
return resource.getPath();
9773
}
9874
}
Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package dev.vml.es.acm.core.code.input;
22

33
import dev.vml.es.acm.core.code.InputType;
4-
import java.io.File;
54

6-
public class FileInput extends AbstractFileInput<File> {
5+
public class FileInput extends AbstractFileInput<String> {
76

87
public FileInput(String name) {
9-
super(name, InputType.FILE, File.class);
8+
super(name, InputType.FILE, String.class);
109
}
1110
}

core/src/main/java/dev/vml/es/acm/core/code/input/MultiFileInput.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package dev.vml.es.acm.core.code.input;
22

33
import dev.vml.es.acm.core.code.InputType;
4-
import java.io.File;
54

6-
public class MultiFileInput extends AbstractFileInput<File[]> {
5+
public class MultiFileInput extends AbstractFileInput<String[]> {
76

87
private Integer min;
98

109
private Integer max;
1110

1211
public MultiFileInput(String name) {
13-
super(name, InputType.MULTIFILE, File[].class);
12+
super(name, InputType.MULTIFILE, String[].class);
1413
}
1514

1615
public Integer getMin() {
Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package dev.vml.es.acm.core.servlet;
22

3-
import java.io.File;
43
import java.io.Serializable;
54
import java.util.List;
65

76
public class FileOutput implements Serializable {
87

9-
private List<File> files;
8+
private List<String> files;
109

11-
public FileOutput(List<File> files) {
10+
public FileOutput(List<String> files) {
1211
this.files = files;
1312
}
1413

15-
public List<File> getFiles() {
14+
public List<String> getFiles() {
1615
return files;
1716
}
1817
}

core/src/main/java/dev/vml/es/acm/core/servlet/FileServlet.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import static dev.vml.es.acm.core.util.ServletUtils.stringsParam;
77

88
import dev.vml.es.acm.core.code.FileManager;
9-
import java.io.File;
109
import java.io.IOException;
1110
import java.util.LinkedList;
1211
import java.util.List;
@@ -17,7 +16,6 @@
1716
import org.apache.sling.api.servlets.ServletResolverConstants;
1817
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
1918
import org.osgi.service.component.annotations.Component;
20-
import org.osgi.service.component.annotations.Reference;
2119
import org.slf4j.Logger;
2220
import org.slf4j.LoggerFactory;
2321

@@ -37,17 +35,15 @@ public class FileServlet extends SlingAllMethodsServlet {
3735

3836
private static final String PATH_PARAM = "path";
3937

40-
@Reference
41-
private transient FileManager manager;
42-
4338
@Override
4439
protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
4540
try {
46-
List<File> filesUploaded = new LinkedList<>();
41+
List<String> filesUploaded = new LinkedList<>();
42+
FileManager manager = new FileManager(request.getResourceResolver());
4743
for (Part part : request.getParts()) {
4844
if (part.getSubmittedFileName() != null) {
49-
File file = manager.save(part.getInputStream(), part.getSubmittedFileName());
50-
filesUploaded.add(file);
45+
String filePath = manager.save(part.getSubmittedFileName(), part.getInputStream());
46+
filesUploaded.add(filePath);
5147
}
5248
}
5349
FileOutput output = new FileOutput(filesUploaded);
@@ -65,7 +61,8 @@ protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse
6561
protected void doDelete(SlingHttpServletRequest request, SlingHttpServletResponse response) throws IOException {
6662
try {
6763
List<String> paths = stringsParam(request, PATH_PARAM);
68-
List<File> deleted = manager.deleteAll(paths);
64+
FileManager manager = new FileManager(request.getResourceResolver());
65+
List<String> deleted = manager.deleteAll(paths);
6966
FileOutput output = new FileOutput(deleted);
7067
respondJson(response, ok("Files deleted successfully", output));
7168
} catch (Exception e) {

ui.content.example/src/main/content/jcr_root/conf/acm/settings/script/manual/example/ACME-202_page-thumbnail.groovy

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,13 @@ boolean canRun() {
1616
}
1717

1818
void doRun() {
19+
def pageThumnail = repo.get(inputs.value("pageThumbnailFile"))
1920
def page = repo.get(inputs.value("pagePath"))
20-
def pageImage = page.child("jcr:content/image").ensure("nt:unstructured")
21-
pageImage.child("file/jcr:content/dam:thumbnails").delete()
22-
pageImage.child("file").saveFile("image/jpeg", inputs.value("pageThumbnailFile"))
21+
try {
22+
def pageImage = page.child("jcr:content/image").ensure("nt:unstructured")
23+
pageImage.child("file/jcr:content/dam:thumbnails").delete()
24+
pageImage.child("file").saveFile("image/jpeg", pageThumnail.readFileAsStream())
25+
} finally {
26+
pageThumnail.delete()
27+
}
2328
}

ui.content/src/main/content/jcr_root/conf/acm/settings/snippet/available/core/input/file.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ documentation: |
1515
1616
Usage:
1717
```groovy
18-
def file = inputs.value("imageFile") // java.io.File
18+
def file = repo.get(inputs.value("imageFile"))
19+
file.readFileAsStream()
1920
```

0 commit comments

Comments
 (0)