More classes for the backport of Pages and Theming from 7.0
git-svn-id: https://svn.libreccm.org/ccm/trunk@5802 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
7212f10705
commit
4f756133e9
|
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
* 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.libreccm.pagemodel;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An abstract base class for implementations of the {@link PageRenderer}
|
||||||
|
* interface providing some functionality needed by all implementations of the
|
||||||
|
* {@link PageRenderer} interface.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public abstract class AbstractPageRenderer implements PageRenderer {
|
||||||
|
|
||||||
|
private ComponentRendererManager componentRendererManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders a {@code Page} based on a {@link PageModel}. This implementation
|
||||||
|
* first calls {@link #renderPage()} to create the page object. After that
|
||||||
|
* all {@link ComponentModel}s of the {@link PageModel} are processed and
|
||||||
|
* the component objects created by the {@link ComponentRenderer}s are added
|
||||||
|
* to the page.
|
||||||
|
*
|
||||||
|
* @param pageModel The {@link PageModel} to render.
|
||||||
|
* @param parameters Parameters provided by application which wants to
|
||||||
|
* render a {@link PageModel}. The parameters are passed
|
||||||
|
* the {@link ComponentRenderer}s.
|
||||||
|
*
|
||||||
|
* @return A map containing the results from rendering the components of the
|
||||||
|
* page model.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Map<String, Object> renderPage(
|
||||||
|
final PageModel pageModel, final Map<String, Object> parameters) {
|
||||||
|
|
||||||
|
final Map<String, Object> page = renderPage(parameters);
|
||||||
|
|
||||||
|
final ContainerModelCollection containers = pageModel
|
||||||
|
.getContainerModels();
|
||||||
|
while(containers.next()) {
|
||||||
|
final ContainerModel containerModel = containers
|
||||||
|
.getContainerModel();
|
||||||
|
|
||||||
|
final Map<String, Object> container = renderContainer(
|
||||||
|
containerModel, parameters);
|
||||||
|
page.put(containerModel.getKey(), container);
|
||||||
|
}
|
||||||
|
|
||||||
|
return page;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Map<String, Object> renderContainer(
|
||||||
|
final ContainerModel containerModel,
|
||||||
|
final Map<String, Object> parameters) {
|
||||||
|
|
||||||
|
final Map<String, Object> container = new HashMap<>();
|
||||||
|
|
||||||
|
container.put("key", containerModel.getKey());
|
||||||
|
|
||||||
|
final ComponentModelCollection components = containerModel
|
||||||
|
.getComponents();
|
||||||
|
while (components.next()) {
|
||||||
|
final ComponentModel componentModel = components.getComponentModel();
|
||||||
|
|
||||||
|
renderComponent(componentModel,
|
||||||
|
componentModel.getClass(),
|
||||||
|
parameters)
|
||||||
|
.ifPresent(component -> container.put(componentModel.getKey(),
|
||||||
|
component));
|
||||||
|
}
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper method for rendering the components.
|
||||||
|
*
|
||||||
|
* @param <M> Generics variable for the type of rendered
|
||||||
|
* component
|
||||||
|
* @param componentModel The {@link ComponentModel} to process.
|
||||||
|
* @param componentModelClass The class of the {@link ComponentModel}.
|
||||||
|
* @param parameters Parameters provided by application which wants
|
||||||
|
* to render a {@link PageModel}. The parameters
|
||||||
|
* are passed the {@link ComponentRenderer}s.
|
||||||
|
*
|
||||||
|
* @return A map containing the results from rendering the components of the
|
||||||
|
* page model.
|
||||||
|
*/
|
||||||
|
protected <M extends ComponentModel> Optional<Object> renderComponent(
|
||||||
|
final ComponentModel componentModel,
|
||||||
|
final Class<M> componentModelClass,
|
||||||
|
final Map<String, Object> parameters) {
|
||||||
|
|
||||||
|
final Optional<ComponentRenderer<M>> renderer = componentRendererManager
|
||||||
|
.findComponentRenderer(componentModelClass);
|
||||||
|
|
||||||
|
if (renderer.isPresent()) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
final M model = (M) componentModel;
|
||||||
|
return Optional
|
||||||
|
.of(renderer.get().renderComponent(model, parameters));
|
||||||
|
} else {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* 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.libreccm.pagemodel;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@code ComponentRenderer} transforms a {@link ComponentModel} into a
|
||||||
|
* component.
|
||||||
|
*
|
||||||
|
* An implementation must be annotation with the {@link RendersComponent}
|
||||||
|
* qualifier annotation.
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
* @param <M> Type of the model the component renderer processes.
|
||||||
|
*/
|
||||||
|
public interface ComponentRenderer<M extends ComponentModel> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders a {@link ComponentModel}.
|
||||||
|
*
|
||||||
|
* The result of the rendering process is a {@link Map} which uses strings
|
||||||
|
* as key. The values are either Java primitive types or Collections. More
|
||||||
|
* exactly the values are objects of one the following types:
|
||||||
|
*
|
||||||
|
* <ul>
|
||||||
|
* <li>{@link Double}</li>
|
||||||
|
* <li>{@link Float}</li>
|
||||||
|
* <li>{@link Integer}</li>
|
||||||
|
* <li>{@link Long}</li>
|
||||||
|
* <li>{@link Short}</li>
|
||||||
|
* <li>{@link String}</li>
|
||||||
|
* <li>{@link List}</li>
|
||||||
|
* <li>{@link Map}</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* Other subtypes {@link Collection} are might be supported but there is no
|
||||||
|
* guarantee for that. The values in a collection must be one of the types
|
||||||
|
* in the list above. Collections might contain multiple types from the list
|
||||||
|
* above. The keys for a map should always be strings.
|
||||||
|
*
|
||||||
|
* @param componentModel The component model to render.
|
||||||
|
* @param parameters Parameters provided by the calling
|
||||||
|
* {@link PageRenderer}.
|
||||||
|
*
|
||||||
|
* @return A map representing the rendered component.
|
||||||
|
*/
|
||||||
|
Map<String, Object> renderComponent(M componentModel,
|
||||||
|
Map<String, Object> parameters);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
package org.libreccm.pagemodel;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
public class ComponentRendererManager {
|
||||||
|
|
||||||
|
private static final Logger LOGGER = LogManager
|
||||||
|
.getLogger(ComponentRendererManager.class);
|
||||||
|
|
||||||
|
private static final ComponentRendererManager INSTANCE
|
||||||
|
= new ComponentRendererManager();
|
||||||
|
|
||||||
|
private final Map<Class<?>, ComponentRenderer<?>> componentRenderers;
|
||||||
|
|
||||||
|
public ComponentRendererManager() {
|
||||||
|
|
||||||
|
componentRenderers = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ComponentRendererManager getInstance() {
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find an implementation of the {@link ComponentRenderer} interface for a
|
||||||
|
* specific {@link ComponentModel}.
|
||||||
|
*
|
||||||
|
* @param <M> Generic variable for the subtype of
|
||||||
|
* {@link ComponentModel} which is produced by
|
||||||
|
* the {@link ComponentRenderer} implementation.
|
||||||
|
* @param componentModelClass The sub class of the {@link ComponentModel}
|
||||||
|
* for which is processed by the
|
||||||
|
* {@link ComponentRenderer}.
|
||||||
|
*
|
||||||
|
* @return An {@link Optional} containing the implementation of the
|
||||||
|
* {@link ComponentRenderer} interface for the specified parameters.
|
||||||
|
* If there is no implementation for the specified parameters an
|
||||||
|
* empty {@link Optional} is returned.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings({"unchecked"})
|
||||||
|
public <M extends ComponentModel> Optional<ComponentRenderer<M>> findComponentRenderer(
|
||||||
|
final Class<M> componentModelClass) {
|
||||||
|
|
||||||
|
if (componentRenderers.containsKey(componentModelClass)) {
|
||||||
|
return Optional.of((ComponentRenderer<M>) componentRenderers
|
||||||
|
.get(componentModelClass));
|
||||||
|
} else {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public <M extends ComponentModel> void registerComponentRenderer(
|
||||||
|
final Class<M> componentClass,
|
||||||
|
final ComponentRenderer<M> componentRenderer) {
|
||||||
|
|
||||||
|
componentRenderers.put(componentClass, componentRenderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* 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.libreccm.pagemodel;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
public class PageModelRepository {
|
||||||
|
|
||||||
|
private static final PageModelRepository INSTANCE = new PageModelRepository();
|
||||||
|
|
||||||
|
private PageModelRepository() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final PageModelRepository getInstance() {
|
||||||
|
return INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save(final PageModel pageModel) {
|
||||||
|
|
||||||
|
Objects.requireNonNull(pageModel);
|
||||||
|
|
||||||
|
pageModel.setLastModified(new Date());
|
||||||
|
|
||||||
|
if (pageModel.getUuid() == null) {
|
||||||
|
pageModel.setUuid(UUID.randomUUID().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pageModel.getModelUuid() == null) {
|
||||||
|
pageModel.setModelUuid(pageModel.getUuid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* 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.libreccm.pagemodel;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for page renderers. A page renderer is invoked to render a page of
|
||||||
|
* specific type. An implementation should be a CDI bean which is annotated with
|
||||||
|
* the qualifier {@link RendersPageModelType}.
|
||||||
|
*
|
||||||
|
* An implementation should add all default components which have to be present
|
||||||
|
* in page. The {@link PageModel} should only specify
|
||||||
|
* <strong>additional</strong> components.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||||
|
*/
|
||||||
|
public interface PageRenderer {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render a page with the default components for a application. An
|
||||||
|
* implementation of {@link #renderPage(org.libreccm.pagemodel.PageModel)}
|
||||||
|
* should use this method for creating the default page.
|
||||||
|
*
|
||||||
|
* The result of the rendering process is a map with the values of the
|
||||||
|
* {@link ComponentModel#key} property as key and the result of rendering
|
||||||
|
* the component as value.
|
||||||
|
*
|
||||||
|
* @param parameters Parameters provided by application which wants to
|
||||||
|
* render a {@link PageModel}. The parameters are passed
|
||||||
|
* the {@link ComponentRenderer}s.
|
||||||
|
*
|
||||||
|
* @return A page with the default components.
|
||||||
|
*/
|
||||||
|
Map<String, Object> renderPage(Map<String, Object> parameters);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render a page using the provided {@link PageModel}. Implementations
|
||||||
|
* should call the implementation of {@link #renderPage()} for creating the
|
||||||
|
* basic page with the default components.
|
||||||
|
*
|
||||||
|
* The result of the rendering process is a map with the values of the
|
||||||
|
* {@link ComponentModel#key} property as key and the result of rendering
|
||||||
|
* the component as value.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param pageModel The {@link PageModel} from which the page is generated.
|
||||||
|
* @param parameters Parameters provided by application which wants to
|
||||||
|
* render a {@link PageModel}. The parameters are passed
|
||||||
|
* the {@link ComponentRenderer}s.
|
||||||
|
*
|
||||||
|
* @return The page generated from the provided {@link PageModel}.
|
||||||
|
*/
|
||||||
|
Map<String, Object> renderPage(PageModel pageModel,
|
||||||
|
Map<String, Object> parameters);
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue