From 98078e088fab955ba16145729e60a61c67458617 Mon Sep 17 00:00:00 2001 From: jensp Date: Sat, 10 Mar 2018 17:08:35 +0000 Subject: [PATCH] CCM NG: DatabaseThemeProvider serving themes from the database git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5345 8810af33-2d31-482b-a856-94f89814c4df --- .../theming/db/DatabaseThemeProvider.java | 129 +++++++++++++++++- 1 file changed, 122 insertions(+), 7 deletions(-) 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 525f44aa5..1c55af8a7 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 @@ -28,11 +28,12 @@ import org.libreccm.theming.manifest.ThemeManifest; import org.libreccm.theming.manifest.ThemeManifestUtil; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; -import java.util.Collections; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -149,15 +150,99 @@ public class DatabaseThemeProvider implements ThemeProvider { } @Override - public Optional getThemeFileAsStream(String theme, - ThemeVersion version, - String path) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + @Transactional(Transactional.TxType.REQUIRED) + public Optional getThemeFileAsStream(final String themeName, + final ThemeVersion version, + final String path) { + + final Optional theme = themeRepository + .findThemeByName(themeName, version); + + if (theme.isPresent()) { + final Optional file = fileRepository + .findByPath(theme.get(), path, version); + if (file.isPresent()) { + if (file.get() instanceof DataFile) { + + final DataFile dataFile = (DataFile) file.get(); + + final byte[] data = Arrays + .copyOf(dataFile.getData(), dataFile.getData().length); + + return Optional.of(new ByteArrayInputStream(data)); + } else { + return Optional.empty(); + } + } else { + return Optional.empty(); + } + } else { + return Optional.empty(); + } } @Override - public OutputStream getOutputStreamForThemeFile(String theme, String path) { - throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. + @Transactional(Transactional.TxType.REQUIRED) + public OutputStream getOutputStreamForThemeFile(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) { + return new DataFileOutputStream((DataFile) file); + } else { + throw new IllegalArgumentException(String + .format("The path \"%s\" does not point to a DataFile.", + path)); + } + } + + private DataFile createDataFile(final Theme theme, + final String path) { + + final int lastSlashIndex = path.lastIndexOf('/'); + final String parentPath = path.substring(0, lastSlashIndex); + + if (parentPath.isEmpty()) { + throw new IllegalArgumentException(String.format( + "Path \"%s\" does not point to a file.", path)); + } + + final ThemeFile parent = fileRepository.findByPath(theme, + path, + ThemeVersion.DRAFT) + .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)); + } } @Override @@ -242,4 +327,34 @@ public class DatabaseThemeProvider implements ThemeProvider { return fileInfo; } + private class DataFileOutputStream extends OutputStream { + + private final DataFile dataFile; + private final ByteArrayOutputStream outputStream; + + private DataFileOutputStream(final DataFile dataFile) { + this.dataFile = dataFile; + outputStream = new ByteArrayOutputStream(); + } + + @Override + public void close() throws IOException { + flush(); + outputStream.close(); + } + + @Override + public void flush() throws IOException { + final byte[] data = outputStream.toByteArray(); + dataFile.setData(data); + fileRepository.save(dataFile); + } + + @Override + public void write(final int byteData) throws IOException { + outputStream.write(byteData); + } + + } + }