CCM NG: JavaDoc and missing files for PageModel

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4465 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2016-12-06 11:17:36 +00:00
parent b132908fa8
commit f474444047
8 changed files with 181 additions and 37 deletions

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
public class BasePage extends Page {
public void setPageAttribute(final String name, final String value) {
super.setAttribute(name, value);
}
}

View File

@ -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 <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@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);
}
}

View File

@ -18,6 +18,7 @@
*/ */
package org.libreccm.pagemodel; package org.libreccm.pagemodel;
import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
@ -37,25 +38,31 @@ public abstract class AbstractPageBuilder<P> implements PageBuilder<P> {
final P page = buildPage(); final P page = buildPage();
for (final ComponentModel componentModel : pageModel.getComponents()) { for (final ComponentModel componentModel : pageModel.getComponents()) {
final Object component = buildComponent( final Optional<Object> component = buildComponent(
componentModel, componentModel.getClass()); componentModel, componentModel.getClass());
if (component.isPresent()) {
addComponent(page, component); addComponent(page, component);
} }
}
return page; return page;
} }
protected <M extends ComponentModel> Object buildComponent( protected <M extends ComponentModel> Optional<Object> buildComponent(
final ComponentModel componentModel, final ComponentModel componentModel,
final Class<M> componentModelClass) { final Class<M> componentModelClass) {
componentBuilderManager.findComponentBuilder(componentModel.getClass(), componentBuilderManager.findComponentBuilder(componentModel.getClass(),
getType()); getType());
final ComponentBuilder<M, ?> builder = componentBuilderManager final Optional<ComponentBuilder<M, ?>> builder = componentBuilderManager
.findComponentBuilder(componentModelClass, getType()); .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(); protected abstract String getType();

View File

@ -19,10 +19,13 @@
package org.libreccm.pagemodel; package org.libreccm.pagemodel;
import java.util.Iterator; import java.util.Iterator;
import java.util.Optional;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Instance; import javax.enterprise.inject.Instance;
import javax.enterprise.util.AnnotationLiteral; import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/** /**
* *
@ -31,35 +34,42 @@ import javax.inject.Inject;
@RequestScoped @RequestScoped
public class ComponentBuilderManager { public class ComponentBuilderManager {
private static final Logger LOGGER = LogManager.getLogger(
ComponentBuilderManager.class);
@Inject @Inject
private Instance<ComponentBuilder<?, ?>> componentBuilders; private Instance<ComponentBuilder<?, ?>> componentBuilders;
public <M extends ComponentModel> ComponentBuilder<M, ?> findComponentBuilder( public <M extends ComponentModel> Optional<ComponentBuilder<M, ?>> findComponentBuilder(
final Class<M> componentModelClass, final Class<M> componentModelClass,
final String type) { final String type) {
LOGGER.debug("Trying to find ComponentBuilder for ComponentModel\"{}\""
+ "and type \"{}\"...",
componentModelClass.getName(),
type);
final ComponentModelTypeLiteral literal = new ComponentModelTypeLiteral( final ComponentModelTypeLiteral literal = new ComponentModelTypeLiteral(
componentModelClass, type); componentModelClass, type);
final Instance<ComponentBuilder<?, ?>> instance = componentBuilders final Instance<ComponentBuilder<?, ?>> instance = componentBuilders
.select(literal); .select(literal);
if (instance.isUnsatisfied()) { if (instance.isUnsatisfied()) {
throw new IllegalArgumentException(String.format( LOGGER.warn("No ComponentBuilder for component model \"%s\" "
"No ComponentBuilder for component model \"%s\" and type \"%s\" " + "and type \"%s\". Ignoring component model.");
+ "available.", return Optional.empty();
componentModelClass.getName(),
type));
} else if (instance.isAmbiguous()) { } else if (instance.isAmbiguous()) {
throw new IllegalArgumentException(String.format( throw new IllegalStateException(String.format(
"Multiple ComponentBuilders for component model \"%s\" and type \"%s\" " "Multiple ComponentBuilders for component model \"%s\" and "
+ "available. Something is wrong", + "type \"%s\" available. Something is wrong",
componentModelClass.getName(), componentModelClass.getName(),
type)); type));
} else { } else {
final Iterator<ComponentBuilder<?, ?>> iterator = instance.iterator(); final Iterator<ComponentBuilder<?, ?>> iterator = instance.
iterator();
final ComponentBuilder<?, ?> componentBuilder = iterator.next(); final ComponentBuilder<?, ?> componentBuilder = iterator.next();
return (ComponentBuilder<M, ?>) componentBuilder; return Optional.of((ComponentBuilder<M, ?>) componentBuilder);
} }
} }

View File

@ -28,6 +28,8 @@ import javax.persistence.Entity;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType; import javax.persistence.GenerationType;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.Table; import javax.persistence.Table;
@ -41,6 +43,7 @@ import javax.validation.constraints.NotNull;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@Entity @Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "PAGE_MODEL_COMPONENT_MODELS", schema = CoreConstants.DB_SCHEMA) @Table(name = "PAGE_MODEL_COMPONENT_MODELS", schema = CoreConstants.DB_SCHEMA)
public class ComponentModel implements Serializable { public class ComponentModel implements Serializable {

View File

@ -58,4 +58,6 @@ public interface PageBuilder<P> {
*/ */
P buildPage(PageModel pageModel); P buildPage(PageModel pageModel);
} }

View File

@ -47,9 +47,12 @@ public abstract class AbstractBebopPageBuilder extends AbstractPageBuilder<Page>
@Override @Override
public Page buildPage() { public Page buildPage() {
final String application = Web.getWebContext().getApplication().getPrimaryUrl(); final String application = Web.getWebContext().getApplication().
getPrimaryUrl();
final Page page = PageFactory.buildPage(application, ""); final Page page = PageFactory.buildPage(application, "");
addDefaultComponents(page);
return page; return page;
} }

View File

@ -17,18 +17,27 @@
* MA 02110-1301 USA * MA 02110-1301 USA
*/ */
/** /**
* <p>
* The {@code pagemodel} packages provides an abstraction layer between the data * The {@code pagemodel} packages provides an abstraction layer between the data
* model of page and its generating components. This layer replaces the JSP * model of page and its generating components. This layer replaces the JSP
* templates which were used in previous versions for this purpose. * templates which were used in previous versions for this purpose.
* * </p>
* <p>
* The Page Model system allows it to specify which components are used on a * 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 * 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 * 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 * page in ccm-cms. The Page Model system uses data containers which are read by
* some builder classes. Because we are not using an active code in the page * some builder classes. Because we are not using any active code in the page
* models this avoids a potential attack point. * models this avoids a potential attack point.
* * </p>
* * <p>
* 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.
* </p>
* *
*/ */
package org.libreccm.pagemodel; package org.libreccm.pagemodel;