MVC models/named beans for the pages application.
parent
4d069eb109
commit
d5cc0370bc
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* 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.l10n.GlobalizationHelper;
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contenttypes.Article;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.ws.rs.WebApplicationException;
|
||||
import javax.ws.rs.core.Response;
|
||||
|
||||
/**
|
||||
* Model for getting the special properties of an {@link Article}. For general
|
||||
* properties of an content item use {@link ContentItemModel}.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
@Named("CmsPagesArticleModel")
|
||||
public class ArticleModel {
|
||||
|
||||
@Inject
|
||||
private ContentItemModel contentItemModel;
|
||||
|
||||
@Inject
|
||||
private GlobalizationHelper globalizationHelper;
|
||||
|
||||
public String getTitle() {
|
||||
return getArticle()
|
||||
.getTitle()
|
||||
.getValue(globalizationHelper.getNegotiatedLocale());
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return getArticle()
|
||||
.getDescription()
|
||||
.getValue(globalizationHelper.getNegotiatedLocale());
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return getArticle()
|
||||
.getText()
|
||||
.getValue(globalizationHelper.getNegotiatedLocale());
|
||||
}
|
||||
|
||||
protected Article getArticle() {
|
||||
final ContentItem contentItem = contentItemModel.getContentItem();
|
||||
if (contentItem instanceof Article) {
|
||||
return (Article) contentItem;
|
||||
} else {
|
||||
throw new WebApplicationException(
|
||||
"Current content item is not an article.",
|
||||
Response
|
||||
.status(Response.Status.INTERNAL_SERVER_ERROR)
|
||||
.entity("Current content item is not an article.")
|
||||
.build()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* 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.Category;
|
||||
import org.librecms.pages.PagesRouter;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Named;
|
||||
|
||||
/**
|
||||
* Model for MVC applications providing access to the current category. This
|
||||
* model MUST be initalized by the calling application (for example
|
||||
* {@link PagesRouter} with the current category.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
@Named("CmsPagesCategoryModel")
|
||||
public class CategoryModel implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private Category category;
|
||||
|
||||
private String categoryPath;
|
||||
|
||||
public Category getCategory() {
|
||||
return category;
|
||||
}
|
||||
|
||||
public void setCategory(final Category category) {
|
||||
this.category = category;
|
||||
}
|
||||
|
||||
public String getCategoryPath() {
|
||||
return categoryPath;
|
||||
}
|
||||
|
||||
public void setCategoryPath(final String categoryPath) {
|
||||
this.categoryPath = categoryPath;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,282 @@
|
|||
/*
|
||||
* 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.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.categorization.Categorization;
|
||||
import org.libreccm.categorization.Category;
|
||||
import org.libreccm.categorization.CategoryManager;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentItemVersion;
|
||||
import org.librecms.pages.PagesRouter;
|
||||
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.NoResultException;
|
||||
import javax.persistence.TypedQuery;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
import javax.persistence.criteria.Join;
|
||||
import javax.persistence.criteria.Root;
|
||||
import javax.ws.rs.NotFoundException;
|
||||
|
||||
/**
|
||||
* Retrieves a categorized content item for the current category. To work, the
|
||||
* {@link #itemName} property MUST be initalized by the using application (for
|
||||
* example {@link PagesRouter}. The value for {@link #itemName} is usually
|
||||
* determined from the requested URL.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
@Named("CmsPagesCategorizedItemModel")
|
||||
public class ContentItemModel {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(ContentItemModel.class
|
||||
);
|
||||
|
||||
@Inject
|
||||
private CategoryManager categoryManager;
|
||||
|
||||
@Inject
|
||||
private CategoryModel categoryModel;
|
||||
|
||||
@Inject
|
||||
private EntityManager entityManager;
|
||||
|
||||
@Inject
|
||||
private GlobalizationHelper globalizationHelper;
|
||||
|
||||
private DateTimeFormatter dateTimeFormatter
|
||||
= DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneId.systemDefault());
|
||||
|
||||
private String itemName;
|
||||
|
||||
private ContentItemVersion itemVersion;
|
||||
|
||||
private Optional<ContentItem> contentItem;
|
||||
|
||||
public String getItemName() {
|
||||
return itemName;
|
||||
}
|
||||
|
||||
public void setItemName(final String itemName) {
|
||||
this.itemName = itemName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the current content item. Depending if {@link #itemName} has
|
||||
* been initalized with a value either the index item of the current
|
||||
* category or the item in the category identified by {@link #itemName} will
|
||||
* be retrieved. The item is only received once per request. The method will
|
||||
* retrieve the item on the first call and store the result in
|
||||
* {@link #contentItem}. Subsequent calls will return the value of
|
||||
* {@link #contentItem}. If {@link #itemName} is not {@code null} and there
|
||||
* is no content item with the requested name in the category this method
|
||||
* throws a {@link NotFoundException}.
|
||||
*
|
||||
* @return The requested categorized item. If {@link #itemName} is
|
||||
* {@code null}, and the current category has not index item, the
|
||||
* method will return {@code null}.
|
||||
*
|
||||
* @throws NotFoundException If there is no item identified by the name in
|
||||
* {@link #itemName}.
|
||||
*/
|
||||
public ContentItem getContentItem() {
|
||||
return getOrRetrieveContentItem().orElse(null);
|
||||
}
|
||||
|
||||
public long getObjectId() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getObjectId)
|
||||
.orElse(0L);
|
||||
}
|
||||
|
||||
public String getUuid() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getUuid)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getDisplayName)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getItemUuid() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getItemUuid)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getName)
|
||||
.map(
|
||||
localized -> localized.getValue(
|
||||
globalizationHelper.getNegotiatedLocale()
|
||||
)
|
||||
)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getTitle)
|
||||
.map(
|
||||
localized -> localized.getValue(
|
||||
globalizationHelper.getNegotiatedLocale()
|
||||
)
|
||||
).orElse("");
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getDescription)
|
||||
.map(
|
||||
localized -> localized.getValue(
|
||||
globalizationHelper.getNegotiatedLocale()
|
||||
)
|
||||
)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getVersion)
|
||||
.map(ContentItemVersion::toString)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getCreationDate() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getCreationDate)
|
||||
.map(Date::toInstant)
|
||||
.map(instant -> instant.atZone(ZoneId.systemDefault()))
|
||||
.map(ZonedDateTime::toLocalDateTime)
|
||||
.map(dateTimeFormatter::format)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getLastModified() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getLastModified)
|
||||
.map(Date::toInstant)
|
||||
.map(instant -> instant.atZone(ZoneId.systemDefault()))
|
||||
.map(ZonedDateTime::toLocalDateTime)
|
||||
.map(dateTimeFormatter::format)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getCreationUser() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getCreationUserName)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getLastModifyingUserName() {
|
||||
return getOrRetrieveContentItem()
|
||||
.map(ContentItem::getLastModifyingUserName)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
private Optional<ContentItem> getOrRetrieveContentItem() {
|
||||
if (contentItem == null) {
|
||||
retrieveContentItem();
|
||||
}
|
||||
return contentItem;
|
||||
}
|
||||
|
||||
private void retrieveContentItem() {
|
||||
if (itemName == null) {
|
||||
retrieveIndexItem();
|
||||
} else {
|
||||
retrieveCategorizedItem();
|
||||
}
|
||||
}
|
||||
|
||||
private void retrieveIndexItem() {
|
||||
final Category category = categoryModel.getCategory();
|
||||
|
||||
contentItem = categoryManager
|
||||
.getIndexObject(category)
|
||||
.stream()
|
||||
.filter(object -> object instanceof ContentItem)
|
||||
.map(object -> (ContentItem) object)
|
||||
.filter(item -> item.getVersion() == itemVersion)
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
private void retrieveCategorizedItem() {
|
||||
final Category category = categoryModel.getCategory();
|
||||
final CriteriaBuilder builder = entityManager
|
||||
.getCriteriaBuilder();
|
||||
final CriteriaQuery<ContentItem> criteriaQuery = builder
|
||||
.createQuery(ContentItem.class);
|
||||
|
||||
final Root<ContentItem> from = criteriaQuery.from(
|
||||
ContentItem.class
|
||||
);
|
||||
final Join<ContentItem, Categorization> join = from.join(
|
||||
"categories"
|
||||
);
|
||||
|
||||
final TypedQuery<ContentItem> query = entityManager
|
||||
.createQuery(criteriaQuery
|
||||
.select(from)
|
||||
.where(builder.and(
|
||||
builder.equal(from.get("displayName"), itemName),
|
||||
builder.equal(
|
||||
from.get("version"),
|
||||
ContentItemVersion.DRAFT
|
||||
),
|
||||
builder.equal(join.get("category"), category)
|
||||
)));
|
||||
|
||||
try {
|
||||
contentItem = Optional.of(query.getSingleResult());
|
||||
} catch (NoResultException ex) {
|
||||
LOGGER.warn(
|
||||
"No ContentItem with name \"{}\" in Category \"{}\".",
|
||||
itemName,
|
||||
Objects.toString(category)
|
||||
);
|
||||
throw new NotFoundException(
|
||||
String.format(
|
||||
"No ContentItem with name \"%s\" in Category \"%s\".",
|
||||
itemName,
|
||||
Objects.toString(category)
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
* 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.l10n.GlobalizationHelper;
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.ContentType;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.swing.text.AbstractDocument.Content;
|
||||
|
||||
/**
|
||||
* MVC model for retrieving information about the content type of the current
|
||||
* content item. If there is no current content item, the methods of this model
|
||||
* will return an empty string.
|
||||
*
|
||||
* The content type is retrieved once per request cycle on the first call
|
||||
*
|
||||
* @see ContentItemModel
|
||||
* @see ContentItemModel#getContentItem()
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
@Named("CmsPagesContentItemTypeModel")
|
||||
public class ContentItemTypeModel {
|
||||
|
||||
@Inject
|
||||
private ContentItemModel contentItemModel;
|
||||
|
||||
@Inject
|
||||
private GlobalizationHelper globalizationHelper;
|
||||
|
||||
private Optional<ContentType> contentType;
|
||||
|
||||
public ContentType getContentType() {
|
||||
return getOrRetrieveContentType().orElse(null);
|
||||
}
|
||||
|
||||
public long getContentTypeId() {
|
||||
return getOrRetrieveContentType()
|
||||
.map(ContentType::getObjectId)
|
||||
.orElse(0L);
|
||||
}
|
||||
|
||||
public String getUuid() {
|
||||
return getOrRetrieveContentType()
|
||||
.map(ContentType::getUuid)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
return getOrRetrieveContentType()
|
||||
.map(ContentType::getDisplayName)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return getOrRetrieveContentType()
|
||||
.map(ContentType::getLabel)
|
||||
.map(
|
||||
label -> label.getValue(
|
||||
globalizationHelper.getNegotiatedLocale())
|
||||
)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return getOrRetrieveContentType()
|
||||
.map(ContentType::getDescription)
|
||||
.map(
|
||||
description -> description.getValue(
|
||||
globalizationHelper.getNegotiatedLocale()
|
||||
)
|
||||
)
|
||||
.orElse("");
|
||||
}
|
||||
|
||||
private Optional<ContentType> getOrRetrieveContentType() {
|
||||
if (contentType == null) {
|
||||
retrieveContentType();
|
||||
}
|
||||
return contentType;
|
||||
}
|
||||
|
||||
private void retrieveContentType() {
|
||||
contentType = Optional
|
||||
.ofNullable(contentItemModel.getContentItem())
|
||||
.map(ContentItem::getContentType);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* 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.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Named;
|
||||
|
||||
/**
|
||||
* Model providing information about the current site. Must be initalized by the
|
||||
* calling application.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@RequestScoped
|
||||
@Named("CmsPagesSiteInfoModel")
|
||||
public class SiteInfoModel implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private String host;
|
||||
|
||||
private String domain;
|
||||
|
||||
private String name;
|
||||
|
||||
private List<String> availableLanguages;
|
||||
|
||||
public String getHost() {
|
||||
return host;
|
||||
}
|
||||
|
||||
public void setHost(final String host) {
|
||||
this.host = host;
|
||||
}
|
||||
|
||||
public String getDomain() {
|
||||
return domain;
|
||||
}
|
||||
|
||||
public void setDomain(final String domain) {
|
||||
this.domain = domain;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public List<String> getAvailableLanguages() {
|
||||
return Collections.unmodifiableList(availableLanguages);
|
||||
}
|
||||
|
||||
public void setAvailableLanguages(final List<String> availableLanguages) {
|
||||
this.availableLanguages = new ArrayList<>(availableLanguages);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue