diff --git a/src/main/java/run/halo/app/controller/admin/api/ThemeController.java b/src/main/java/run/halo/app/controller/admin/api/ThemeController.java index c45f3c922..4192542b7 100644 --- a/src/main/java/run/halo/app/controller/admin/api/ThemeController.java +++ b/src/main/java/run/halo/app/controller/admin/api/ThemeController.java @@ -65,8 +65,8 @@ public class ThemeController { } @GetMapping("files/custom") - public List customTemplate() { - return themeService.getCustomTpl(themeService.getActivatedThemeId()); + public Set customTemplate() { + return themeService.listCustomTemplates(themeService.getActivatedThemeId()); } @PostMapping("{themeId}/activation") diff --git a/src/main/java/run/halo/app/service/ThemeService.java b/src/main/java/run/halo/app/service/ThemeService.java index 6d2db16ff..2ec7841b2 100644 --- a/src/main/java/run/halo/app/service/ThemeService.java +++ b/src/main/java/run/halo/app/service/ThemeService.java @@ -66,6 +66,8 @@ public interface ThemeService { */ String THEMES_CACHE_KEY = "themes"; + String CUSTOM_SHEET_PREFIX = "sheet_"; + /** * Get theme property by theme id. * @@ -109,12 +111,12 @@ public interface ThemeService { List listThemeFolderBy(@NonNull String themeId); /** - * Gets custom template, such as page_xxx.ftl, and xxx will be template name + * Lists a set of custom template, such as sheet_xxx.ftl, and xxx will be template name * - * @param themeId theme id - * @return List + * @param themeId theme id must not be blank + * @return a set of templates */ - List getCustomTpl(@NonNull String themeId); + Set listCustomTemplates(@NonNull String themeId); /** * Judging whether template exists under the specified theme @@ -130,14 +132,7 @@ public interface ThemeService { * @param themeId theme name * @return boolean */ - boolean isThemeExist(@NonNull String themeId); - - /** - * Gets theme base path. - * - * @return File - */ - File getThemeBasePath(); + boolean themeExists(@NonNull String themeId); /** * Gets theme base path. diff --git a/src/main/java/run/halo/app/service/impl/ThemeServiceImpl.java b/src/main/java/run/halo/app/service/impl/ThemeServiceImpl.java index d140ba312..ed6235cf1 100644 --- a/src/main/java/run/halo/app/service/impl/ThemeServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/ThemeServiceImpl.java @@ -3,8 +3,6 @@ package run.halo.app.service.impl; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.FileReader; import cn.hutool.core.io.file.FileWriter; -import cn.hutool.core.util.StrUtil; -import freemarker.template.Configuration; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.eclipse.jgit.api.Git; @@ -38,7 +36,6 @@ import run.halo.app.utils.FilenameUtils; import run.halo.app.utils.HaloUtils; import java.io.ByteArrayInputStream; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -60,14 +57,12 @@ public class ThemeServiceImpl implements ThemeService { /** * Theme work directory. */ - private final Path workDir; + private final Path themeWorkDir; private final OptionService optionService; private final StringCacheStore cacheStore; - private final Configuration configuration; - private final ThemeConfigResolver themeConfigResolver; private final ThemePropertyResolver themePropertyResolver; @@ -89,19 +84,17 @@ public class ThemeServiceImpl implements ThemeService { public ThemeServiceImpl(HaloProperties haloProperties, OptionService optionService, StringCacheStore cacheStore, - Configuration configuration, ThemeConfigResolver themeConfigResolver, ThemePropertyResolver themePropertyResolver, RestTemplate restTemplate, ApplicationEventPublisher eventPublisher) { this.optionService = optionService; this.cacheStore = cacheStore; - this.configuration = configuration; this.themeConfigResolver = themeConfigResolver; this.themePropertyResolver = themePropertyResolver; this.restTemplate = restTemplate; - workDir = Paths.get(haloProperties.getWorkDir(), THEME_FOLDER); + themeWorkDir = Paths.get(haloProperties.getWorkDir(), THEME_FOLDER); this.eventPublisher = eventPublisher; } @@ -114,8 +107,10 @@ public class ThemeServiceImpl implements ThemeService { public Optional getThemeBy(String themeId) { Assert.hasText(themeId, "Theme id must not be blank"); + // Get all themes Set themes = getThemes(); + // filter and find first return themes.stream().filter(themeProperty -> StringUtils.equals(themeProperty.getId(), themeId)).findFirst(); } @@ -165,19 +160,23 @@ public class ThemeServiceImpl implements ThemeService { } @Override - public List getCustomTpl(String themeId) { - List templates = new ArrayList<>(); - File themePath = new File(getThemeBasePath(), themeId); - File[] themeFiles = themePath.listFiles(); - if (null != themeFiles && themeFiles.length > 0) { - for (File file : themeFiles) { - String[] split = StrUtil.removeSuffix(file.getName(), HaloConst.SUFFIX_FTL).split("_"); - if (split.length == 2 && "sheet".equals(split[0])) { - templates.add(StrUtil.removeSuffix(file.getName(), HaloConst.SUFFIX_FTL)); - } - } + public Set listCustomTemplates(String themeId) { + // Get the theme path + Path themePath = Paths.get(getThemeOfNonNullBy(themeId).getThemePath()); + + try { + return Files.list(themePath) + .filter(path -> StringUtils.startsWithIgnoreCase(path.getFileName().toString(), CUSTOM_SHEET_PREFIX)) + .map(path -> { + // Remove prefix + String customTemplate = StringUtils.removeStartIgnoreCase(path.getFileName().toString(), CUSTOM_SHEET_PREFIX); + // Remove suffix + return StringUtils.removeEndIgnoreCase(customTemplate, HaloConst.SUFFIX_FTL); + }) + .collect(Collectors.toSet()); + } catch (IOException e) { + throw new ServiceException("Failed to list files of path " + themePath.toString(), e); } - return templates; } @Override @@ -185,7 +184,7 @@ public class ThemeServiceImpl implements ThemeService { Assert.hasText(template, "Template must not be blank"); // Resolve template path - Path templatePath = getBasePath().resolve(getActivatedTheme().getFolderName()).resolve(template); + Path templatePath = Paths.get(getActivatedTheme().getThemePath(), template); // Check the directory checkDirectory(templatePath.toString()); @@ -195,18 +194,13 @@ public class ThemeServiceImpl implements ThemeService { } @Override - public boolean isThemeExist(String themeId) { + public boolean themeExists(String themeId) { return getThemeBy(themeId).isPresent(); } - @Override - public File getThemeBasePath() { - return getBasePath().toFile(); - } - @Override public Path getBasePath() { - return workDir; + return themeWorkDir; } @Override @@ -400,7 +394,7 @@ public class ThemeServiceImpl implements ThemeService { } // Copy the temporary path to current theme folder - Path targetThemePath = workDir.resolve(tmpThemeProperty.getId()); + Path targetThemePath = themeWorkDir.resolve(tmpThemeProperty.getId()); FileUtils.copyFolder(themeTmpPath, targetThemePath); // Get property again