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
parent
4dcbbcd244
commit
b39aacdcec
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue