diff --git a/ccm-core/src/main/java/org/libreccm/theming/FileSystemThemeProvider.java b/ccm-core/src/main/java/org/libreccm/theming/FileSystemThemeProvider.java
index 00dde8161..d1b285a53 100644
--- a/ccm-core/src/main/java/org/libreccm/theming/FileSystemThemeProvider.java
+++ b/ccm-core/src/main/java/org/libreccm/theming/FileSystemThemeProvider.java
@@ -49,23 +49,26 @@ import javax.inject.Inject;
/**
* {@link ThemeProvider} implementation that loads themes from the file system
* using {@link CcmFiles}.
- *
+ *
* @author Jens Pelzetter
*/
@RequestScoped
public class FileSystemThemeProvider implements ThemeProvider {
private static final long serialVersionUID = 1L;
-
+
private static final Logger LOGGER = LogManager.getLogger(
FileSystemThemeProvider.class
);
private static final String BASE_PATH = "/themes";
+
private static final String DRAFT_THEMES_PATH = BASE_PATH + "/draft";
+
private static final String LIVE_THEMES_PATH = BASE_PATH + "/live";
private static final String THEME_JSON = "%s/theme.json";
+
private static final String THEME_XML = "%s/theme.xml";
@Inject
@@ -81,10 +84,14 @@ public class FileSystemThemeProvider implements ThemeProvider {
public String getName() {
return "FileSystemThemeProvider";
}
-
+
+ @Override
+ public String getClassName() {
+ return FileSystemThemeProvider.class.getName();
+ }
+
@Override
public List getThemes() {
-
try {
if (!ccmFiles.isDirectory(BASE_PATH)
|| !ccmFiles.isDirectory(DRAFT_THEMES_PATH)) {
@@ -101,10 +108,10 @@ public class FileSystemThemeProvider implements ThemeProvider {
.collect(Collectors.toList());
} catch (FileAccessException
- | FileDoesNotExistException
- | InsufficientPermissionsException ex) {
+ | FileDoesNotExistException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
- } catch(CcmFilesNotConfiguredException ex) {
+ } catch (CcmFilesNotConfiguredException ex) {
LOGGER.warn(ex);
return Collections.emptyList();
}
@@ -128,11 +135,11 @@ public class FileSystemThemeProvider implements ThemeProvider {
.map(info -> info.get())
.collect(Collectors.toList());
} catch (FileAccessException
- | FileDoesNotExistException
- | InsufficientPermissionsException ex) {
+ | FileDoesNotExistException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
- } catch(CcmFilesNotConfiguredException ex) {
+ } catch (CcmFilesNotConfiguredException ex) {
LOGGER.warn(ex);
return Collections.emptyList();
}
@@ -172,8 +179,8 @@ public class FileSystemThemeProvider implements ThemeProvider {
ccmFiles.createDirectory(String.format(DRAFT_THEMES_PATH + "/%s",
themeName));
} catch (FileAccessException
- | FileAlreadyExistsException
- | InsufficientPermissionsException ex) {
+ | FileAlreadyExistsException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
@@ -187,7 +194,7 @@ public class FileSystemThemeProvider implements ThemeProvider {
+ ThemeConstants.THEME_MANIFEST_JSON,
themeName));
} catch (FileAccessException
- | InsufficientPermissionsException ex) {
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
@@ -231,9 +238,9 @@ public class FileSystemThemeProvider implements ThemeProvider {
themeName),
true);
} catch (FileAccessException
- | FileDoesNotExistException
- | DirectoryNotEmptyException
- | InsufficientPermissionsException ex) {
+ | FileDoesNotExistException
+ | DirectoryNotEmptyException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
}
@@ -270,8 +277,8 @@ public class FileSystemThemeProvider implements ThemeProvider {
}
} catch (FileAccessException
- | FileDoesNotExistException
- | InsufficientPermissionsException ex) {
+ | FileDoesNotExistException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
@@ -311,8 +318,8 @@ public class FileSystemThemeProvider implements ThemeProvider {
return Optional.of(ccmFiles.createInputStream(filePath));
}
} catch (FileAccessException
- | FileDoesNotExistException
- | InsufficientPermissionsException ex) {
+ | FileDoesNotExistException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
@@ -330,7 +337,7 @@ public class FileSystemThemeProvider implements ThemeProvider {
return ccmFiles.createOutputStream(filePath);
} catch (FileAccessException
- | InsufficientPermissionsException ex) {
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
@@ -345,9 +352,9 @@ public class FileSystemThemeProvider implements ThemeProvider {
try {
ccmFiles.deleteFile(filePath, true);
} catch (FileAccessException
- | FileDoesNotExistException
- | DirectoryNotEmptyException
- | InsufficientPermissionsException ex) {
+ | FileDoesNotExistException
+ | DirectoryNotEmptyException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
@@ -378,8 +385,8 @@ public class FileSystemThemeProvider implements ThemeProvider {
ccmFiles.createDirectory(LIVE_THEMES_PATH);
}
} catch (FileAccessException
- | InsufficientPermissionsException
- | FileAlreadyExistsException ex) {
+ | InsufficientPermissionsException
+ | FileAlreadyExistsException ex) {
throw new UnexpectedErrorException(ex);
}
@@ -395,10 +402,10 @@ public class FileSystemThemeProvider implements ThemeProvider {
ccmFiles.moveFile(liveThemePathTmp, liveThemePath);
} catch (DirectoryNotEmptyException
- | FileAccessException
- | FileAlreadyExistsException
- | FileDoesNotExistException
- | InsufficientPermissionsException ex) {
+ | FileAccessException
+ | FileAlreadyExistsException
+ | FileDoesNotExistException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
}
@@ -411,9 +418,9 @@ public class FileSystemThemeProvider implements ThemeProvider {
try {
ccmFiles.deleteFile(liveThemePath, true);
} catch (DirectoryNotEmptyException
- | FileAccessException
- | FileDoesNotExistException
- | InsufficientPermissionsException ex) {
+ | FileAccessException
+ | FileDoesNotExistException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
}
@@ -437,12 +444,15 @@ public class FileSystemThemeProvider implements ThemeProvider {
private Optional readInfo(final String themeName) {
final ThemeManifest manifest;
+ final ThemeVersion themeVersion;
try {
final String jsonPath = String.format(
- DRAFT_THEMES_PATH + "/" + THEME_JSON, themeName);
+ DRAFT_THEMES_PATH + "/" + THEME_JSON, themeName
+ );
final String xmlPath = String.format(
- DRAFT_THEMES_PATH + "/" + THEME_XML, themeName);
+ DRAFT_THEMES_PATH + "/" + THEME_XML, themeName
+ );
if (ccmFiles.existsFile(jsonPath)) {
final InputStream inputStream = ccmFiles
@@ -455,15 +465,32 @@ public class FileSystemThemeProvider implements ThemeProvider {
} else {
return Optional.empty();
}
+
+ final String liveJsonPath = String.format(
+ LIVE_THEMES_PATH + "/" + THEME_JSON, themeName
+ );
+ final String liveXmlPath = String.format(
+ LIVE_THEMES_PATH + "/" + THEME_XML, themeName
+ );
+ final boolean hasLiveVersion
+ = ccmFiles.existsFile(liveJsonPath)
+ || ccmFiles.existsFile(liveXmlPath);
+ if (hasLiveVersion) {
+ themeVersion = ThemeVersion.LIVE;
+ } else {
+ themeVersion = ThemeVersion.DRAFT;
+ }
} catch (FileAccessException
- | FileDoesNotExistException
- | InsufficientPermissionsException ex) {
+ | FileDoesNotExistException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
final ThemeInfo themeInfo = new ThemeInfo();
themeInfo.setManifest(manifest);
+ themeInfo.setProvider(FileSystemThemeProvider.class);
+ themeInfo.setVersion(themeVersion);
return Optional.of(themeInfo);
}
@@ -473,12 +500,12 @@ public class FileSystemThemeProvider implements ThemeProvider {
final String path;
if (themePath.endsWith("/")
- || filePath.startsWith("/")) {
+ || filePath.startsWith("/")) {
path = String.join("", themePath, filePath);
} else {
- path= String.join("/", themePath, filePath);
+ path = String.join("/", themePath, filePath);
}
-
+
final String name;
if (path.startsWith(("/"))) {
name = path;
@@ -496,8 +523,8 @@ public class FileSystemThemeProvider implements ThemeProvider {
return fileInfo;
} catch (FileAccessException
- | FileDoesNotExistException
- | InsufficientPermissionsException ex) {
+ | FileDoesNotExistException
+ | InsufficientPermissionsException ex) {
throw new UnexpectedErrorException(ex);
}
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 0c03cec1f..5ebc343b6 100644
--- a/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java
+++ b/ccm-core/src/main/java/org/libreccm/theming/StaticThemeProvider.java
@@ -91,6 +91,11 @@ public class StaticThemeProvider implements ThemeProvider {
public String getName() {
return "StaticThemeProvider";
}
+
+ @Override
+ public String getClassName() {
+ return StaticThemeProvider.class.getName();
+ }
@Override
public List getThemes() {
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 885424340..93f8171ce 100644
--- a/ccm-core/src/main/java/org/libreccm/theming/ThemeProvider.java
+++ b/ccm-core/src/main/java/org/libreccm/theming/ThemeProvider.java
@@ -38,10 +38,20 @@ public interface ThemeProvider extends Serializable {
/**
* A human readable name for the {@code ThemeProvider} implementation.
- * @return
+ *
+ * @return
*/
String getName();
-
+
+ /**
+ * The class name of the theme provider. This method is necessary because
+ * using {@link Object#getClass() } may return the class name of the CDI
+ * proxy and not of the implementing class.
+ *
+ * @return The class name of the {@code ThemeProvider} implementation.
+ */
+ String getClassName();
+
/**
* Provides a list of all themes provided by this theme provider. The list
* should be ordered by the name of the theme.
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 8601065d7..f393c5929 100644
--- a/ccm-core/src/main/java/org/libreccm/theming/Themes.java
+++ b/ccm-core/src/main/java/org/libreccm/theming/Themes.java
@@ -99,9 +99,9 @@ public class Themes implements Serializable {
* @return An {@link Optional} with informations about theme {@code theme}
* or an empty optional if there is no such theme.
*/
- public Optional getTheme(final String name,
- final ThemeVersion version) {
-
+ public Optional getTheme(
+ final String name, final ThemeVersion version
+ ) {
for (final ThemeProvider provider : providers) {
if (provider.providesTheme(name, version)) {
return provider.getThemeInfo(name, version);
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 bceb2da3c..c6f75c3d7 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
@@ -75,6 +75,11 @@ public class DatabaseThemeProvider implements ThemeProvider {
public String getName() {
return "DatabaseThemeProvider";
}
+
+ @Override
+ public String getClassName() {
+ return DatabaseThemeProvider.class.getName();
+ }
@Override
@Transactional(Transactional.TxType.REQUIRED)
diff --git a/ccm-core/src/main/java/org/libreccm/theming/mvc/ThemesMvc.java b/ccm-core/src/main/java/org/libreccm/theming/mvc/ThemesMvc.java
index 5628eff4c..d1c989b2c 100644
--- a/ccm-core/src/main/java/org/libreccm/theming/mvc/ThemesMvc.java
+++ b/ccm-core/src/main/java/org/libreccm/theming/mvc/ThemesMvc.java
@@ -206,7 +206,8 @@ public class ThemesMvc {
private ThemeInfo getTheme(
final Site site,
final String theme,
- final ThemeVersion themeVersion) {
+ final ThemeVersion themeVersion
+ ) {
if (DEFAULT_THEME_PARAM.equals(theme)) {
return themes
.getTheme(site.getDefaultTheme(), themeVersion)
diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/themes/ThemesModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/themes/ThemesModel.java
index ffa55f47c..be7f3cf48 100644
--- a/ccm-core/src/main/java/org/libreccm/ui/admin/themes/ThemesModel.java
+++ b/ccm-core/src/main/java/org/libreccm/ui/admin/themes/ThemesModel.java
@@ -79,7 +79,7 @@ public class ThemesModel {
.filter(ThemeProvider::supportsDraftThemes)
.collect(
Collectors.toMap(
- provider -> provider.getClass().getName(),
+ provider -> provider.getClassName(),
provider -> provider.getName()
)
);