From f0928243cb17c4c8f959a9e2f59aa8dc2b11f132 Mon Sep 17 00:00:00 2001 From: jensp Date: Tue, 6 Dec 2016 11:17:36 +0000 Subject: [PATCH] CCM NG: JavaDoc and missing files for PageModel git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4465 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: 7b08adbdf71bdf930cf58e2a9ac695f90adbbba8 --- .../java/org/librecms/pagemodel/BasePage.java | 33 ++++++++ .../org/librecms/pagemodel/PageModel.java | 77 +++++++++++++++++++ .../pagemodel/AbstractPageBuilder.java | 23 ++++-- .../pagemodel/ComponentBuilderManager.java | 42 ++++++---- .../libreccm/pagemodel/ComponentModel.java | 3 + .../org/libreccm/pagemodel/PageBuilder.java | 2 + .../bebop/AbstractBebopPageBuilder.java | 19 +++-- .../org/libreccm/pagemodel/package-info.java | 19 +++-- 8 files changed, 181 insertions(+), 37 deletions(-) create mode 100644 ccm-cms/src/main/java/org/librecms/pagemodel/BasePage.java create mode 100644 ccm-cms/src/main/java/org/librecms/pagemodel/PageModel.java diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/BasePage.java b/ccm-cms/src/main/java/org/librecms/pagemodel/BasePage.java new file mode 100644 index 000000000..a4becd380 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/BasePage.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2016 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.bebop.Page; + +/** + * + * @author Jens Pelzetter + */ +public class BasePage extends Page { + + public void setPageAttribute(final String name, final String value) { + super.setAttribute(name, value); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/PageModel.java b/ccm-cms/src/main/java/org/librecms/pagemodel/PageModel.java new file mode 100644 index 000000000..8ef61cbba --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/PageModel.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2016 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.templating.Templating; +import com.arsdigita.xml.Document; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author Jens Pelzetter + */ +@WebServlet(urlPatterns = {"*.bebop"}) +public class PageModel extends HttpServlet { + + private static final long serialVersionUID = 1056528247823275004L; + + @Override + protected void doGet(final HttpServletRequest request, + final HttpServletResponse response) + throws ServletException { + + final BasePage page = new BasePage(); + final ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); + final ScriptEngine scriptEngine = scriptEngineManager.getEngineByName( + "JavaScript"); + scriptEngine.put("page", page); + + try { + scriptEngine.eval( + "load(\'nashorn:mozilla_compat.js\');\n" + + "importClass(org.librecms.pagemodel.BasePage);\n" + + "var BasePage = Java.type('org.librecms.pagemodel.BasePage');\n" +// + "var page = new BasePage;\n" +// + "print(page.getClass().getName());\n" + + "page.setPageAttribute(\'name\', \'page-model-demo\');\n" + + "page.setPageAttribute(\'application\', \'content\');\n" + + "label = new com.arsdigita.bebop.Label(\'Test\');\n" + + "page.add(label);\n"); + } catch (ScriptException ex) { + throw new ServletException(ex); + } + +// final BasePage page = (BasePage) scriptEngine.get("page"); + page.lock(); + + final Document document = page.buildDocument(request, response); + Templating.getPresentationManager().servePage(document, + request, + response); + + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageBuilder.java b/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageBuilder.java index 81f9a4e0f..f4d62c5a6 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageBuilder.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/AbstractPageBuilder.java @@ -18,6 +18,7 @@ */ package org.libreccm.pagemodel; +import java.util.Optional; import javax.inject.Inject; /** @@ -37,25 +38,31 @@ public abstract class AbstractPageBuilder

implements PageBuilder

{ final P page = buildPage(); for (final ComponentModel componentModel : pageModel.getComponents()) { - final Object component = buildComponent( + final Optional component = buildComponent( componentModel, componentModel.getClass()); - addComponent(page, component); + if (component.isPresent()) { + addComponent(page, component); + } } return page; } - protected Object buildComponent( - final ComponentModel componentModel, + protected Optional buildComponent( + final ComponentModel componentModel, final Class componentModelClass) { componentBuilderManager.findComponentBuilder(componentModel.getClass(), getType()); - - final ComponentBuilder builder = componentBuilderManager + + final Optional> builder = componentBuilderManager .findComponentBuilder(componentModelClass, getType()); - - return builder.buildComponent((M) componentModel); + + if (builder.isPresent()) { + return Optional.of(builder.get().buildComponent((M) componentModel)); + } else { + return Optional.empty(); + } } protected abstract String getType(); diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentBuilderManager.java b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentBuilderManager.java index e19cc7942..1fbb9c0bc 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentBuilderManager.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentBuilderManager.java @@ -19,10 +19,13 @@ package org.libreccm.pagemodel; import java.util.Iterator; +import java.util.Optional; import javax.enterprise.context.RequestScoped; import javax.enterprise.inject.Instance; import javax.enterprise.util.AnnotationLiteral; import javax.inject.Inject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @@ -31,37 +34,44 @@ import javax.inject.Inject; @RequestScoped public class ComponentBuilderManager { + private static final Logger LOGGER = LogManager.getLogger( + ComponentBuilderManager.class); + @Inject private Instance> componentBuilders; - public ComponentBuilder findComponentBuilder( + public Optional> findComponentBuilder( final Class componentModelClass, final String type) { + LOGGER.debug("Trying to find ComponentBuilder for ComponentModel\"{}\"" + + "and type \"{}\"...", + componentModelClass.getName(), + type); + final ComponentModelTypeLiteral literal = new ComponentModelTypeLiteral( componentModelClass, type); final Instance> instance = componentBuilders .select(literal); if (instance.isUnsatisfied()) { - throw new IllegalArgumentException(String.format( - "No ComponentBuilder for component model \"%s\" and type \"%s\" " - + "available.", - componentModelClass.getName(), - type)); - } else if(instance.isAmbiguous()) { - throw new IllegalArgumentException(String.format( - "Multiple ComponentBuilders for component model \"%s\" and type \"%s\" " - + "available. Something is wrong", - componentModelClass.getName(), - type)); + LOGGER.warn("No ComponentBuilder for component model \"%s\" " + + "and type \"%s\". Ignoring component model."); + return Optional.empty(); + } else if (instance.isAmbiguous()) { + throw new IllegalStateException(String.format( + "Multiple ComponentBuilders for component model \"%s\" and " + + "type \"%s\" available. Something is wrong", + componentModelClass.getName(), + type)); } else { - final Iterator> iterator = instance.iterator(); + final Iterator> iterator = instance. + iterator(); final ComponentBuilder componentBuilder = iterator.next(); - - return (ComponentBuilder) componentBuilder; + + return Optional.of((ComponentBuilder) componentBuilder); } - + } private class ComponentModelTypeLiteral diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModel.java b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModel.java index 05b81698a..27f2fbab7 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModel.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/ComponentModel.java @@ -28,6 +28,8 @@ import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @@ -41,6 +43,7 @@ import javax.validation.constraints.NotNull; * @author Jens Pelzetter */ @Entity +@Inheritance(strategy = InheritanceType.JOINED) @Table(name = "PAGE_MODEL_COMPONENT_MODELS", schema = CoreConstants.DB_SCHEMA) public class ComponentModel implements Serializable { diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/PageBuilder.java b/ccm-core/src/main/java/org/libreccm/pagemodel/PageBuilder.java index 8e1470473..d5b7ab948 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/PageBuilder.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/PageBuilder.java @@ -57,5 +57,7 @@ public interface PageBuilder

{ * @return The page generated from the provided {@link PageModel}. */ P buildPage(PageModel pageModel); + + } diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/bebop/AbstractBebopPageBuilder.java b/ccm-core/src/main/java/org/libreccm/pagemodel/bebop/AbstractBebopPageBuilder.java index b279da0ee..ce62afd14 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/bebop/AbstractBebopPageBuilder.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/bebop/AbstractBebopPageBuilder.java @@ -28,10 +28,10 @@ import org.libreccm.pagemodel.AbstractPageBuilder; * * @author Jens Pelzetter */ -public abstract class AbstractBebopPageBuilder extends AbstractPageBuilder{ +public abstract class AbstractBebopPageBuilder extends AbstractPageBuilder { public static final String BEBOP = "Bebop"; - + @Override protected String getType() { return BEBOP; @@ -40,18 +40,21 @@ public abstract class AbstractBebopPageBuilder extends AbstractPageBuilder @Override protected void addComponent(final Page page, final Object component) { final Component bebopComponent = (Component) component; - + page.add(bebopComponent); } @Override public Page buildPage() { - - final String application = Web.getWebContext().getApplication().getPrimaryUrl(); - final Page page = PageFactory.buildPage(application, ""); - + + final String application = Web.getWebContext().getApplication(). + getPrimaryUrl(); + final Page page = PageFactory.buildPage(application, ""); + + addDefaultComponents(page); + return page; } - + public abstract void addDefaultComponents(final Page page); } diff --git a/ccm-core/src/main/java/org/libreccm/pagemodel/package-info.java b/ccm-core/src/main/java/org/libreccm/pagemodel/package-info.java index d52324560..3588fd8f1 100644 --- a/ccm-core/src/main/java/org/libreccm/pagemodel/package-info.java +++ b/ccm-core/src/main/java/org/libreccm/pagemodel/package-info.java @@ -17,18 +17,27 @@ * MA 02110-1301 USA */ /** + *

* The {@code pagemodel} packages provides an abstraction layer between the data * model of page and its generating components. This layer replaces the JSP * templates which were used in previous versions for this purpose. - * + *

+ *

* The Page Model system allows it to specify which components are used on a * page are therefore which information is displayed on a page. It is intended * to be used for public pages (like the item page of a content item category - * page in ccm-cms. The Page Model system uses data container which are read by - * some builder classes. Because we are not using an active code in the page + * page in ccm-cms. The Page Model system uses data containers which are read by + * some builder classes. Because we are not using any active code in the page * models this avoids a potential attack point. + *

+ *

+ * The central interface is the {@link org.libreccm.pagemodel.PageBuilder} + * interface. An implementation of this interface will take a + * {@link org.libreccm.pagemodel.PageModel} and process it and create a page + * from it using the view technology supported by the implementation. + * {@code PageBuilder}s are CDI beans. Implementations can be retrieved using + * the {@link org.libreccm.pagemodel.PageBuilderManager#findPageBuilder(String, Class)} method. + *

* - * - * */ package org.libreccm.pagemodel;