Skip to content

Commit

Permalink
Do not create area node when areaDefinitin.getCreateAreaNode == false
Browse files Browse the repository at this point in the history
 - Refactor CmsAreaTemplateHelper
 - Expose SUPPLIER_PAGE_PROPERTY
  • Loading branch information
eschleb committed Dec 18, 2023
1 parent 486b90c commit 9896fc3
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.Optional;

public abstract class AbstractCmsTemplateHelper<T> implements NamedHelper<T> {
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
Expand All @@ -24,7 +25,7 @@ public AbstractCmsTemplateHelper(final TemplatingFunctions templatingFunctions)
@Override
public CharSequence apply(final T context, final Options options) {
try {
return applySafe(context, options);
return applySafe(context, options).orElse(StringUtils.EMPTY);
} catch (Exception e) {
if (templatingFunctions.isAuthorInstance() && templatingFunctions.isEditMode()) {
throw Exceptions.sneak().handle(e);
Expand All @@ -35,7 +36,7 @@ public CharSequence apply(final T context, final Options options) {
return StringUtils.EMPTY;
}

protected abstract CharSequence applySafe(T context, Options options) throws Exception;
protected abstract Optional<CharSequence> applySafe(T context, Options options) throws Exception;

protected CharSequence render(final AbstractContentTemplatingElement templatingElement) throws RenderException, IOException {
final StringBuilder buffer = new StringBuilder();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import info.magnolia.templating.module.TemplatingModule;
import org.apache.commons.lang3.StringUtils;

import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.jcr.*;
Expand All @@ -37,6 +36,7 @@
import java.util.Set;

public class CmsAreaTemplateHelper extends AbstractCmsTemplateHelper<Object> {
public static final String SUPPLIER_PAGE_PROPERTY = "mgnl:supplierPage";
private final TemplateDefinitionRegistry templateDefinitionRegistry;
private final RenderingEngine renderingEngine;
private final AreaCreationListener areaCreationListener;
Expand All @@ -55,7 +55,7 @@ public CmsAreaTemplateHelper(
}

@Override
public CharSequence applySafe(final Object ignored, final Options options) throws IOException, RepositoryException, RenderException {
public Optional<CharSequence> applySafe(final Object ignored, final Options options) throws IOException, RepositoryException, RenderException {
// placeholder/area name used by FE (fallback for BE if 'area' is not set)
final String name = options.hash("name");
// area name for BE, ignored by FE
Expand All @@ -64,31 +64,28 @@ public CharSequence applySafe(final Object ignored, final Options options) throw
final RenderingModel<?> model = getRenderingModel(options.context).orElseThrow(() ->
new IllegalArgumentException("Rendering model not present!")
);
final Node node = model.getNode();
final Node node = getSupplierPage(model.getNode()).orElseGet(model::getNode);

@Nullable final AreaState areaState = getOrCreateAreaState(area, node).orElse(null);
if (areaState != null) {
final Node areaStateNode = areaState.getNode();
final String workspace = areaStateNode.getSession().getWorkspace().getName();
final String nodeIdentifier = areaStateNode.getIdentifier();
final String path = areaStateNode.getPath();
final AreaState areaState = getOrCreateAreaState(area, node);
final Node areaStateNode = areaState.getNode();
final String workspace = areaStateNode.getSession().getWorkspace().getName();
final String nodeIdentifier = areaStateNode.getIdentifier();
final String path = areaStateNode.getPath();

//Magnolia's AreaElement.begin calls render with empty HashMap --> use ContextObjectsRenderingEngineWrapper
final AreaElement areaElement = Components.getComponentProvider().newInstance(
CustomAvailableComponentsAreaElement.class,
new ContextObjectsRenderingEngineWrapper(renderingEngine, options.hash)
);
areaElement.setContent(areaStateNode);
areaElement.setWorkspace(workspace);
areaElement.setNodeIdentifier(nodeIdentifier);
areaElement.setPath(path);
areaElement.setArea(areaState.getAreaDefinition());
areaElement.setName(name);
areaElement.setContextAttributes(options.hash);
//Magnolia's AreaElement.begin calls render with empty HashMap --> use ContextObjectsRenderingEngineWrapper
final AreaElement areaElement = Components.getComponentProvider().newInstance(
CustomAvailableComponentsAreaElement.class,
new ContextObjectsRenderingEngineWrapper(renderingEngine, options.hash)
);
areaElement.setContent(areaStateNode);
areaElement.setWorkspace(workspace);
areaElement.setNodeIdentifier(nodeIdentifier);
areaElement.setPath(path);
areaElement.setArea(areaState.getAreaDefinition());
areaElement.setName(name);
areaElement.setContextAttributes(options.hash);

return render(areaElement);
}
throw new RuntimeException("Couldn't create areaState for area with name " + area + " (check naming)");
return Optional.of(render(areaElement));
}

@SuppressWarnings("rawtypes")
Expand All @@ -106,19 +103,14 @@ private Optional<RenderingModel> getRenderingModel(final Context context) {
);
}

private Optional<AreaState> getOrCreateAreaState(final String name, final Node node) {
private AreaDefinition getAreaDefinition(final String name, final Node node) throws RenderException {
return getNearestAncestorTemplate(node)
.flatMap(this::getTemplateDefinition)
.flatMap(templateDefinition ->
getAreaDefinition(name, templateDefinition.getAreas())
)
.flatMap(areaDefinition ->
getOrCreateAreaState(name, node, areaDefinition)
)
.or(() ->
getSupplierPage(node).flatMap(supplierPage ->
getOrCreateAreaState(name, supplierPage)
)
.orElseThrow(() ->
new RenderException("Couldn't get areaDefinition. " + name + " " + NodeUtil.getPathIfPossible(node))
);
}

Expand Down Expand Up @@ -158,10 +150,18 @@ private Optional<AreaDefinition> getAreaDefinition(final String name, final Map<
.findFirst();
}

private Optional<AreaState> getOrCreateAreaState(final String name, final Node node, final AreaDefinition areaDefinition) {
return getOrCreateAreaNode(name, node, areaDefinition).map(areaNode ->
new AreaState(areaDefinition, areaNode)
);
private AreaState getOrCreateAreaState(final String name, final Node node) throws RenderException {
final AreaDefinition areaDefinition = getAreaDefinition(name, node);
if(Boolean.FALSE.equals(areaDefinition.getCreateAreaNode())) {
return new AreaState(areaDefinition, node);
}
return getOrCreateAreaNode(name, node, areaDefinition)
.map(areaNode ->
new AreaState(areaDefinition, areaNode)
)
.orElseThrow(() ->
new RenderException("Couldn't create areaState. " + name + " " + NodeUtil.getPathIfPossible(node))
);
}

private Optional<Node> getOrCreateAreaNode(final String name, final Node node, final AreaDefinition areaDefinition) {
Expand All @@ -188,16 +188,15 @@ private Optional<Node> createAreaNode(final String name, final Node node, final
}

private Optional<Node> getSupplierPage(final Node node) {
return Optional.ofNullable(PropertyUtil.getString(node, "mgnl:supplierPage"))
.flatMap(supplierPageId -> {
try {
return Optional.of(node.getSession().getNodeByIdentifier(supplierPageId));
} catch (ItemNotFoundException e) {
return Optional.empty();
} catch (RepositoryException e) {
throw Exceptions.sneak().handle(e);
}
});
return Optional.ofNullable(PropertyUtil.getString(node, SUPPLIER_PAGE_PROPERTY)).flatMap(supplierPageId -> {
try {
return Optional.of(node.getSession().getNodeByIdentifier(supplierPageId));
} catch (ItemNotFoundException e) {
return Optional.empty();
} catch (RepositoryException e) {
throw Exceptions.sneak().handle(e);
}
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public CmsComponentTemplateHelper(
}

@Override
protected CharSequence applySafe(final ContentMap contentMap, final Options options) throws RepositoryException, RenderException, IOException {
protected Optional<CharSequence> applySafe(final ContentMap contentMap, final Options options) throws RepositoryException, RenderException, IOException {
final Node node = contentMap.getJCRNode();
final Map<String, Object> combinedContext = getContext(options);

Expand All @@ -56,7 +56,7 @@ protected CharSequence applySafe(final ContentMap contentMap, final Options opti
componentElement.setPath(node.getPath());
componentElement.setContextAttributes(combinedContext);

return render(componentElement);
return Optional.of(render(componentElement));
}

private Map<String, Object> getContext(final Options options) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import javax.inject.Inject;
import java.io.IOException;
import java.util.Map;
import java.util.Optional;
import java.util.Set;

public class CmsPageTemplateHelper extends AbstractCmsTemplateHelper<Map<String, Object>> {
Expand All @@ -19,9 +20,9 @@ public CmsPageTemplateHelper(final TemplatingFunctions templatingFunctions) {
}

@Override
public CharSequence applySafe(final Map<String, Object> pageModelMap, final Options options) throws RenderException, IOException {
public Optional<CharSequence> applySafe(final Map<String, Object> pageModelMap, final Options options) throws RenderException, IOException {
final PageElement pageElement = Components.getComponentProvider().newInstance(PageElement.class);
return render(pageElement);
return Optional.of(render(pageElement));
}

@Override
Expand Down

0 comments on commit 9896fc3

Please sign in to comment.