From 3fbecb1dce9268eade9da13865a537376c2c0386 Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 25 May 2018 15:39:29 +0000 Subject: [PATCH] CcmNG: Implementation of the delete method for WebDAV access to theme files. git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5452 8810af33-2d31-482b-a856-94f89814c4df --- .../libreccm/theming/StaticThemeProvider.java | 27 ++++++---- .../org/libreccm/theming/ThemeProvider.java | 2 + .../java/org/libreccm/theming/Themes.java | 19 +++++++ .../theming/db/DatabaseThemeProvider.java | 52 +++++++++++++++---- .../libreccm/theming/webdav/ThemeFiles.java | 17 +++++- .../theming/webdav/ThemeFilesLockManager.java | 9 ++++ 6 files changed, 105 insertions(+), 21 deletions(-) diff --git a/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java b/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java index ebaa98f45..fd5521ad5 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java +++ b/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java @@ -282,10 +282,10 @@ public class StaticThemeProvider implements ThemeProvider { final JsonObject indexObj = reader.readObject(); final JsonArray currentDir = indexObj.getJsonArray("files"); currentDir.forEach(value -> LOGGER.warn(value.toString())); - - final Optional targetFile = findFile(pathTokens, + + final Optional targetFile = findFile(pathTokens, currentDir); - + final List result; if (targetFile.isPresent()) { if (targetFile.get().getBoolean("isDirectory")) { @@ -353,6 +353,15 @@ public class StaticThemeProvider implements ThemeProvider { ThemeProvider.class.getName())); } + @Override + public void deleteThemeFile(final String theme, final String path) { + + throw new UnsupportedOperationException(String + .format("This implementation of %s interface does not support " + + "changes to the theme files.", + ThemeProvider.class.getName())); + } + @Override public boolean supportsChanges() { return false; @@ -410,16 +419,16 @@ public class StaticThemeProvider implements ThemeProvider { final String fileName = path.get(0); final Optional fileData = currentDirectory - .stream() - .map(value -> (JsonObject) value) - .filter(value -> filterFileData(value, fileName)) - .findAny(); + .stream() + .map(value -> (JsonObject) value) + .filter(value -> filterFileData(value, fileName)) + .findAny(); if (path.size() == 1) { return fileData; } else { - + if (fileData.get().getBoolean("isDirectory")) { - return findFile(path.subList(1, path.size()), + return findFile(path.subList(1, path.size()), fileData.get().getJsonArray("files")); } else { return Optional.empty(); diff --git a/ccm-core/src/main/java/org/libreccm/theming/ThemeProvider.java b/ccm-core/src/main/java/org/libreccm/theming/ThemeProvider.java index 146e227d9..5ba60ce8c 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/ThemeProvider.java +++ b/ccm-core/src/main/java/org/libreccm/theming/ThemeProvider.java @@ -153,6 +153,8 @@ public interface ThemeProvider extends Serializable { */ OutputStream getOutputStreamForThemeFile(String theme, String path); + void deleteThemeFile(String theme, String path); + /** * Determines if the implementation supports changes to the files of the * themes. diff --git a/ccm-core/src/main/java/org/libreccm/theming/Themes.java b/ccm-core/src/main/java/org/libreccm/theming/Themes.java index 11364262f..af820d717 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/Themes.java +++ b/ccm-core/src/main/java/org/libreccm/theming/Themes.java @@ -225,5 +225,24 @@ public class Themes implements Serializable { theme.getVersion(), path); } + + public void deleteThemeFile(final ThemeInfo theme, + final String path) { + + final Instance forTheme = providers.select( + theme.getProvider()); + + if (forTheme.isUnsatisfied()) { + LOGGER.error("ThemeProvider \"{}\" not found.", + theme.getProvider().getName()); + throw new UnexpectedErrorException(String.format( + "ThemeProvider \"%s\" not found.", + theme.getProvider().getName())); + } + + final ThemeProvider provider = forTheme.get(); + provider.deleteThemeFile(theme.getName(), path); + + } } diff --git a/ccm-core/src/main/java/org/libreccm/theming/db/DatabaseThemeProvider.java b/ccm-core/src/main/java/org/libreccm/theming/db/DatabaseThemeProvider.java index 1c55af8a7..f1d73fe3a 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/db/DatabaseThemeProvider.java +++ b/ccm-core/src/main/java/org/libreccm/theming/db/DatabaseThemeProvider.java @@ -188,15 +188,15 @@ public class DatabaseThemeProvider implements ThemeProvider { Objects.requireNonNull(themeName); Objects.requireNonNull(path); - + if (themeName.matches("\\s*")) { throw new IllegalArgumentException("themeName can't be empty."); } - + if (path.matches("\\s*")) { throw new IllegalArgumentException("path can't be empty."); } - + final Theme theme = themeRepository .findThemeByName(path, ThemeVersion.DRAFT) .orElseThrow(() -> new IllegalArgumentException(String @@ -210,8 +210,8 @@ public class DatabaseThemeProvider implements ThemeProvider { return new DataFileOutputStream((DataFile) file); } else { throw new IllegalArgumentException(String - .format("The path \"%s\" does not point to a DataFile.", - path)); + .format("The path \"%s\" does not point to a DataFile.", + path)); } } @@ -232,16 +232,46 @@ public class DatabaseThemeProvider implements ThemeProvider { .orElseThrow(() -> new IllegalArgumentException(String .format("The path \"%s\" does not point to a directory.", path))); - + if (parent instanceof Directory) { final Directory parentDirectory = (Directory) parent; - + return fileManager.createDataFile(theme, parentDirectory, path); - + } else { - throw new IllegalArgumentException(String - .format("The path \"%s\" does not point to a directory.", - path)); + throw new IllegalArgumentException(String + .format("The path \"%s\" does not point to a directory.", + path)); + } + } + + @Override + public void deleteThemeFile(final String themeName, final String path) { + + Objects.requireNonNull(themeName); + Objects.requireNonNull(path); + + if (themeName.matches("\\s*")) { + throw new IllegalArgumentException("themeName can't be empty."); + } + + if (path.matches("\\s*")) { + throw new IllegalArgumentException("path can't be empty."); + } + + final Theme theme = themeRepository + .findThemeByName(path, ThemeVersion.DRAFT) + .orElseThrow(() -> new IllegalArgumentException(String + .format("Theme \"%s\" does not exist.", themeName))); + + final ThemeFile file = fileRepository + .findByPath(theme, path, ThemeVersion.DRAFT) + .orElse(createDataFile(theme, path)); + + if (file instanceof DataFile) { + fileManager.delete(file); + } else if(file instanceof Directory) { + fileManager.deleteRecursive(file); } } diff --git a/ccm-core/src/main/java/org/libreccm/theming/webdav/ThemeFiles.java b/ccm-core/src/main/java/org/libreccm/theming/webdav/ThemeFiles.java index 0fedd1455..4edb80bcb 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/webdav/ThemeFiles.java +++ b/ccm-core/src/main/java/org/libreccm/theming/webdav/ThemeFiles.java @@ -67,6 +67,7 @@ import java.util.stream.Collectors; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.DELETE; import javax.ws.rs.HeaderParam; import javax.ws.rs.OPTIONS; import javax.ws.rs.core.Context; @@ -93,6 +94,20 @@ public class ThemeFiles { @Inject private ThemeFilesLockManager lockManager; + @DELETE + @Path("/{path}") + public void delete(@PathParam("theme") final String theme, + @PathParam("path") final String path) { + + final ThemeInfo info = themes + .getTheme(theme, ThemeVersion.LIVE) + .orElseThrow(() -> new NotFoundException(String + .format("Theme \"%s\" does not exist.", theme))); + + lockManager.unlockFile(String.format("%s/%s", theme, path)); + themes.deleteThemeFile(info, path); + } + @GET @Path("/{path}") public Response getFile(@PathParam("theme") final String theme, @@ -239,7 +254,7 @@ public class ThemeFiles { @HeaderParam("Lock-Tocken") final String lockToken) { lockManager.unlock(lockToken); - + return Response.status(Response.Status.NO_CONTENT).build(); } diff --git a/ccm-core/src/main/java/org/libreccm/theming/webdav/ThemeFilesLockManager.java b/ccm-core/src/main/java/org/libreccm/theming/webdav/ThemeFilesLockManager.java index c6f16c0ac..192c4d98a 100644 --- a/ccm-core/src/main/java/org/libreccm/theming/webdav/ThemeFilesLockManager.java +++ b/ccm-core/src/main/java/org/libreccm/theming/webdav/ThemeFilesLockManager.java @@ -18,6 +18,8 @@ */ package org.libreccm.theming.webdav; +import org.libreccm.webdav.conditions.LockTokenSubmitted; + import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -94,5 +96,12 @@ class ThemeFilesLockManager { locks.remove(lockToken); lockedFiles.remove(file); } + + protected void unlockFile(final String file) { + + final String lockToken = lockedFiles.get(file); + lockedFiles.remove(file); + locks.remove(lockToken); + } }