Opitimizations of models for MVC based pages application.
parent
23f1fb1992
commit
4f48eb9354
|
|
@ -0,0 +1,62 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>LibreCCM Devel Theme</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>LibreCCM Devel</h1>
|
||||||
|
<h2>Site Info</h2>
|
||||||
|
<dl>
|
||||||
|
<dt>host</dt>
|
||||||
|
<dd>${CmsPagesSiteInfoModel.host}</dd>
|
||||||
|
<dt>domain</dt>
|
||||||
|
<dd>${CmsPagesSiteInfoModel.domain}</dd>
|
||||||
|
<dt>name</dt>
|
||||||
|
<dd>${CmsPagesSiteInfoModel.name}</dd>
|
||||||
|
<dt>Current category</dt>
|
||||||
|
<dd>${CmsPagesCategoryModel.category.name}</dd>
|
||||||
|
</dl>
|
||||||
|
<h2>Category Tree</h2>
|
||||||
|
<ul>
|
||||||
|
<!--<#list CmsPagesCategoryModel.categoryTree.subCategories as category>
|
||||||
|
<@categoryTreeNode category />
|
||||||
|
</#list>-->
|
||||||
|
<@categoryTreeNode CmsPagesCategoryModel.categoryTree />
|
||||||
|
</ul>
|
||||||
|
<h2>(Index) Item</h2>
|
||||||
|
<#if (CmsPagesCategoryModel.category.hasIndexItem)>
|
||||||
|
<dl>
|
||||||
|
<dt>Name</dt>
|
||||||
|
<dd>${CmsPagesCategorizedItemModel.name}</dd>
|
||||||
|
<dt>Title</dt>
|
||||||
|
<dd>${CmsPagesCategorizedItemModel.title}</dd>
|
||||||
|
<dt>Description</dt>
|
||||||
|
<dd>${CmsPagesCategorizedItemModel.description}</dd>
|
||||||
|
</dl>
|
||||||
|
<#else>
|
||||||
|
<p>No (Index) Item</p>
|
||||||
|
</#if>
|
||||||
|
<h2>Item List</h2>
|
||||||
|
<ul>
|
||||||
|
<#list CmsPagesItemListModel.items as item>
|
||||||
|
<li>
|
||||||
|
<b>${item.title} (${item.name})</b>
|
||||||
|
${item.description}
|
||||||
|
</li>
|
||||||
|
</#list>
|
||||||
|
</ul>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
|
<#macro categoryTreeNode category>
|
||||||
|
<li>
|
||||||
|
${category.name}
|
||||||
|
<#if (category.subCategories?size > 0)>
|
||||||
|
<ul>
|
||||||
|
<#list category.subCategories as subCategory>
|
||||||
|
<@categoryTreeNode subCategory />
|
||||||
|
</#list>
|
||||||
|
</ul>
|
||||||
|
</#if>
|
||||||
|
</li>
|
||||||
|
</#macro>
|
||||||
|
|
@ -330,20 +330,45 @@ public class PagesController {
|
||||||
@DefaultValue("")
|
@DefaultValue("")
|
||||||
final String preview
|
final String preview
|
||||||
) {
|
) {
|
||||||
final Versions versions = generateFromPreviewParam(preview);
|
// final Versions versions = generateFromPreviewParam(preview);
|
||||||
|
//
|
||||||
globalizationHelper.setSelectedLocale(new Locale(language));
|
// globalizationHelper.setSelectedLocale(new Locale(language));
|
||||||
|
//
|
||||||
contentItemModel.setItemName(itemName);
|
// contentItemModel.setItemName(itemName);
|
||||||
contentItemModel.setItemVersion(versions.getContentItemVersion());
|
// contentItemModel.setItemVersion(versions.getContentItemVersion());
|
||||||
|
//
|
||||||
final String domain = uriInfo.getBaseUri().getHost();
|
// final String domain = uriInfo.getBaseUri().getHost();
|
||||||
final Pages pages = getPages(domain);
|
// final Pages pages = getPages(domain);
|
||||||
final Category category = getCategory(domain, pages, "/");
|
// final Site site = pages.getSite();
|
||||||
final Page page = pageManager.findPageForCategory(category);
|
// siteInfoModel.setAvailableLanguages(
|
||||||
pagePropertiesModel.setProperties(page.getProperties());
|
// confManager
|
||||||
return themesMvc.getMvcTemplate(
|
// .findConfiguration(KernelConfig.class)
|
||||||
uriInfo, "pages", page.getDisplayName()
|
// .getSupportedLanguages()
|
||||||
|
// .stream()
|
||||||
|
// .sorted()
|
||||||
|
// .collect(Collectors.toList())
|
||||||
|
// );
|
||||||
|
// siteInfoModel.setDomain(site.getDomainOfSite());
|
||||||
|
// siteInfoModel.setHost(domain);
|
||||||
|
// siteInfoModel.setName(
|
||||||
|
// Optional
|
||||||
|
// .ofNullable(site.getDisplayName())
|
||||||
|
// .orElse("")
|
||||||
|
// );
|
||||||
|
// final Category category = getCategory(domain, pages, "/");
|
||||||
|
// categoryModel.init(pages.getCategoryDomain(), category);
|
||||||
|
// final Page page = pageManager.findPageForCategory(category);
|
||||||
|
// pagePropertiesModel.setProperties(page.getProperties());
|
||||||
|
// return themesMvc.getMvcTemplate(
|
||||||
|
// uriInfo, "pages", page.getDisplayName()
|
||||||
|
// );
|
||||||
|
return getPageAsHtml(
|
||||||
|
uriInfo,
|
||||||
|
"/",
|
||||||
|
itemName,
|
||||||
|
language,
|
||||||
|
theme,
|
||||||
|
preview
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -493,12 +518,32 @@ public class PagesController {
|
||||||
) {
|
) {
|
||||||
final Versions versions = generateFromPreviewParam(preview);
|
final Versions versions = generateFromPreviewParam(preview);
|
||||||
|
|
||||||
|
globalizationHelper.setSelectedLocale(new Locale(language));
|
||||||
|
|
||||||
contentItemModel.setItemName(itemName);
|
contentItemModel.setItemName(itemName);
|
||||||
|
final ContentItemVersion version = versions.getContentItemVersion();
|
||||||
contentItemModel.setItemVersion(versions.getContentItemVersion());
|
contentItemModel.setItemVersion(versions.getContentItemVersion());
|
||||||
|
|
||||||
final String domain = uriInfo.getBaseUri().getHost();
|
final String domain = uriInfo.getBaseUri().getHost();
|
||||||
final Pages pages = getPages(domain);
|
final Pages pages = getPages(domain);
|
||||||
|
final Site site = pages.getSite();
|
||||||
|
siteInfoModel.setAvailableLanguages(
|
||||||
|
confManager
|
||||||
|
.findConfiguration(KernelConfig.class)
|
||||||
|
.getSupportedLanguages()
|
||||||
|
.stream()
|
||||||
|
.sorted()
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
siteInfoModel.setDomain(site.getDomainOfSite());
|
||||||
|
siteInfoModel.setHost(domain);
|
||||||
|
siteInfoModel.setName(
|
||||||
|
Optional
|
||||||
|
.ofNullable(site.getDisplayName())
|
||||||
|
.orElse("")
|
||||||
|
);
|
||||||
final Category category = getCategory(domain, pages, pagePath);
|
final Category category = getCategory(domain, pages, pagePath);
|
||||||
|
categoryModel.init(pages.getCategoryDomain(), category, version);
|
||||||
final Page page = pageManager.findPageForCategory(category);
|
final Page page = pageManager.findPageForCategory(category);
|
||||||
pagePropertiesModel.setProperties(page.getProperties());
|
pagePropertiesModel.setProperties(page.getProperties());
|
||||||
return themesMvc.getMvcTemplate(
|
return themesMvc.getMvcTemplate(
|
||||||
|
|
@ -506,6 +551,26 @@ public class PagesController {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initSiteInfoModel(
|
||||||
|
final Site site, final String host
|
||||||
|
) {
|
||||||
|
siteInfoModel.setAvailableLanguages(
|
||||||
|
confManager
|
||||||
|
.findConfiguration(KernelConfig.class)
|
||||||
|
.getSupportedLanguages()
|
||||||
|
.stream()
|
||||||
|
.sorted()
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
siteInfoModel.setDomain(site.getDomainOfSite());
|
||||||
|
siteInfoModel.setHost(host);
|
||||||
|
siteInfoModel.setName(
|
||||||
|
Optional
|
||||||
|
.ofNullable(site.getDisplayName())
|
||||||
|
.orElse("")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private Site getSite(final UriInfo uriInfo) {
|
private Site getSite(final UriInfo uriInfo) {
|
||||||
final String domain = Objects
|
final String domain = Objects
|
||||||
.requireNonNull(uriInfo)
|
.requireNonNull(uriInfo)
|
||||||
|
|
@ -695,48 +760,6 @@ public class PagesController {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Page findPage(
|
|
||||||
final UriInfo uriInfo, final String pagePath, final String language
|
|
||||||
) {
|
|
||||||
Objects.requireNonNull(uriInfo);
|
|
||||||
Objects.requireNonNull(pagePath);
|
|
||||||
|
|
||||||
final Site site = getSite(uriInfo);
|
|
||||||
final String domain = uriInfo.getBaseUri().getHost();
|
|
||||||
final Pages pages = getPages(domain);
|
|
||||||
|
|
||||||
final Category category = getCategory(domain, pages, pagePath);
|
|
||||||
// disabled. Needs to be decided if the available languages of the
|
|
||||||
// index item or of the category are
|
|
||||||
// used to decide if a NotFoundException is thrown.
|
|
||||||
// if (!category.getTitle().hasValue(locale)) {
|
|
||||||
// throw new NotFoundException();
|
|
||||||
// }
|
|
||||||
final Locale locale = new Locale(language);
|
|
||||||
globalizationHelper.setSelectedLocale(locale);
|
|
||||||
|
|
||||||
final KernelConfig kernelConfig = confManager
|
|
||||||
.findConfiguration(KernelConfig.class);
|
|
||||||
|
|
||||||
siteInfoModel.setAvailableLanguages(
|
|
||||||
kernelConfig
|
|
||||||
.getSupportedLanguages()
|
|
||||||
.stream()
|
|
||||||
.sorted()
|
|
||||||
.collect(Collectors.toList())
|
|
||||||
);
|
|
||||||
siteInfoModel.setDomain(site.getDomainOfSite());
|
|
||||||
siteInfoModel.setHost(uriInfo.getBaseUri().getHost());
|
|
||||||
siteInfoModel.setName(site.getDisplayName());
|
|
||||||
|
|
||||||
categoryModel.setCategory(category);
|
|
||||||
categoryModel.setCategoryPath(
|
|
||||||
categoryManager.getCategoryPath(category)
|
|
||||||
);
|
|
||||||
|
|
||||||
return pageManager.findPageForCategory(category);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse the value of the {@code preview} query parameter.
|
* Parse the value of the {@code preview} query parameter.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.librecms.pages.models;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
public class CategoryData {
|
||||||
|
|
||||||
|
private long categoryId;
|
||||||
|
|
||||||
|
private String uuid;
|
||||||
|
|
||||||
|
private String uniqueId;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
private boolean enabled;
|
||||||
|
|
||||||
|
private boolean visible;
|
||||||
|
|
||||||
|
private boolean abstractCategory;
|
||||||
|
|
||||||
|
private boolean hasIndexItem;
|
||||||
|
|
||||||
|
CategoryData() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getCategoryId() {
|
||||||
|
return categoryId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setCategoryId(final long categoryId) {
|
||||||
|
this.categoryId = categoryId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUuid(final String uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUniqueId() {
|
||||||
|
return uniqueId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUniqueId(final String uniqueId) {
|
||||||
|
this.uniqueId = uniqueId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setName(final String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setTitle(final String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setDescription(final String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setEnabled(boolean enabled) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isVisible() {
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setVisible(final boolean visible) {
|
||||||
|
this.visible = visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAbstractCategory() {
|
||||||
|
return abstractCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setAbstractCategory(final boolean abstractCategory) {
|
||||||
|
this.abstractCategory = abstractCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setPath(final String path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getHasIndexItem() {
|
||||||
|
return hasIndexItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setHasIndexItem(final boolean hasIndexItem) {
|
||||||
|
this.hasIndexItem = hasIndexItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.librecms.pages.models;
|
||||||
|
|
||||||
|
import org.libreccm.categorization.Domain;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Model for the current category system/domain.
|
||||||
|
*
|
||||||
|
* @see CategoryModel
|
||||||
|
* @see Domain
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
public class CategoryDomainData {
|
||||||
|
|
||||||
|
private long domainId;
|
||||||
|
|
||||||
|
private String uuid;
|
||||||
|
|
||||||
|
private String domainKey;
|
||||||
|
|
||||||
|
private String uri;
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
CategoryDomainData() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getDomainId() {
|
||||||
|
return domainId;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setDomainId(final long domainId) {
|
||||||
|
this.domainId = domainId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUuid(final String uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDomainKey() {
|
||||||
|
return domainKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setDomainKey(final String domainKey) {
|
||||||
|
this.domainKey = domainKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUri() {
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUri(final String uri) {
|
||||||
|
this.uri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setTitle(final String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setDescription(final String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -19,17 +19,26 @@
|
||||||
package org.librecms.pages.models;
|
package org.librecms.pages.models;
|
||||||
|
|
||||||
import org.libreccm.categorization.Category;
|
import org.libreccm.categorization.Category;
|
||||||
import org.librecms.pages.PagesController;
|
import org.libreccm.categorization.CategoryManager;
|
||||||
|
import org.libreccm.categorization.CategoryRepository;
|
||||||
|
import org.libreccm.categorization.Domain;
|
||||||
|
import org.libreccm.categorization.DomainRepository;
|
||||||
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
|
import org.librecms.contentsection.ContentItemVersion;
|
||||||
|
import org.librecms.pages.PagesService;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.enterprise.context.RequestScoped;
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
import javax.transaction.Transactional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model for MVC applications providing access to the current category. This
|
* Model for MVC applications providing access to the current category. This
|
||||||
* model MUST be initalized by the calling application (for example
|
* model MUST be initalized by the calling application using {@link #init(org.libreccm.categorization.Domain, org.libreccm.categorization.Category)).
|
||||||
* {@link PagesController} with the current category.
|
|
||||||
*
|
*
|
||||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
*/
|
*/
|
||||||
|
|
@ -39,25 +48,140 @@ public class CategoryModel implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private Category category;
|
@Inject
|
||||||
|
private CategoryManager categoryManager;
|
||||||
|
|
||||||
private String categoryPath;
|
@Inject
|
||||||
|
private DomainRepository domainRepository;
|
||||||
|
|
||||||
public Category getCategory() {
|
@Inject
|
||||||
|
private GlobalizationHelper globalizationHelper;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private PagesService pagesService;
|
||||||
|
|
||||||
|
private CategoryDomainData domain;
|
||||||
|
|
||||||
|
private CategoryData category;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Controllers must call this method to initalize the this model.
|
||||||
|
*
|
||||||
|
* @param domain The current category domain.
|
||||||
|
* @param category The current category.
|
||||||
|
* @param version
|
||||||
|
*/
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
|
public void init(
|
||||||
|
final Domain domain,
|
||||||
|
final Category category,
|
||||||
|
final ContentItemVersion version
|
||||||
|
) {
|
||||||
|
this.domain = new CategoryDomainData();
|
||||||
|
this.domain.setDescription(
|
||||||
|
globalizationHelper.getValueFromLocalizedString(
|
||||||
|
domain.getDescription()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
this.domain.setDomainId(domain.getObjectId());
|
||||||
|
this.domain.setDomainKey(domain.getDomainKey());
|
||||||
|
this.domain.setTitle(
|
||||||
|
globalizationHelper.getValueFromLocalizedString(
|
||||||
|
domain.getTitle()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
this.domain.setUri(domain.getUri());
|
||||||
|
this.domain.setUuid(domain.getUuid());
|
||||||
|
|
||||||
|
this.category = new CategoryData();
|
||||||
|
this.category.setAbstractCategory(category.isAbstractCategory());
|
||||||
|
this.category.setDescription(
|
||||||
|
globalizationHelper.getValueFromLocalizedString(
|
||||||
|
category.getDescription()
|
||||||
|
));
|
||||||
|
this.category.setEnabled(category.isEnabled());
|
||||||
|
this.category.setCategoryId(category.getObjectId());
|
||||||
|
this.category.setName(category.getName());
|
||||||
|
this.category.setPath(categoryManager.getCategoryPath(category));
|
||||||
|
this.category.setTitle(
|
||||||
|
globalizationHelper.getValueFromLocalizedString(
|
||||||
|
category.getTitle()
|
||||||
|
));
|
||||||
|
this.category.setUniqueId(category.getUniqueId());
|
||||||
|
this.category.setUuid(category.getUuid());
|
||||||
|
this.category.setVisible(category.isVisible());
|
||||||
|
this.category.setHasIndexItem(
|
||||||
|
//pagesService.findIndexItem(category, version).isPresent()
|
||||||
|
categoryManager.hasIndexObject(category)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CategoryDomainData getDomain() {
|
||||||
|
return domain;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CategoryData getCategory() {
|
||||||
return category;
|
return category;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCategory(final Category category) {
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
this.category = category;
|
public CategoryTreeNode getCategoryTree() {
|
||||||
|
final Domain currentDomain = domainRepository
|
||||||
|
.findById(domain.getDomainId())
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new RuntimeException(
|
||||||
|
String.format(
|
||||||
|
"The category domain with the ID %d was set as current "
|
||||||
|
+ "category domain, but there is such domain in "
|
||||||
|
+ "the database.",
|
||||||
|
domain.getDomainId()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return buildTreeNode(currentDomain.getRoot(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCategoryPath() {
|
private CategoryTreeNode buildTreeNode(
|
||||||
return categoryPath;
|
final Category fromCategory,
|
||||||
|
final CategoryTreeNode parent
|
||||||
|
) {
|
||||||
|
final CategoryTreeNode node = new CategoryTreeNode();
|
||||||
|
node.setCategoryPath(categoryManager.getCategoryPath(fromCategory));
|
||||||
|
node.setDescription(
|
||||||
|
globalizationHelper.getValueFromLocalizedString(
|
||||||
|
fromCategory.getDescription())
|
||||||
|
);
|
||||||
|
node.setName(fromCategory.getName());
|
||||||
|
node.setSelected(fromCategory.getUuid().equals(category.getUuid()));
|
||||||
|
node.setParentCategory(parent);
|
||||||
|
node.setSubCategories(
|
||||||
|
fromCategory
|
||||||
|
.getSubCategories()
|
||||||
|
.stream()
|
||||||
|
.sorted(Comparator.comparing(Category::getCategoryOrder))
|
||||||
|
.map(cat -> buildTreeNode(cat, node))
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
);
|
||||||
|
node.setTitle(
|
||||||
|
globalizationHelper.getValueFromLocalizedString(
|
||||||
|
fromCategory.getTitle()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
node.setUuid(fromCategory.getUuid());
|
||||||
|
|
||||||
|
if (node.isSelected() && node.getParentCategory() != null) {
|
||||||
|
setSubCategoryCategorySelected(node.getParentCategory());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCategoryPath(final String categoryPath) {
|
return node;
|
||||||
this.categoryPath = categoryPath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setSubCategoryCategorySelected(final CategoryTreeNode node) {
|
||||||
|
node.setSubCategorySelected(true);
|
||||||
|
if (node.getParentCategory() != null) {
|
||||||
|
setSubCategoryCategorySelected(node.getParentCategory());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,125 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2021 LibreCCM Foundation.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
package org.librecms.pages.models;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
public class CategoryTreeNode {
|
||||||
|
|
||||||
|
private String uuid;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
private String description;
|
||||||
|
|
||||||
|
private String categoryPath;
|
||||||
|
|
||||||
|
private boolean selected;
|
||||||
|
|
||||||
|
private boolean subCategorySelected;
|
||||||
|
|
||||||
|
private CategoryTreeNode parentCategory;
|
||||||
|
|
||||||
|
private List<CategoryTreeNode> subCategories;
|
||||||
|
|
||||||
|
public String getUuid() {
|
||||||
|
return uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setUuid(final String uuid) {
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setName(final String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setTitle(final String title) {
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setDescription(final String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCategoryPath() {
|
||||||
|
return categoryPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setCategoryPath(final String categoryPath) {
|
||||||
|
this.categoryPath = categoryPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CategoryTreeNode> getSubCategories() {
|
||||||
|
return Collections.unmodifiableList(subCategories);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setSubCategories(
|
||||||
|
final List<CategoryTreeNode> subCategories
|
||||||
|
) {
|
||||||
|
this.subCategories = new ArrayList<>(subCategories);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSelected() {
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setSelected(boolean selected) {
|
||||||
|
this.selected = selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public CategoryTreeNode getParentCategory() {
|
||||||
|
return parentCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setParentCategory(final CategoryTreeNode parentCategory) {
|
||||||
|
this.parentCategory = parentCategory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSubCategorySelected() {
|
||||||
|
return subCategorySelected;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void setSubCategorySelected(final boolean subCategorySelected) {
|
||||||
|
this.subCategorySelected = subCategorySelected;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -21,11 +21,11 @@ package org.librecms.pages.models;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.libreccm.categorization.CategoryManager;
|
import org.libreccm.categorization.CategoryManager;
|
||||||
|
import org.libreccm.categorization.CategoryRepository;
|
||||||
import org.libreccm.l10n.GlobalizationHelper;
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
import org.librecms.contentsection.AttachmentList;
|
import org.librecms.contentsection.AttachmentList;
|
||||||
import org.librecms.contentsection.ContentItem;
|
import org.librecms.contentsection.ContentItem;
|
||||||
import org.librecms.contentsection.ContentItemVersion;
|
import org.librecms.contentsection.ContentItemVersion;
|
||||||
import org.librecms.pages.PagesRouter;
|
|
||||||
import org.librecms.pages.PagesService;
|
import org.librecms.pages.PagesService;
|
||||||
|
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
|
|
@ -60,6 +60,9 @@ public class ContentItemModel {
|
||||||
@Inject
|
@Inject
|
||||||
private CategoryManager categoryManager;
|
private CategoryManager categoryManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private CategoryRepository categoryRepository;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private CategoryModel categoryModel;
|
private CategoryModel categoryModel;
|
||||||
|
|
||||||
|
|
@ -217,11 +220,36 @@ public class ContentItemModel {
|
||||||
private void retrieveContentItem() {
|
private void retrieveContentItem() {
|
||||||
if (itemName == null) {
|
if (itemName == null) {
|
||||||
contentItem = pagesService.findIndexItem(
|
contentItem = pagesService.findIndexItem(
|
||||||
categoryModel.getCategory(), itemVersion
|
categoryRepository
|
||||||
|
.findById(categoryModel.getCategory().getCategoryId())
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new RuntimeException(
|
||||||
|
String.format(
|
||||||
|
"The category with the ID %d is set as current "
|
||||||
|
+ "category, but not category with that ID "
|
||||||
|
+ "can be found in the database.",
|
||||||
|
categoryModel.getCategory().getCategoryId()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
itemVersion
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
contentItem = pagesService.findCategorizedItem(
|
contentItem = pagesService.findCategorizedItem(
|
||||||
categoryModel.getCategory(), itemName, itemVersion
|
categoryRepository
|
||||||
|
.findById(categoryModel.getCategory().getCategoryId())
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new RuntimeException(
|
||||||
|
String.format(
|
||||||
|
"The category with the ID %d is set as current "
|
||||||
|
+ "category, but not category with that ID "
|
||||||
|
+ "can be found in the database.",
|
||||||
|
categoryModel.getCategory().getCategoryId()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
itemName,
|
||||||
|
itemVersion
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ import com.arsdigita.kernel.KernelConfig;
|
||||||
|
|
||||||
import org.libreccm.categorization.Categorization;
|
import org.libreccm.categorization.Categorization;
|
||||||
import org.libreccm.categorization.Category;
|
import org.libreccm.categorization.Category;
|
||||||
|
import org.libreccm.categorization.CategoryRepository;
|
||||||
import org.libreccm.configuration.ConfigurationManager;
|
import org.libreccm.configuration.ConfigurationManager;
|
||||||
import org.libreccm.core.UnexpectedErrorException;
|
import org.libreccm.core.UnexpectedErrorException;
|
||||||
import org.libreccm.l10n.GlobalizationHelper;
|
import org.libreccm.l10n.GlobalizationHelper;
|
||||||
|
|
@ -54,6 +55,7 @@ import javax.persistence.criteria.JoinType;
|
||||||
import javax.persistence.criteria.Order;
|
import javax.persistence.criteria.Order;
|
||||||
import javax.persistence.criteria.Predicate;
|
import javax.persistence.criteria.Predicate;
|
||||||
import javax.persistence.criteria.Root;
|
import javax.persistence.criteria.Root;
|
||||||
|
import javax.transaction.Transactional;
|
||||||
import javax.ws.rs.WebApplicationException;
|
import javax.ws.rs.WebApplicationException;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
|
@ -68,6 +70,9 @@ public class ItemListModel {
|
||||||
@Inject
|
@Inject
|
||||||
private CategoryModel categoryModel;
|
private CategoryModel categoryModel;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
private CategoryRepository categoryRepository;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private ConfigurationManager confManager;
|
private ConfigurationManager confManager;
|
||||||
|
|
||||||
|
|
@ -111,7 +116,7 @@ public class ItemListModel {
|
||||||
public ItemListModel() {
|
public ItemListModel() {
|
||||||
descending = false;
|
descending = false;
|
||||||
limitToType = ContentItem.class.getName();
|
limitToType = ContentItem.class.getName();
|
||||||
listOrder = List.of(ContentItem.class.getName());
|
listOrder = List.of("displayName");
|
||||||
pageSize = 20;
|
pageSize = 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -155,11 +160,25 @@ public class ItemListModel {
|
||||||
return getItems().size();
|
return getItems().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional(Transactional.TxType.REQUIRED)
|
||||||
public List<? extends AbstractContentItemListItemModel> getItems() {
|
public List<? extends AbstractContentItemListItemModel> getItems() {
|
||||||
if (itemList == null) {
|
if (itemList == null) {
|
||||||
buildList(
|
buildList(
|
||||||
buildLimitToType(limitToType),
|
buildLimitToType(limitToType),
|
||||||
collectCategories(categoryModel.getCategory()),
|
collectCategories(
|
||||||
|
categoryRepository
|
||||||
|
.findById(categoryModel.getCategory().getCategoryId())
|
||||||
|
.orElseThrow(
|
||||||
|
() -> new RuntimeException(
|
||||||
|
String.format(
|
||||||
|
"Category with ID %d was set as current "
|
||||||
|
+ "category, but no category with "
|
||||||
|
+ "that ID was found in the database.",
|
||||||
|
categoryModel.getCategory().getCategoryId()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
listOrder,
|
listOrder,
|
||||||
pageSize
|
pageSize
|
||||||
);
|
);
|
||||||
|
|
@ -205,7 +224,7 @@ public class ItemListModel {
|
||||||
criteriaQuery.orderBy(
|
criteriaQuery.orderBy(
|
||||||
listOrder
|
listOrder
|
||||||
.stream()
|
.stream()
|
||||||
.map(order -> builderOrder(order, from, criteriaBuilder))
|
.map(order -> buildOrder(order, from, criteriaBuilder))
|
||||||
.collect(Collectors.toList())
|
.collect(Collectors.toList())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -225,17 +244,15 @@ public class ItemListModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Category> collectCategories(final Category category) {
|
private List<Category> collectCategories(final Category category) {
|
||||||
|
|
||||||
if (category.getSubCategories().isEmpty()) {
|
|
||||||
return Collections.emptyList();
|
|
||||||
} else {
|
|
||||||
final List<Category> categories = new ArrayList<>();
|
final List<Category> categories = new ArrayList<>();
|
||||||
|
categories.add(category);
|
||||||
|
if (!category.getSubCategories().isEmpty()) {
|
||||||
for (final Category subCategory : category.getSubCategories()) {
|
for (final Category subCategory : category.getSubCategories()) {
|
||||||
categories.add(subCategory);
|
categories.add(subCategory);
|
||||||
categories.addAll(collectCategories(subCategory));
|
categories.addAll(collectCategories(subCategory));
|
||||||
}
|
}
|
||||||
return categories;
|
|
||||||
}
|
}
|
||||||
|
return categories;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Class<? extends ContentItem> buildLimitToType(
|
private Class<? extends ContentItem> buildLimitToType(
|
||||||
|
|
@ -352,7 +369,7 @@ public class ItemListModel {
|
||||||
return roles;
|
return roles;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Order builderOrder(
|
private Order buildOrder(
|
||||||
final String order,
|
final String order,
|
||||||
final Root<? extends ContentItem> from,
|
final Root<? extends ContentItem> from,
|
||||||
final CriteriaBuilder criteriaBuilder
|
final CriteriaBuilder criteriaBuilder
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue