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

Former-commit-id: b39aacdcec
pull/2/head
jensp 2018-01-26 18:56:18 +00:00
parent d241de54c9
commit f747e26c4f
1 changed files with 190 additions and 52 deletions

View File

@ -31,17 +31,22 @@ import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.pagemodel.PageModel; import org.libreccm.pagemodel.PageModel;
import org.libreccm.pagemodel.PageModelManager; import org.libreccm.pagemodel.PageModelManager;
import org.libreccm.pagemodel.PageModelVersion;
import org.libreccm.sites.Site; import org.libreccm.sites.Site;
import org.libreccm.sites.SiteRepository; import org.libreccm.sites.SiteRepository;
import org.libreccm.theming.ThemeInfo; import org.libreccm.theming.ThemeInfo;
import org.libreccm.theming.ThemeVersion; import org.libreccm.theming.ThemeVersion;
import org.libreccm.theming.Themes; import org.libreccm.theming.Themes;
import org.librecms.contentsection.ContentItemVersion;
import java.net.URI; import java.net.URI;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
@ -173,27 +178,29 @@ public class PagesRouter {
@QueryParam("theme") @QueryParam("theme")
@DefaultValue("--DEFAULT--") @DefaultValue("--DEFAULT--")
final String theme, final String theme,
@QueryParam("theme-version") @QueryParam("preview")
@DefaultValue("LIVE") @DefaultValue("")
final String themeVersion, final String preview) {
@QueryParam("pagemodel-version")
@DefaultValue("LIVE") final Versions versions = generateFromPreviewParam(preview);
final String pageModelVersion) {
final Map<String, Object> result; final Map<String, Object> result;
if ("index".equals(itemName)) { if ("index".equals(itemName)) {
result = getCategoryIndexPage(uriInfo, result = getCategoryIndexPage(uriInfo,
"/", "/",
language, language,
pageModelVersion); versions.getPageModelVersion());
} else { } else {
result = getCategoryItemPage( result = getCategoryItemPage(uriInfo,
uriInfo, "/", itemName, language, pageModelVersion); "/",
itemName,
language,
versions.getPageModelVersion());
} }
final Site site = getSite(uriInfo); final Site site = getSite(uriInfo);
final ThemeInfo themeInfo = getTheme(site, final ThemeInfo themeInfo = getTheme(site,
theme, theme,
themeVersion); versions.getThemeVersion());
return themes.process(result, themeInfo); return themes.process(result, themeInfo);
} }
@ -209,9 +216,11 @@ public class PagesRouter {
final String itemName, final String itemName,
@PathParam("lang") @PathParam("lang")
final String language, final String language,
@QueryParam("pagemodel-version") @QueryParam("preview")
@DefaultValue("LIVE") @DefaultValue("")
final String pageModelVersion) { final String preview) {
final Versions versions = generateFromPreviewParam(preview);
final ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
@ -220,13 +229,13 @@ public class PagesRouter {
result = getCategoryIndexPage(uriInfo, result = getCategoryIndexPage(uriInfo,
"/", "/",
language, language,
pageModelVersion); versions.getPageModelVersion());
} else { } else {
result = getCategoryItemPage(uriInfo, result = getCategoryItemPage(uriInfo,
"/", "/",
itemName, itemName,
language, language,
pageModelVersion); versions.getPageModelVersion());
} }
try { try {
@ -248,9 +257,11 @@ public class PagesRouter {
final String itemName, final String itemName,
@PathParam("lang") @PathParam("lang")
final String language, final String language,
@QueryParam("pagemodel-version") @QueryParam("preview")
@DefaultValue("LIVE") @DefaultValue("")
final String pageModelVersion) { final String preview) {
final Versions versions = generateFromPreviewParam(preview);
final JacksonXmlModule xmlModule = new JacksonXmlModule(); final JacksonXmlModule xmlModule = new JacksonXmlModule();
final ObjectMapper mapper = new XmlMapper(xmlModule); final ObjectMapper mapper = new XmlMapper(xmlModule);
@ -261,13 +272,13 @@ public class PagesRouter {
result = getCategoryIndexPage(uriInfo, result = getCategoryIndexPage(uriInfo,
"/", "/",
language, language,
pageModelVersion); versions.getPageModelVersion());
} else { } else {
result = getCategoryItemPage(uriInfo, result = getCategoryItemPage(uriInfo,
"/", "/",
itemName, itemName,
language, language,
pageModelVersion); versions.getPageModelVersion());
} }
try { try {
@ -372,8 +383,7 @@ public class PagesRouter {
* @param itemName * @param itemName
* @param language * @param language
* @param theme * @param theme
* @param themeVersion * @param preview
* @param pageModelVersion
* *
* @return * @return
*/ */
@ -393,29 +403,30 @@ public class PagesRouter {
@QueryParam("theme") @QueryParam("theme")
@DefaultValue("--DEFAULT--") @DefaultValue("--DEFAULT--")
final String theme, final String theme,
@QueryParam("theme-version") @QueryParam("preview")
@DefaultValue("LIVE") @DefaultValue("")
final String themeVersion, final String preview) {
@QueryParam("pagemodel-version")
@DefaultValue("LIVE") final Versions versions = generateFromPreviewParam(preview);
final String pageModelVersion) {
final Map<String, Object> result; final Map<String, Object> result;
if ("index".equals(itemName)) { if ("index".equals(itemName)) {
result = getCategoryIndexPage(uriInfo, result = getCategoryIndexPage(uriInfo,
page, page,
language, language,
pageModelVersion); versions.getPageModelVersion());
} else { } else {
result = getCategoryItemPage(uriInfo, result = getCategoryItemPage(uriInfo,
page, page,
itemName, itemName,
language, language,
pageModelVersion); versions.getPageModelVersion());
} }
final Site site = getSite(uriInfo); 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); return themes.process(result, themeInfo);
} }
@ -427,7 +438,7 @@ public class PagesRouter {
* @param page * @param page
* @param itemName * @param itemName
* @param language * @param language
* @param pageModelVersion * @param preview
* *
* @return * @return
*/ */
@ -444,9 +455,11 @@ public class PagesRouter {
final String itemName, final String itemName,
@PathParam("lang") @PathParam("lang")
final String language, final String language,
@QueryParam("pagemodel-version") @QueryParam("preview")
@DefaultValue("LIVE") @DefaultValue("")
final String pageModelVersion) { final String preview) {
final Versions versions = generateFromPreviewParam(preview);
final ObjectMapper mapper = new ObjectMapper(); final ObjectMapper mapper = new ObjectMapper();
@ -455,13 +468,13 @@ public class PagesRouter {
result = getCategoryIndexPage(uriInfo, result = getCategoryIndexPage(uriInfo,
page, page,
language, language,
pageModelVersion); versions.getPageModelVersion());
} else { } else {
result = getCategoryItemPage(uriInfo, result = getCategoryItemPage(uriInfo,
page, page,
itemName, itemName,
language, language,
pageModelVersion); versions.getPageModelVersion());
} }
try { try {
@ -480,7 +493,7 @@ public class PagesRouter {
* @param page * @param page
* @param itemName * @param itemName
* @param language * @param language
* @param pageModelVersion * @param preview
* *
* @return * @return
*/ */
@ -497,9 +510,11 @@ public class PagesRouter {
final String itemName, final String itemName,
@PathParam("lang") @PathParam("lang")
final String language, final String language,
@QueryParam("pagemodel-version") @QueryParam("preview")
@DefaultValue("LIVE") @DefaultValue("")
final String pageModelVersion) { final String preview) {
final Versions versions = generateFromPreviewParam(preview);
final JacksonXmlModule xmlModule = new JacksonXmlModule(); final JacksonXmlModule xmlModule = new JacksonXmlModule();
final ObjectMapper mapper = new XmlMapper(xmlModule); final ObjectMapper mapper = new XmlMapper(xmlModule);
@ -510,13 +525,13 @@ public class PagesRouter {
result = getCategoryIndexPage(uriInfo, result = getCategoryIndexPage(uriInfo,
page, page,
language, language,
pageModelVersion); versions.getPageModelVersion());
} else { } else {
result = getCategoryItemPage(uriInfo, result = getCategoryItemPage(uriInfo,
page, page,
itemName, itemName,
language, language,
pageModelVersion); versions.getPageModelVersion());
} }
try { try {
@ -590,12 +605,11 @@ public class PagesRouter {
private ThemeInfo getTheme(final Site site, private ThemeInfo getTheme(final Site site,
final String theme, final String theme,
final String themeVersion) { final ThemeVersion themeVersion) {
if ("--DEFAULT--".equals(theme)) { if ("--DEFAULT--".equals(theme)) {
return themes return themes
.getTheme(site.getDefaultTheme(), .getTheme(site.getDefaultTheme(), themeVersion)
ThemeVersion.valueOf(themeVersion))
.orElseThrow(() -> new WebApplicationException( .orElseThrow(() -> new WebApplicationException(
String.format("The configured default theme \"%s\" for " String.format("The configured default theme \"%s\" for "
+ "site \"%s\" is not available.", + "site \"%s\" is not available.",
@ -603,8 +617,7 @@ public class PagesRouter {
site.getDomainOfSite()), site.getDomainOfSite()),
Response.Status.INTERNAL_SERVER_ERROR)); Response.Status.INTERNAL_SERVER_ERROR));
} else { } else {
return themes.getTheme(theme, return themes.getTheme(theme, themeVersion)
ThemeVersion.valueOf(themeVersion))
.orElseThrow(() -> new WebApplicationException( .orElseThrow(() -> new WebApplicationException(
String.format("The theme \"%s\" is not available.", String.format("The theme \"%s\" is not available.",
theme), theme),
@ -660,7 +673,7 @@ public class PagesRouter {
final UriInfo uriInfo, final UriInfo uriInfo,
final String pagePath, final String pagePath,
final String language, final String language,
final String pageModelVersion) { final PageModelVersion pageModelVersion) {
final Map<String, Object> parameters = new HashMap<>(); final Map<String, Object> parameters = new HashMap<>();
final Page page = getPage(uriInfo, final Page page = getPage(uriInfo,
@ -669,7 +682,7 @@ public class PagesRouter {
parameters); parameters);
final PageModel pageModel; final PageModel pageModel;
if ("DRAFT".equals(pageModelVersion)) { if (pageModelVersion == PageModelVersion.DRAFT) {
pageModel = pageModelManager pageModel = pageModelManager
.getDraftVersion(page.getIndexPageModel()); .getDraftVersion(page.getIndexPageModel());
} else { } else {
@ -691,14 +704,14 @@ public class PagesRouter {
final String pagePath, final String pagePath,
final String itemName, final String itemName,
final String language, final String language,
final String pageModelVersion) { final PageModelVersion pageModelVersion) {
final Map<String, Object> parameters = new HashMap<>(); final Map<String, Object> parameters = new HashMap<>();
final Page page = PagesRouter.this.getPage(uriInfo, pagePath, language, final Page page = PagesRouter.this.getPage(uriInfo, pagePath, language,
parameters); parameters);
final PageModel pageModel; final PageModel pageModel;
if ("DRAFT".equals(pageModelVersion)) { if (pageModelVersion == PageModelVersion.DRAFT) {
pageModel = pageModelManager.getDraftVersion(page pageModel = pageModelManager.getDraftVersion(page
.getItemPageModel()); .getItemPageModel());
} else { } else {
@ -716,4 +729,129 @@ public class PagesRouter {
return buildPage(pageModel, parameters); 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:
* <dl>
* <dt>{@code content}</dt>
* <dd>{@link Versions#contentVersion} is set to
* {@link ContentItemVersion#DRAFT}</dd>
* <dt>{@code pagemodel}</dt>
* <dd>{@link Versions#pageModelVersion} is set to
* {@link PageModelVersion#DRAFT}</dd>
* <dt>{@code theme}</dt>
* <dd>{@link Versions#themeVersion} is set to
* {@link ThemeVersion#DRAFT}.</dd>
* </dl>
*
*/
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<String> 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;
}
}
} }