From a9d8be8a22cb68b2c23efbc3804daccec03dc4ab Mon Sep 17 00:00:00 2001 From: jensp Date: Fri, 26 Jan 2018 18:56:18 +0000 Subject: [PATCH] CCM NG: Combined query parameter for Pages application for previewing ContentItems, PageModel and/or themes on a page (even combinations are possible). git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5224 8810af33-2d31-482b-a856-94f89814c4df --- .../java/org/librecms/pages/PagesRouter.java | 242 ++++++++++++++---- 1 file changed, 190 insertions(+), 52 deletions(-) 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 4d95f732c..6edfc3378 100644 --- a/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java +++ b/ccm-cms/src/main/java/org/librecms/pages/PagesRouter.java @@ -31,17 +31,22 @@ import org.libreccm.configuration.ConfigurationManager; import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.pagemodel.PageModel; import org.libreccm.pagemodel.PageModelManager; +import org.libreccm.pagemodel.PageModelVersion; import org.libreccm.sites.Site; import org.libreccm.sites.SiteRepository; import org.libreccm.theming.ThemeInfo; import org.libreccm.theming.ThemeVersion; import org.libreccm.theming.Themes; +import org.librecms.contentsection.ContentItemVersion; import java.net.URI; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.Set; import javax.annotation.PostConstruct; import javax.enterprise.context.RequestScoped; @@ -173,27 +178,29 @@ public class PagesRouter { @QueryParam("theme") @DefaultValue("--DEFAULT--") final String theme, - @QueryParam("theme-version") - @DefaultValue("LIVE") - final String themeVersion, - @QueryParam("pagemodel-version") - @DefaultValue("LIVE") - final String pageModelVersion) { + @QueryParam("preview") + @DefaultValue("") + final String preview) { + + final Versions versions = generateFromPreviewParam(preview); final Map result; if ("index".equals(itemName)) { result = getCategoryIndexPage(uriInfo, "/", language, - pageModelVersion); + versions.getPageModelVersion()); } else { - result = getCategoryItemPage( - uriInfo, "/", itemName, language, pageModelVersion); + result = getCategoryItemPage(uriInfo, + "/", + itemName, + language, + versions.getPageModelVersion()); } final Site site = getSite(uriInfo); final ThemeInfo themeInfo = getTheme(site, theme, - themeVersion); + versions.getThemeVersion()); return themes.process(result, themeInfo); } @@ -209,9 +216,11 @@ public class PagesRouter { final String itemName, @PathParam("lang") final String language, - @QueryParam("pagemodel-version") - @DefaultValue("LIVE") - final String pageModelVersion) { + @QueryParam("preview") + @DefaultValue("") + final String preview) { + + final Versions versions = generateFromPreviewParam(preview); final ObjectMapper mapper = new ObjectMapper(); @@ -220,13 +229,13 @@ public class PagesRouter { result = getCategoryIndexPage(uriInfo, "/", language, - pageModelVersion); + versions.getPageModelVersion()); } else { result = getCategoryItemPage(uriInfo, "/", itemName, language, - pageModelVersion); + versions.getPageModelVersion()); } try { @@ -248,9 +257,11 @@ public class PagesRouter { final String itemName, @PathParam("lang") final String language, - @QueryParam("pagemodel-version") - @DefaultValue("LIVE") - final String pageModelVersion) { + @QueryParam("preview") + @DefaultValue("") + final String preview) { + + final Versions versions = generateFromPreviewParam(preview); final JacksonXmlModule xmlModule = new JacksonXmlModule(); final ObjectMapper mapper = new XmlMapper(xmlModule); @@ -261,13 +272,13 @@ public class PagesRouter { result = getCategoryIndexPage(uriInfo, "/", language, - pageModelVersion); + versions.getPageModelVersion()); } else { result = getCategoryItemPage(uriInfo, "/", itemName, language, - pageModelVersion); + versions.getPageModelVersion()); } try { @@ -372,8 +383,7 @@ public class PagesRouter { * @param itemName * @param language * @param theme - * @param themeVersion - * @param pageModelVersion + * @param preview * * @return */ @@ -393,29 +403,30 @@ public class PagesRouter { @QueryParam("theme") @DefaultValue("--DEFAULT--") final String theme, - @QueryParam("theme-version") - @DefaultValue("LIVE") - final String themeVersion, - @QueryParam("pagemodel-version") - @DefaultValue("LIVE") - final String pageModelVersion) { + @QueryParam("preview") + @DefaultValue("") + final String preview) { + + final Versions versions = generateFromPreviewParam(preview); final Map result; if ("index".equals(itemName)) { result = getCategoryIndexPage(uriInfo, page, language, - pageModelVersion); + versions.getPageModelVersion()); } else { result = getCategoryItemPage(uriInfo, page, itemName, language, - pageModelVersion); + versions.getPageModelVersion()); } final Site site = getSite(uriInfo); - final ThemeInfo themeInfo = getTheme(site, theme, themeVersion); + final ThemeInfo themeInfo = getTheme(site, + theme, + versions.getThemeVersion()); return themes.process(result, themeInfo); } @@ -427,7 +438,7 @@ public class PagesRouter { * @param page * @param itemName * @param language - * @param pageModelVersion + * @param preview * * @return */ @@ -444,9 +455,11 @@ public class PagesRouter { final String itemName, @PathParam("lang") final String language, - @QueryParam("pagemodel-version") - @DefaultValue("LIVE") - final String pageModelVersion) { + @QueryParam("preview") + @DefaultValue("") + final String preview) { + + final Versions versions = generateFromPreviewParam(preview); final ObjectMapper mapper = new ObjectMapper(); @@ -455,13 +468,13 @@ public class PagesRouter { result = getCategoryIndexPage(uriInfo, page, language, - pageModelVersion); + versions.getPageModelVersion()); } else { result = getCategoryItemPage(uriInfo, page, itemName, language, - pageModelVersion); + versions.getPageModelVersion()); } try { @@ -480,7 +493,7 @@ public class PagesRouter { * @param page * @param itemName * @param language - * @param pageModelVersion + * @param preview * * @return */ @@ -497,9 +510,11 @@ public class PagesRouter { final String itemName, @PathParam("lang") final String language, - @QueryParam("pagemodel-version") - @DefaultValue("LIVE") - final String pageModelVersion) { + @QueryParam("preview") + @DefaultValue("") + final String preview) { + + final Versions versions = generateFromPreviewParam(preview); final JacksonXmlModule xmlModule = new JacksonXmlModule(); final ObjectMapper mapper = new XmlMapper(xmlModule); @@ -510,13 +525,13 @@ public class PagesRouter { result = getCategoryIndexPage(uriInfo, page, language, - pageModelVersion); + versions.getPageModelVersion()); } else { result = getCategoryItemPage(uriInfo, page, itemName, language, - pageModelVersion); + versions.getPageModelVersion()); } try { @@ -590,12 +605,11 @@ public class PagesRouter { private ThemeInfo getTheme(final Site site, final String theme, - final String themeVersion) { + final ThemeVersion themeVersion) { if ("--DEFAULT--".equals(theme)) { return themes - .getTheme(site.getDefaultTheme(), - ThemeVersion.valueOf(themeVersion)) + .getTheme(site.getDefaultTheme(), themeVersion) .orElseThrow(() -> new WebApplicationException( String.format("The configured default theme \"%s\" for " + "site \"%s\" is not available.", @@ -603,8 +617,7 @@ public class PagesRouter { site.getDomainOfSite()), Response.Status.INTERNAL_SERVER_ERROR)); } else { - return themes.getTheme(theme, - ThemeVersion.valueOf(themeVersion)) + return themes.getTheme(theme, themeVersion) .orElseThrow(() -> new WebApplicationException( String.format("The theme \"%s\" is not available.", theme), @@ -660,7 +673,7 @@ public class PagesRouter { final UriInfo uriInfo, final String pagePath, final String language, - final String pageModelVersion) { + final PageModelVersion pageModelVersion) { final Map parameters = new HashMap<>(); final Page page = getPage(uriInfo, @@ -669,7 +682,7 @@ public class PagesRouter { parameters); final PageModel pageModel; - if ("DRAFT".equals(pageModelVersion)) { + if (pageModelVersion == PageModelVersion.DRAFT) { pageModel = pageModelManager .getDraftVersion(page.getIndexPageModel()); } else { @@ -691,14 +704,14 @@ public class PagesRouter { final String pagePath, final String itemName, final String language, - final String pageModelVersion) { + final PageModelVersion pageModelVersion) { final Map parameters = new HashMap<>(); final Page page = PagesRouter.this.getPage(uriInfo, pagePath, language, parameters); final PageModel pageModel; - if ("DRAFT".equals(pageModelVersion)) { + if (pageModelVersion == PageModelVersion.DRAFT) { pageModel = pageModelManager.getDraftVersion(page .getItemPageModel()); } else { @@ -716,4 +729,129 @@ public class PagesRouter { return buildPage(pageModel, parameters); } + /** + * Parse the value of the {@code preview} query parameter. + * + * @param value The value of the {@code preview} query parameter to parse. + * + * @return If the provided value is {@code all} a {@link Versions} object + * with all versions set to the draft versions is created and + * returned. If the provided value is {@code null} or empty a + * {@link Versions} object with fields set the the live versions is + * returned. Otherwise the values is split into tokens (separated by + * commas). The values of the returned {@link Versions} depend on + * presence of certain tokens. At the moment to following tokens are + * recognised: + *
+ *
{@code content}
+ *
{@link Versions#contentVersion} is set to + * {@link ContentItemVersion#DRAFT}
+ *
{@code pagemodel}
+ *
{@link Versions#pageModelVersion} is set to + * {@link PageModelVersion#DRAFT}
+ *
{@code theme}
+ *
{@link Versions#themeVersion} is set to + * {@link ThemeVersion#DRAFT}.
+ *
+ * + */ + private Versions generateFromPreviewParam(final String value) { + + if (value == null || value.isEmpty() || value.matches("\\s*")) { + return new Versions(ContentItemVersion.LIVE, + PageModelVersion.LIVE, + ThemeVersion.LIVE); + } else if ("all".equals(value.toLowerCase(Locale.ROOT))) { + return new Versions(ContentItemVersion.DRAFT, + PageModelVersion.DRAFT, + ThemeVersion.DRAFT); + } else { + final Set values = new HashSet<>(); + Collections.addAll(values, + value.toLowerCase(Locale.ROOT).split(",")); + + final Versions result = new Versions(); + if (values.contains("content")) { + result.setContentVersion(ContentItemVersion.DRAFT); + } + if (values.contains("pagemodel")) { + result.setPageModelVersion(PageModelVersion.DRAFT); + } + if (values.contains("theme")) { + result.setThemeVersion(ThemeVersion.DRAFT); + } + return result; + } + } + + /** + * Encapsulate the result of converting the value of the {@code preview} + * query parameter. + */ + private class Versions { + + /** + * Version of content to use + */ + private ContentItemVersion contentVersion; + /** + * Version of {@link PageModel} to use. + */ + private PageModelVersion pageModelVersion; + /** + * Version of theme to use. + */ + private ThemeVersion themeVersion; + + /** + * Creates a new {@code Versions} object with all fields set to + * {@code live} versions. + */ + public Versions() { + this.contentVersion = ContentItemVersion.LIVE; + this.pageModelVersion = PageModelVersion.LIVE; + this.themeVersion = ThemeVersion.LIVE; + } + + /** + * Create a new {@code Versions} object with the provided parameters. + * + * @param contentVersion + * @param pageModelVersion + * @param themeVersion + */ + public Versions(final ContentItemVersion contentVersion, + final PageModelVersion pageModelVersion, + final ThemeVersion themeVersion) { + this.contentVersion = contentVersion; + this.pageModelVersion = pageModelVersion; + this.themeVersion = themeVersion; + } + + public ContentItemVersion getContentVersion() { + return contentVersion; + } + + public void setContentVersion(final ContentItemVersion contentVersion) { + this.contentVersion = contentVersion; + } + + public PageModelVersion getPageModelVersion() { + return pageModelVersion; + } + + public void setPageModelVersion(final PageModelVersion pageModelVersion) { + this.pageModelVersion = pageModelVersion; + } + + public ThemeVersion getThemeVersion() { + return themeVersion; + } + + public void setThemeVersion(final ThemeVersion themeVersion) { + this.themeVersion = themeVersion; + } + + } + }