package com.psddev.cms.view; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * A renderer for {@link RawView} that concatenates the calls to {@code toString()} * for each of its items. If an item is itself a renderable view, then normal * view delegation logic will apply. Items that resolve to null will be * suppressed from the final output. */ public class RawViewRenderer implements ViewRenderer { private static final String ITEMS_VIEW_KEY = "items"; @Override public ViewOutput render(Object view, ViewTemplateLoader templateLoader) { ViewMap viewMap = null; if (view instanceof ViewMap) { viewMap = (ViewMap) view; } else if (view != null) { viewMap = new ViewMap(view); } List<ViewOutput> outputs = new ArrayList<>(); if (viewMap != null) { Object itemsObject = viewMap.get(ITEMS_VIEW_KEY); if (itemsObject instanceof Collection) { for (Object item : (Collection<?>) itemsObject) { if (item != null) { ViewRenderer itemViewRenderer = ViewRenderer.createRenderer(item); if (itemViewRenderer != null) { outputs.add(itemViewRenderer.render(item, templateLoader)); } else { outputs.add(item::toString); } } } } } return () -> outputs.stream() .filter(Objects::nonNull) .map(ViewOutput::get) .filter(Objects::nonNull) .collect(Collectors.joining()); } }