From 9e466cf273992ccbe6490b3236350b888dd2e28e Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Fri, 20 Dec 2019 20:25:28 +0100 Subject: [PATCH] Several bugfixes for Freemarker Libs --- .../CategoryTreeComponentRenderer.java | 4 +- .../org/librecms/pages/CmsPageRenderer.java | 9 +- .../java/org/librecms/pages/PagesRouter.java | 37 +++++ .../themes/freemarker/ccm-cms/pages.ftl | 14 +- .../resources/themes/freemarker/utils.ftl | 13 +- .../categorization/CategoryManager.java | 32 +++++ .../themes/ftllibs-devel/page.html.ftl | 127 +++++++++++++++++- 7 files changed, 225 insertions(+), 11 deletions(-) diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/CategoryTreeComponentRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/CategoryTreeComponentRenderer.java index edd2c9293..c1f552893 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/CategoryTreeComponentRenderer.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/CategoryTreeComponentRenderer.java @@ -72,13 +72,13 @@ public class CategoryTreeComponentRenderer if (!parameters.containsKey(PARAMETER_CATEGORY)) { throw new IllegalArgumentException( - "The parameters map passed to this GreetingItem component does " + "The parameters map passed to this CategoryTree component does " + "not include the parameter \"category\""); } if (!(parameters.get(PARAMETER_CATEGORY) instanceof Category)) { throw new IllegalArgumentException(String - .format("The parameters map passed to this GreetingItem " + .format("The parameters map passed to this CategoryTree " + "component contains the parameter \"category\", but the " + "parameter is not of type \"%s\" but of type \"%s\".", Category.class.getName(), diff --git a/ccm-cms/src/main/java/org/librecms/pages/CmsPageRenderer.java b/ccm-cms/src/main/java/org/librecms/pages/CmsPageRenderer.java index 5a73a92fa..b6e2df0a6 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/CmsPageRenderer.java +++ b/ccm-cms/src/main/java/org/librecms/pages/CmsPageRenderer.java @@ -18,7 +18,7 @@ */ package org.librecms.pages; -import org.libreccm.categorization.CategoryManager; +import org.libreccm.categorization.Category; import org.libreccm.pagemodel.AbstractPageRenderer; import org.libreccm.pagemodel.PageRenderer; @@ -26,7 +26,6 @@ import java.util.HashMap; import java.util.Map; import javax.enterprise.context.RequestScoped; -import javax.inject.Inject; /** * Implementation of {@link PageRenderer} for CMS pages. @@ -46,6 +45,12 @@ public class CmsPageRenderer extends AbstractPageRenderer { PagesRouter.SITE_INFO, parameters.get(PagesRouter.SITE_INFO) ); } + + if (parameters.containsKey(PagesRouter.PAGE_PATH)) { + result.put( + PagesRouter.PAGE_PATH, parameters.get(PagesRouter.PAGE_PATH) + ); + } return result; } diff --git a/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java index 7311c3606..dfb811d9b 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java @@ -26,6 +26,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import org.libreccm.categorization.Category; +import org.libreccm.categorization.CategoryManager; import org.libreccm.categorization.CategoryRepository; import org.libreccm.configuration.ConfigurationManager; import org.libreccm.l10n.GlobalizationHelper; @@ -43,6 +44,7 @@ import java.net.URI; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; @@ -65,6 +67,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import static org.apache.logging.log4j.ThreadContext.*; import static org.librecms.pages.PagesConstants.*; /** @@ -76,6 +79,12 @@ import static org.librecms.pages.PagesConstants.*; @Path("/") public class PagesRouter { + protected static final String PAGE_PATH = "pagePath"; + + protected static final String PAGE_PATH_CATEGORY_NAME = "categoryName"; + + protected static final String PAGE_PATH_CATEGORY_TITLE = "categoryTitle"; + protected static final String SITE_INFO = "siteInfo"; protected static final String SITE_INFO_NAME = "name"; @@ -86,6 +95,9 @@ public class PagesRouter { protected static final String SITE_INFO_LANGS = "supportedLanguages"; + @Inject + private CategoryManager categoryManager; + @Inject private CategoryRepository categoryRepo; @@ -673,6 +685,7 @@ public class PagesRouter { globalizationHelper.setSelectedLocale(locale); + parameters.put(PAGE_PATH, buildPageCategoriesPath(category, locale)); parameters.put(PARAMETER_CATEGORY, category); return pageManager.findPageForCategory(category); } @@ -754,6 +767,30 @@ public class PagesRouter { return buildPage(pageModel, parameters); } + private List> buildPageCategoriesPath( + final Category category, Locale language + ) { + final List categoriesInPath = categoryManager + .getCategoriesInPath(category); + return categoriesInPath + .stream() + .map(cat -> buildPathCategoriesPathEntry(category, language)) + .collect(Collectors.toList()); + } + + private Map buildPathCategoriesPathEntry( + final Category category, Locale language + ) { + + final Map result = new HashMap<>(); + result.put(PAGE_PATH_CATEGORY_NAME, category.getName()); + result.put( + PAGE_PATH_CATEGORY_TITLE, category.getTitle().getValue(language) + ); + + return result; + } + /** * Parse the value of the {@code preview} query parameter. * diff --git a/ccm-cms/src/main/resources/themes/freemarker/ccm-cms/pages.ftl b/ccm-cms/src/main/resources/themes/freemarker/ccm-cms/pages.ftl index 0965b694e..b7279a7b2 100644 --- a/ccm-cms/src/main/resources/themes/freemarker/ccm-cms/pages.ftl +++ b/ccm-cms/src/main/resources/themes/freemarker/ccm-cms/pages.ftl @@ -12,7 +12,7 @@ <#-- Gets the path of the current page. - @return A list of names (URL stubs/slugs) of all categories in the + @return A list of categories of all categories in the path of the current page. --> <#function getPagePath> @@ -34,7 +34,13 @@ @return The currently selected category. --> <#function getSelectedCategory> - <#return getPathPath()?last> + <#if isRootPage()> + <#return null> + <#elseif getPagePath()??> + <#return getPathPath()?last> + <#else> + <#return null> + <#--doc @@ -91,7 +97,7 @@ @return The URL of the root category of the navigation system with the provided ID. --> -<#function getNavigationRootUrl navigationId="categoryMenu" containerId="container"> +<#function getNavigationRootUrl navigationId="categoryTree" containerId="container"> <#return [container][navigationId].url> @@ -151,5 +157,5 @@ @return The model of the index item. --> <#function getGreetingItem containerId="container"> - <#return [container].greetingItem> + <#return eval(containerId).greetingItem> \ No newline at end of file diff --git a/ccm-cms/src/main/resources/themes/freemarker/utils.ftl b/ccm-cms/src/main/resources/themes/freemarker/utils.ftl index f18c888b4..12beb87d1 100644 --- a/ccm-cms/src/main/resources/themes/freemarker/utils.ftl +++ b/ccm-cms/src/main/resources/themes/freemarker/utils.ftl @@ -31,7 +31,7 @@ @return The host name of the site. --> <#function getSiteHostName> - <#return siteInfo.hostName> + <#return siteInfo.host> <#--doc @@ -40,7 +40,16 @@ @return The name of the site. --> <#function getSiteName> - <#return siteInfo.siteName> + <#return siteInfo.name> + + +<#--doc + Get the domain of the site. + + @return The name of the site. +--> +<#function getSiteDomain> + <#return siteInfo.domain> <#--doc diff --git a/ccm-core/src/main/java/org/libreccm/categorization/CategoryManager.java b/ccm-core/src/main/java/org/libreccm/categorization/CategoryManager.java index 7a3080234..41dc93296 100644 --- a/ccm-core/src/main/java/org/libreccm/categorization/CategoryManager.java +++ b/ccm-core/src/main/java/org/libreccm/categorization/CategoryManager.java @@ -54,6 +54,7 @@ import java.util.UUID; */ @RequestScoped public class CategoryManager implements Serializable { + private static final long serialVersionUID = -3354487547729008811L; private static final Logger LOGGER = LogManager.getLogger( @@ -865,6 +866,37 @@ public class CategoryManager implements Serializable { }); } + /** + * Returns a list of all categories in the path to the provided category. + * + * The first entry in the list is the root category, the last entry is the + * provided category. + * + * @param ofCategory The category for whic the tree is generated. + * + * @return A list of a categories in the path of the provided category. + */ + @Transactional(Transactional.TxType.REQUIRED) + public List getCategoriesInPath(final Category ofCategory) { + + Objects.requireNonNull(ofCategory); + + List categories = new ArrayList<>(); + + Category current = categoryRepo.findById(ofCategory.getObjectId()) + .orElseThrow(() -> new IllegalArgumentException(String.format( + "No category with ID %d in the database. Where did that ID come from?", + ofCategory.getObjectId()))); + + while(current.getParentCategory() != null) { + categories.add(current); + current = current.getParentCategory(); + } + Collections.reverse(categories); + + return categories; + } + /** * Returns the path of a category as string. The path of a category are the * names of all its parent categories and the category joined together, diff --git a/ccm-theme-ftllibs-devel/src/main/resources/themes/ftllibs-devel/page.html.ftl b/ccm-theme-ftllibs-devel/src/main/resources/themes/ftllibs-devel/page.html.ftl index 833e9515e..5b5f4cddc 100644 --- a/ccm-theme-ftllibs-devel/src/main/resources/themes/ftllibs-devel/page.html.ftl +++ b/ccm-theme-ftllibs-devel/src/main/resources/themes/ftllibs-devel/page.html.ftl @@ -1,4 +1,8 @@ <#import "/ccm-core/user-banner.ftl" as UserBanner> +<#import "/language.ftl" as Language> +<#import "/utils.ftl" as Utils> +<#import "/ccm-cms/pages.ftl" as Pages> +<#import "/ccm-navigation/navigation.ftl" as Navigation> @@ -7,7 +11,7 @@

FTL Libs Test

-

user-banner.ftl

+

ccm-core/user-banner.ftl as UserBanner

UserBanner.getGreeting
@@ -54,5 +58,126 @@
${UserBanner.getUserFamilyName()}
+

language.ftl as Language

+
+
+
Language.getSupportedLanguages
+
+ <#list Language.getSupportedLanguages()> +
    + <#items as lang> +
  • ${lang}
  • + +
+ <#else> + No supported languages + +
+
+
+
Language.getSupportedLanguages
+
+ <#list Language.getAvailableLanguages()> +
    + <#items as lang> +
  • ${lang}
  • + +
+ <#else> + No languages available + +
+
+ +

utils.ftl as Utils

+
+
+
Utils.getPageApplication()
+
${Utils.getPageApplication()}
+
+
+
Utils.getPageTitle()
+
${Utils.getPageTitle()}
+
+
+
Utils.getSiteHostName()
+
${Utils.getSiteHostName()}
+
+
+
Utils.getSiteHDomain()
+
${Utils.getSiteDomain()}
+
+
+
Utils.getSiteName()
+
${Utils.getSiteName()!""}
+
+
+

ccm-cms/pages.ftl as Pages

+
+
+
Pages.getCategoryPath()
+
+ Path length: ${Pages.getCategoryPath()?size} + <#list Pages.getCategoryPath()> +
    + <#items as cat> +
  • +
    +
    Name
    +
    ${cat.categoryName}
    +
    Title
    +
    ${cat.categoryTitle}
    +
    +
  • + +
+ +
+
+
+
Pages.getPagePath()
+
+ Path length: ${Pages.getPagePath()?size} + <#list Pages.getPagePath()> +
    + <#items as cat> +
  • +
    +
    Name
    +
    ${cat.categoryName}
    +
    Title
    +
    ${cat.categoryTitle}
    +
    +
  • + +
+ +
+
+
+
Pages.isRootPage()
+
${Pages.isRootPage()?c}
+
+
+
Pages.getSelectedCategory()
+
+ <#if Pages.getSelectedCategory()??> + ${Pages.getSelectedCategory()} + <#else> + No category selected. + +
+
+
+

ccm-navigation/navigation.ftl as Navigation

+

+ Note: Deprecated, replaced by ccm-cms/pages.ftl +

+
+
+
Navigation.getCategoryPath
+
${Navigation.getCategoryPath()}
+
+
\ No newline at end of file