/*
* Copyright (C) 2017 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.pagemodel;
import com.arsdigita.kernel.KernelConfig;
import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.pagemodel.ComponentBuilder;
import org.libreccm.security.PermissionChecker;
import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.contentsection.ContentItemManager;
import org.librecms.contentsection.privileges.ItemPrivileges;
import org.librecms.pagemodel.contentitems.AbstractContentItemRenderer;
import org.librecms.pagemodel.contentitems.ContentItemRenderers;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import javax.inject.Inject;
import javax.transaction.Transactional;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import static org.librecms.pages.PagesConstants.*;
/**
*
* @author Jens Pelzetter
* @param
*/
public abstract class AbstractContentItemComponentBuilder
implements ComponentBuilder {
@Inject
private ConfigurationManager confManager;
@Inject
private ContentItemRenderers contentItemRenderers;
@Inject
private ContentItemL10NManager iteml10nManager;
@Inject
private ContentItemManager itemManager;
@Inject
private PermissionChecker permissionChecker;
protected abstract ContentItem getContentItem(
T componentModel, final Map parameters);
@Transactional(Transactional.TxType.REQUIRED)
@Override
public Map buildComponent(
final T componentModel,
final Map parameters) {
Objects.requireNonNull(componentModel);
Objects.requireNonNull(parameters);
final ContentItem contentItem = getContentItem(componentModel,
parameters);
if (Boolean.TRUE.equals(parameters.get("showDraftItem"))) {
final ContentItem draftItem = itemManager
.getDraftVersion(contentItem, contentItem.getClass());
if (permissionChecker.isPermitted(ItemPrivileges.PREVIEW, draftItem)) {
final Map result = generateItem(componentModel,
parameters,
draftItem);
result.put("showDraftItem", Boolean.TRUE);
return result;
} else {
throw new WebApplicationException(
"You are not permitted to view the draft version of this item.",
Response.Status.UNAUTHORIZED);
}
} else {
final ContentItem liveItem = itemManager
.getLiveVersion(contentItem, contentItem.getClass())
.orElseThrow(() -> new NotFoundException(
"This content item does not "
+ "have a live version."));
if (permissionChecker.isPermitted(ItemPrivileges.VIEW_PUBLISHED,
liveItem)) {
return generateItem(componentModel,
parameters,
liveItem);
} else {
throw new WebApplicationException(
"You are not permitted to view the live version of "
+ "this item.",
Response.Status.UNAUTHORIZED);
}
}
}
protected Map generateItem(
final T componentModel,
final Map parameters,
final ContentItem item) {
final Locale language;
if (parameters.containsKey("language")) {
language = new Locale((String) parameters.get(PARAMETER_LANGUAGE));
} else {
final KernelConfig kernelConfig = confManager
.findConfiguration(KernelConfig.class);
language = kernelConfig.getDefaultLocale();
}
if (iteml10nManager.hasLanguage(item, language)) {
final AbstractContentItemRenderer renderer = contentItemRenderers
.findRenderer(item.getClass(), componentModel.getMode());
return renderer.render(item, language);
} else {
throw new NotFoundException("Requested language is not available.");
}
}
}