CCM NG: JavaDoc for Sites and PageModel

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5074 8810af33-2d31-482b-a856-94f89814c4df

Former-commit-id: 8a4fed4311
pull/2/head
jensp 2017-10-23 14:35:44 +00:00
parent 684955b55d
commit 1ce2997266
51 changed files with 1102 additions and 132 deletions

View File

@ -42,8 +42,13 @@ import javax.ws.rs.core.Response;
import static org.librecms.pages.PagesConstants.*; import static org.librecms.pages.PagesConstants.*;
import org.libreccm.pagemodel.ComponentRenderer; import org.libreccm.pagemodel.ComponentRenderer;
import org.librecms.pagemodel.contentitems.ContentItemRenderer;
/** /**
*
* Abstract base class for rendering an {@link ContentItemComponent} which
* provides some logic useful for most implementations of
* {@link ContentItemComponentRenderer}.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
* @param <T> * @param <T>
@ -53,7 +58,7 @@ public abstract class AbstractContentItemComponentRenderer<T extends ContentItem
@Inject @Inject
private ConfigurationManager confManager; private ConfigurationManager confManager;
@Inject @Inject
private ContentItemRenderers contentItemRenderers; private ContentItemRenderers contentItemRenderers;
@ -66,15 +71,46 @@ public abstract class AbstractContentItemComponentRenderer<T extends ContentItem
@Inject @Inject
private PermissionChecker permissionChecker; private PermissionChecker permissionChecker;
/**
* Retrieves the content item to render.
*
* @param componentModel The {@link ComponentModel} which is rendered.
* @param parameters Additional parameters.
*
* @return The {@link ContentItem} to render.
*/
protected abstract ContentItem getContentItem( protected abstract ContentItem getContentItem(
T componentModel, final Map<String, Object> parameters); T componentModel, final Map<String, Object> parameters);
/**
* Renders the provided {@link ContentItemComponent} and the
* {@link ContentItem} retrieved by
* {@link #getContentItem(org.librecms.pagemodel.ContentItemComponent, java.util.Map)}.
*
* The {@link ContentItem} is rendered using an appropriate implementation
* of {@link ContentItemRenderer}. This method use the draft version of the
* item there is an parameters {@code showDraftItem} in the
* {@code parameters} map with the value {@code true}. If
* {@code showDraftItem} is set to {@code true} and the current user is not
* permitted to new the draft version of the item an
* {@link WebApplicationException} with the correct HTTP response code is
* thrown.
*
* Likewise of the current user is not permitted to view the view version of
* the item an {@link WebApplicationException} with the correct HTTP
* response code is thrown.
*
* @param componentModel The {@link ComponentModel} to render.
* @param parameters Additional parameters.
*
* @return The rendered component.
*/
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@Override @Override
public Map<String, Object> renderComponent( public Map<String, Object> renderComponent(
final T componentModel, final T componentModel,
final Map<String, Object> parameters) { final Map<String, Object> parameters) {
Objects.requireNonNull(componentModel); Objects.requireNonNull(componentModel);
Objects.requireNonNull(parameters); Objects.requireNonNull(parameters);
@ -121,6 +157,17 @@ public abstract class AbstractContentItemComponentRenderer<T extends ContentItem
} }
} }
/**
* A helper method for rendering the {@link ContentItem}. There should be no
* need to overwrite this method, but maybe there are scenarios where this
* is necessary.
*
* @param componentModel The component model to render.
* @param parameters Additional parameters.
* @param item The item to render.
*
* @return The rendered content item.
*/
protected Map<String, Object> generateItem( protected Map<String, Object> generateItem(
final T componentModel, final T componentModel,
final Map<String, Object> parameters, final Map<String, Object> parameters,
@ -136,13 +183,14 @@ public abstract class AbstractContentItemComponentRenderer<T extends ContentItem
} }
if (iteml10nManager.hasLanguage(item, language)) { if (iteml10nManager.hasLanguage(item, language)) {
final AbstractContentItemRenderer renderer = contentItemRenderers final AbstractContentItemRenderer renderer = contentItemRenderers
.findRenderer(item.getClass(), componentModel.getMode()); .findRenderer(item.getClass(), componentModel.getMode());
return renderer.render(item, language); return renderer.render(item, language);
} else { } else {
throw new NotFoundException("Requested language is not available."); throw new NotFoundException("Requested language is not available.");
} }
} }
} }

View File

@ -43,7 +43,8 @@ import javax.ws.rs.NotFoundException;
import static org.librecms.pages.PagesConstants.*; import static org.librecms.pages.PagesConstants.*;
/** /**
* * Renderer for the {@link CategorizedItemComponent}.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped

View File

@ -23,10 +23,8 @@ import com.arsdigita.kernel.KernelConfig;
import org.libreccm.categorization.Category; import org.libreccm.categorization.Category;
import org.libreccm.categorization.CategoryManager; import org.libreccm.categorization.CategoryManager;
import org.libreccm.categorization.CategoryRepository; import org.libreccm.categorization.CategoryRepository;
import org.libreccm.categorization.DomainRepository;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.CcmObject; import org.libreccm.core.CcmObject;
import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.pagemodel.ComponentModelType; import org.libreccm.pagemodel.ComponentModelType;
import java.util.HashMap; import java.util.HashMap;
@ -45,7 +43,8 @@ import static org.librecms.pages.PagesConstants.*;
import org.libreccm.pagemodel.ComponentRenderer; import org.libreccm.pagemodel.ComponentRenderer;
/** /**
* * Renderer for the {@link CategoryTreeComponent}.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped

View File

@ -30,7 +30,8 @@ import javax.persistence.Table;
import static org.librecms.CmsConstants.*; import static org.librecms.CmsConstants.*;
/** /**
* * Component for showing a specific {@link ContentItem}.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@Entity @Entity

View File

@ -30,7 +30,8 @@ import javax.inject.Inject;
import javax.ws.rs.NotFoundException; import javax.ws.rs.NotFoundException;
/** /**
* * Renderer for the {@link FixedContentItemComponent}.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped

View File

@ -36,7 +36,8 @@ import javax.ws.rs.NotFoundException;
import static org.librecms.pages.PagesConstants.*; import static org.librecms.pages.PagesConstants.*;
/** /**
* * Renderer for the {@link GreetingItemComponent}.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped

View File

@ -22,8 +22,6 @@ import com.arsdigita.kernel.KernelConfig;
import org.libreccm.categorization.Categorization; import org.libreccm.categorization.Categorization;
import org.libreccm.categorization.Category; import org.libreccm.categorization.Category;
import org.libreccm.categorization.CategoryManager;
import org.libreccm.categorization.CategoryRepository;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.UnexpectedErrorException; import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.pagemodel.ComponentModelType; import org.libreccm.pagemodel.ComponentModelType;
@ -57,7 +55,8 @@ import javax.servlet.http.HttpServletRequest;
import static org.librecms.pages.PagesConstants.*; import static org.librecms.pages.PagesConstants.*;
/** /**
* * Renderer for the {@link ItemListComponent}.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
@ -166,7 +165,10 @@ public class ItemListComponentRenderer
final Join<? extends ContentItem, Categorization> catJoin = from final Join<? extends ContentItem, Categorization> catJoin = from
.join("categories"); .join("categories");
criteriaQuery.where(catJoin.get("category").in(categories)); criteriaQuery
.where(criteriaBuilder
.and(catJoin.get("category").in(categories),
criteriaBuilder.equal(catJoin.get("index"), false)));
criteriaQuery criteriaQuery
.orderBy(listOrder .orderBy(listOrder

View File

@ -25,11 +25,33 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
/** /**
* Abstract base class for rendering {@link Asset}s.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
public abstract class AbstractAssetRenderer { public abstract class AbstractAssetRenderer {
/**
* Basic implementation rendering the common properties of an asset. For
* rendering the specific properties of the asset this method calls
* {@link #renderAsset(org.librecms.contentsection.Asset, java.util.Locale, java.util.Map)}.
*
* The common properties put into {@code result} are:
*
* <pre>
* {
* "objectId": {@link Asset#getObjectId()}
* "uuid": {@link Asset#getUuid()}
* "displayName": {@link Asset#getDisplayName()}
* "title": {@link Asset#getTitle()}
* }
* </pre>
*
* @param asset The {@link Asset} to render.
* @param language The current language.
*
* @return The rendered asset.
*/
public Map<String, Object> render(final Asset asset, public Map<String, Object> render(final Asset asset,
final Locale language) { final Locale language) {
@ -45,6 +67,15 @@ public abstract class AbstractAssetRenderer {
return result; return result;
} }
/**
* Renders the special properties of an specific asset type. If the provided
* asset is not of the correct type for the renderer this an implementation
* of this method should return without doing anything.
*
* @param asset The {@link Asset} to render.
* @param language The current language.
* @param result The map in which the rendered properties are stored.
*/
protected abstract void renderAsset(final Asset asset, protected abstract void renderAsset(final Asset asset,
final Locale language, final Locale language,
final Map<String, Object> result); final Map<String, Object> result);

View File

@ -28,7 +28,8 @@ import java.lang.annotation.Target;
import javax.inject.Qualifier; import javax.inject.Qualifier;
/** /**
* * Annotation for marking asset renderers.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@Qualifier @Qualifier

View File

@ -31,6 +31,8 @@ import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Provides access to all available implementations of
* {@link AbstractAssetRenderer}.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -43,6 +45,17 @@ public class AssetRenderers {
@Inject @Inject
private Instance<AbstractAssetRenderer> renderers; private Instance<AbstractAssetRenderer> renderers;
/**
* Tries to find an implementation of {@link AbstractAssetRenderer} for the
* provided asset type. If no renderer is found for the provided
* {@code assetType} an noop implementation of {@link AbstractAssetRenderer}
* is returned. This means that only the common properties of the asset are
* rendered.
*
* @param assetType The asset type.
*
* @return An renderer for the provided asset type.
*/
public AbstractAssetRenderer findRenderer( public AbstractAssetRenderer findRenderer(
final Class<? extends Asset> assetType) { final Class<? extends Asset> assetType) {

View File

@ -29,6 +29,7 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Renderer for {@link AudioAsset}s.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -39,23 +40,42 @@ public class AudioAssetRenderer extends BinaryAssetRenderer {
@Inject @Inject
@AssetRenderer(renders = LegalMetadata.class) @AssetRenderer(renders = LegalMetadata.class)
private AbstractAssetRenderer legalMetadataRenderer; private AbstractAssetRenderer legalMetadataRenderer;
/**
* Renders to provided {@link AudioAsset}. The following properties are put
* into {@code result}:
*
* <pre>
* {
* "legamMetadata": {@link AudioAsset#getLegalMetadata()}.
* }
* </pre>
*
* The associated {@link LegalMetadata} asset is rendered using
* {@link LegalMetadataRenderer} and the result is put {@code result} under
* the key {@code legalMetadata}.
*
* @param asset The asset to render.
* @param language The current language.
* @param result The map into which the result is placed.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale language, final Locale language,
final Map<String, Object> result) { final Map<String, Object> result) {
super.renderAsset(asset, language, result); super.renderAsset(asset, language, result);
final AudioAsset audioAsset; final AudioAsset audioAsset;
if (asset instanceof AudioAsset) { if (asset instanceof AudioAsset) {
audioAsset = (AudioAsset) asset; audioAsset = (AudioAsset) asset;
} else { } else {
return; return;
} }
result.put("legalMetadata", result.put("legalMetadata",
legalMetadataRenderer.render(audioAsset.getLegalMetadata(), language)); legalMetadataRenderer.render(audioAsset.getLegalMetadata(),
language));
} }
} }

View File

@ -26,28 +26,52 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
/** /**
* A renderer for {@link BinaryAsset}s. Please note that the binary data is
* usually not included into the render result. Instead an URL to a service
* which provides the binary data is included. For more details see the
* documentation of the specific renderers.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
public class BinaryAssetRenderer extends AbstractAssetRenderer { public class BinaryAssetRenderer extends AbstractAssetRenderer {
/**
* Renders the common properties of all {@link BinaryAssets}. These are the
* following properties:
*
* <pre>
* {
* "description": {@link BinaryAsset#getDescription()}
* "fileName": {@link BinaryAsset#getFileName()}
* "mimeType": {@link BinaryAsset#getMimeType()}
* "size": {@link BinaryAsset#getSize()}.
* }
* </pre>
*
* The mime type is converted to a string using
* {@link Objects#toString(java.lang.Object)}.
*
* @param asset The asset to render.
* @param language The current language.
* @param result The map into which the result is put.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale language, final Locale language,
final Map<String, Object> result) { final Map<String, Object> result) {
final BinaryAsset binaryAsset; final BinaryAsset binaryAsset;
if (asset instanceof BinaryAsset) { if (asset instanceof BinaryAsset) {
binaryAsset = (BinaryAsset) asset; binaryAsset = (BinaryAsset) asset;
} else { } else {
return; return;
} }
result.put("description", result.put("description",
binaryAsset.getDescription().getValue(language)); binaryAsset.getDescription().getValue(language));
result.put("fileName", binaryAsset.getFileName()); result.put("fileName", binaryAsset.getFileName());
result.put("mimeType", Objects.toString(binaryAsset.getMimeType())); result.put("mimeType", Objects.toString(binaryAsset.getMimeType()));
result.put("size", binaryAsset.getSize()); result.put("size", binaryAsset.getSize());
} }
} }

View File

@ -19,8 +19,6 @@
package org.librecms.pagemodel.assets; package org.librecms.pagemodel.assets;
import org.librecms.contentsection.Asset; import org.librecms.contentsection.Asset;
import org.librecms.pagemodel.assets.AbstractAssetRenderer;
import org.librecms.pagemodel.assets.AssetRenderer;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -30,6 +28,7 @@ import javax.enterprise.context.RequestScoped;
import org.librecms.assets.Bookmark; import org.librecms.assets.Bookmark;
/** /**
* Renderer for {@link Bookmark} assets.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -37,20 +36,35 @@ import org.librecms.assets.Bookmark;
@AssetRenderer(renders = Bookmark.class) @AssetRenderer(renders = Bookmark.class)
public class BookmarkRenderer extends AbstractAssetRenderer { public class BookmarkRenderer extends AbstractAssetRenderer {
/**
* Renders the provided {@link BookmarkAsset}. The following properties
* are put into {@code result}:
*
* <pre>
* {
* "description": {@link Bookmark#getDescription()}
* "url": {@link Bookmark#getUrl()}.
* }
* </pre>
*
* @param asset The asset to render.
* @param language The current language.
* @param result The map into which the result is placed.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale language, final Locale language,
final Map<String, Object> result) { final Map<String, Object> result) {
final Bookmark bookmark; final Bookmark bookmark;
if (asset instanceof Bookmark) { if (asset instanceof Bookmark) {
bookmark = (Bookmark) asset; bookmark = (Bookmark) asset;
} else { } else {
return; return;
} }
result.put("description", bookmark.getDescription().getValue(language)); result.put("description", bookmark.getDescription().getValue(language));
result.put("url", bookmark.getUrl()); result.put("url", bookmark.getUrl());
} }
} }

View File

@ -29,7 +29,8 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* * Renderer for {@link ExternalAudioAsset}s.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
@ -40,6 +41,25 @@ public class ExternalAudioAssetRenderer extends BookmarkRenderer {
@AssetRenderer(renders = LegalMetadata.class) @AssetRenderer(renders = LegalMetadata.class)
private AbstractAssetRenderer legalMetadataRenderer; private AbstractAssetRenderer legalMetadataRenderer;
/**
* Renders the provided {@link ExternalVideoAsset}. In addition to the data
* put into {@code result} by the {@link BookmarkRenderer} the following
* properties are put into the map:
*
* <pre>
* {
* "legalMetadata": {@link ExternalVideoAsset#getLegalMetadata()}
* }
* </pre>
*
* The associated {@link LegalMetadata} asset is rendered using the
* {@link LegalMetadata} and the result is put into the map under the key
* {@code legalMetadata}.
*
* @param asset The asset to render.
* @param language The current language
* @param result The map into which the result is put.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale language, final Locale language,

View File

@ -29,6 +29,7 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Renderer for {@link ExternalVideoAsset}s.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -40,12 +41,31 @@ public class ExternalVideoAssetRenderer extends BookmarkRenderer {
@AssetRenderer(renders = LegalMetadata.class) @AssetRenderer(renders = LegalMetadata.class)
private AbstractAssetRenderer legalMetadataRenderer; private AbstractAssetRenderer legalMetadataRenderer;
/**
* Renders the provided {@link ExternalVideoAsset}. In addition to the data
* put into {@code result} by the {@link BookmarkRenderer} the following
* properties are put into the map:
*
* <pre>
* {
* "legalMetadata": {@link ExternalVideoAsset#getLegalMetadata()}
* }
* </pre>
*
* The associated {@link LegalMetadata} asset is rendered using the
* {@link LegalMetadata} and the result is put into the map under the key
* {@code legalMetadata}.
*
* @param asset The asset to render.
* @param language The current language
* @param result The map into which the result is put.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale locale, final Locale language,
final Map<String, Object> result) { final Map<String, Object> result) {
super.renderAsset(asset, locale, result); super.renderAsset(asset, language, result);
final ExternalVideoAsset externalVideoAsset; final ExternalVideoAsset externalVideoAsset;
if (asset instanceof ExternalVideoAsset) { if (asset instanceof ExternalVideoAsset) {
@ -56,7 +76,7 @@ public class ExternalVideoAssetRenderer extends BookmarkRenderer {
result.put("legalMetadata", result.put("legalMetadata",
legalMetadataRenderer legalMetadataRenderer
.render(externalVideoAsset.getLegalMetadata(), locale)); .render(externalVideoAsset.getLegalMetadata(), language));
} }
} }

View File

@ -27,21 +27,29 @@ import java.util.Map;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
/** /**
* Renderer for {@link FileAsset}s.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
@AssetRenderer(renders = FileAsset.class) @AssetRenderer(renders = FileAsset.class)
public class FileAssetRenderer extends BinaryAssetRenderer { public class FileAssetRenderer extends BinaryAssetRenderer {
/**
* Renders the provided {@link FileAsset}. No additional data.
*
* @param asset
* @param locale
* @param result
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale locale, final Locale locale,
final Map<String, Object> result) { final Map<String, Object> result) {
super.renderAsset(asset, locale, result); super.renderAsset(asset, locale, result);
//Nothing more yet //Nothing more yet
} }
} }

View File

@ -29,6 +29,7 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Renderer for {@link ImageRenderer}.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -40,6 +41,26 @@ public class ImageRenderer extends BinaryAssetRenderer {
@AssetRenderer(renders = LegalMetadata.class) @AssetRenderer(renders = LegalMetadata.class)
private AbstractAssetRenderer legalMetadataRenderer; private AbstractAssetRenderer legalMetadataRenderer;
/**
* Renders the provided {@link ImageAsset}. The following data is put into
* the map:
*
* <pre>
* {
* "width": {@link Image#getWidth()}
* "height": {@link Image#getHeight()}
* "legalMetadata": {@link LegalMetadataRenderer#render(org.librecms.contentsection.Asset, java.util.Locale)} using {@link Image#getLegalMetadata()}.
* }
* </pre>
*
* The associated {@link LegalMetadata} asset is rendered using
* {@link LegalMetadataRenderer} and the result is put into map under the
* key {@code legalMetadata}.
*
* @param asset The asset to render.
* @param language The current language.
* @param result The map into which the result is put.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale language, final Locale language,

View File

@ -28,6 +28,7 @@ import java.util.Map;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
/** /**
* Renderer for {@link LegalMetadata} assets.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -35,24 +36,40 @@ import javax.enterprise.context.RequestScoped;
@AssetRenderer(renders = LegalMetadata.class) @AssetRenderer(renders = LegalMetadata.class)
public class LegalMetadataRenderer extends AbstractAssetRenderer { public class LegalMetadataRenderer extends AbstractAssetRenderer {
/**
* Render the provided {@link LegalMetadata} asset. The following properties
* are added to the {@code result} map:
*
* <pre>
* "rightsHolder": {@link LegalMetadata#getRightsHolder()}
* "rights": {@link LegalMetadata#getRights()}
* "publisher": {@link LegalMetadata#getPublisher()}
* "creator": {@link LegalMetadata#getCreator()}
* "contributors": {@link LegalMetadata#getContributors()}
* </pre>
*
* @param asset The asset to renderer.
* @param language The current language.
* @param result The map into which the result is placed.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale language, final Locale language,
final Map<String, Object> result) { final Map<String, Object> result) {
final LegalMetadata legalMetadata; final LegalMetadata legalMetadata;
if (asset instanceof LegalMetadata) { if (asset instanceof LegalMetadata) {
legalMetadata = (LegalMetadata) asset; legalMetadata = (LegalMetadata) asset;
} else { } else {
return; return;
} }
result.put("rightsHolder", legalMetadata.getRightsHolder()); result.put("rightsHolder", legalMetadata.getRightsHolder());
result.put("rights", legalMetadata.getRights().getValue(language)); result.put("rights", legalMetadata.getRights().getValue(language));
result.put("publisher", legalMetadata.getPublisher()); result.put("publisher", legalMetadata.getPublisher());
result.put("creator", legalMetadata.getCreator()); result.put("creator", legalMetadata.getCreator());
result.put("contributors", result.put("contributors",
new ArrayList<>(legalMetadata.getContributors())); new ArrayList<>(legalMetadata.getContributors()));
} }
} }

View File

@ -31,6 +31,7 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Renderer for {@link RelatedLink} assets.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -42,6 +43,36 @@ public class RelatedLinkRenderer extends AbstractAssetRenderer {
@AssetRenderer(renders = Bookmark.class) @AssetRenderer(renders = Bookmark.class)
private AbstractAssetRenderer bookmarkRenderer; private AbstractAssetRenderer bookmarkRenderer;
/**
* Render the provided {@link RelatedLink}.
*
* Depending on the type of the {@link RelatedLink} (internal or external)
* different properties are placed into {@code result}.
*
* For internal links: An entry with the key {@code targetItem} and a map
* containing the following properties of the target item:
*
* <pre>
* {
* "objectId": {@link ContentItem#getObjectId()}
* "itemUuid": {@link ContentItem#getItemUuid()}
* "displayName": {@link ContentItem#getDisplayName()}
* "name": {@link ContentItem#getName()}
* "title": {@link ContentItem#getTitle()}
* "description": {@link ContentItem#getDescription()}
* }
* </pre>
*
* For external links an {@link RelatedLink} uses a association with a
* {@link Bookmark}. The {@code Bookmark} is rendered using the
* {@link BookmarkRenderer}. The result is put into {@code result} with the
* key {@code bookmark}.
*
*
* @param asset The asset to render.
* @param language The current language.
* @param result The map is which to result is stored.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale language, final Locale language,

View File

@ -27,6 +27,7 @@ import java.util.Map;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
/** /**
* Renderer for {@link SideNote} assets.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -34,21 +35,33 @@ import javax.enterprise.context.RequestScoped;
@AssetRenderer(renders = SideNote.class) @AssetRenderer(renders = SideNote.class)
public class SideNoteRenderer extends AbstractAssetRenderer { public class SideNoteRenderer extends AbstractAssetRenderer {
/**
* Renderer to provided {@link SideNote}. The only property put into
* {@code result} by this renderer is {@code text}:
*
* <pre>
* {
* "text": {@link SideNote#getText()}
* }
* </pre>
*
* @param asset The {@link SideNote} to render.
* @param language The current language.
* @param result The into which the result is placed.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale language, final Locale language,
final Map<String, Object> result) { final Map<String, Object> result) {
final SideNote siteNote; final SideNote siteNote;
if (asset instanceof SideNote) { if (asset instanceof SideNote) {
siteNote = (SideNote) asset; siteNote = (SideNote) asset;
} else { } else {
return; return;
} }
result.put("text", siteNote.getText().getValue(language)); result.put("text", siteNote.getText().getValue(language));
} }
} }

View File

@ -29,36 +29,53 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Renderer for {@link VideoAsset}s.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
@AssetRenderer(renders = VideoAsset.class) @AssetRenderer(renders = VideoAsset.class)
public class VideoAssetRenderer extends BinaryAssetRenderer { public class VideoAssetRenderer extends BinaryAssetRenderer {
@Inject @Inject
@AssetRenderer(renders = LegalMetadata.class) @AssetRenderer(renders = LegalMetadata.class)
private AbstractAssetRenderer legalMetadataRenderer; private AbstractAssetRenderer legalMetadataRenderer;
/**
* Renders the provided {@link VideoAsset}. The following properties a put
* into {@code result}:
*
* <pre>
* {
* width: {@link VideoAsset#getWidth()}
* height: {@link VideoAsset#getHeight()}
* legalMetadata: {@link VideoAsset#getLegalMetadata()}
* }
* </pre>
*
* @param asset The asset to render.
* @param language The current language.
* @param result The map into which the result is put.
*/
@Override @Override
protected void renderAsset(final Asset asset, protected void renderAsset(final Asset asset,
final Locale locale, final Locale language,
final Map<String, Object> result) { final Map<String, Object> result) {
super.renderAsset(asset, locale, result); super.renderAsset(asset, language, result);
final VideoAsset videoAsset; final VideoAsset videoAsset;
if (asset instanceof VideoAsset) { if (asset instanceof VideoAsset) {
videoAsset = (VideoAsset) asset; videoAsset = (VideoAsset) asset;
} else { } else {
return; return;
} }
result.put("width", videoAsset.getWidth()); result.put("width", videoAsset.getWidth());
result.put("height", videoAsset.getHeight()); result.put("height", videoAsset.getHeight());
result.put("legalMetadata", result.put("legalMetadata",
legalMetadataRenderer.render(videoAsset.getLegalMetadata(), legalMetadataRenderer.render(videoAsset.getLegalMetadata(),
locale)); language));
} }
} }

View File

@ -18,11 +18,13 @@
*/ */
package org.librecms.pagemodel.contentitems; package org.librecms.pagemodel.contentitems;
import org.libreccm.messaging.Attachment;
import org.librecms.pagemodel.assets.AbstractAssetRenderer; import org.librecms.pagemodel.assets.AbstractAssetRenderer;
import org.librecms.contentsection.AttachmentList; import org.librecms.contentsection.AttachmentList;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
import org.librecms.contentsection.ItemAttachment; import org.librecms.contentsection.ItemAttachment;
import org.librecms.contentsection.rs.ContentItems;
import org.librecms.pagemodel.assets.AssetRenderers; import org.librecms.pagemodel.assets.AssetRenderers;
import java.util.HashMap; import java.util.HashMap;
@ -33,6 +35,7 @@ import java.util.stream.Collectors;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Base class for the renderers for {@link ContentItems}.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -41,6 +44,44 @@ public abstract class AbstractContentItemRenderer {
@Inject @Inject
private AssetRenderers assetRenderers; private AssetRenderers assetRenderers;
/**
* This method should be called to render a {@link ContentItem}. The method
* puts the common properties for {@link ContentItem}s into {@code result}
* and than calls
* {@link #renderItem(org.librecms.contentsection.ContentItem, java.util.Locale, java.util.Map)}
* to put the special properties of provided item into {@code result}.
*
* The common properties put into {@code result} are:
*
* <pre>
* {
* "objectId": {@link ContentItem#getObjectId()}
* "uuid": {@link ContentItem#getUuid()}
* "displayName": {@link ContentItem#getDisplayName()}
* "itemUuid": {@link ContentItem#getItemUuid()}
* "name": {@link ContentItem#getName()}
* "title": {@link ContentItem#getTitle()}
* "contentType": {@link ContentItem#getContentType()}
* "description": {@link ContentItem#getDescription()}
* "creationDate": {@link ContentItem#getCreationDate()}
* "lastModified": {@link ContentItem#getLastModified()}
* "creationUserName": {@link ContentItem#getCreationUserName()}
* "lastModifyingUserName": {@link ContentItem#getLastModifyingUserName()}
* "attachments": {@link ContentItem#getAttachments()}.
* }
* </pre>
*
* The value of {@link ContentItem#getContentType} is rendered by
* {@link #renderContentType(org.librecms.contentsection.ContentType, java.util.Locale)}.
*
* The value of {@link ContentItem#getAttachments()} is rendered using
* {@link #renderAttachmentList(org.librecms.contentsection.AttachmentList, java.util.Locale)}.
*
* @param item The item to render.
* @param language The current language.
*
* @return A map with the data of the provided {@link ContentItem}.
*/
public Map<String, Object> render(final ContentItem item, public Map<String, Object> render(final ContentItem item,
final Locale language) { final Locale language) {
@ -75,6 +116,24 @@ public abstract class AbstractContentItemRenderer {
final Locale language, final Locale language,
final Map<String, Object> result); final Map<String, Object> result);
/**
* Renders the {@link ContentType} of an {@link ContentItem}. The generated
* map contains the following values:
*
* <pre>
* {
* "objectId": {@link ContentType#getObjectId()}
* "uuid": {@link ContentType#getUuid()}
* "displayName": {@link ContentType#getDisplayName()}
* "label": {@link ContentType#getLabel()}
* }
* </pre>
*
* @param contentType The {@link ContentType} to render.
* @param language The current language.
*
* @return A map with the properties of the {@link ContentType}.
*/
protected Map<String, Object> renderContentType( protected Map<String, Object> renderContentType(
final ContentType contentType, final Locale language) { final ContentType contentType, final Locale language) {
@ -88,6 +147,31 @@ public abstract class AbstractContentItemRenderer {
return result; return result;
} }
/**
* Renders a {@link AttachmentList} and all {@link ItemAttachment}s. in the
* list. The map contains the following values:
*
* <pre>
* {
* "listId": {@link AttachmentList#getListId()}
* "uuid": {@link AttachmentList#getUuid()}
* "name": {@link AttachmentList#getName()}
* "order": {@link AttachmentList#getOrder()}
* "title": {@link AttachmentList#getTitle()}
* "description": {@link AttachmentList#getDescription()}
* "attachments": {@link AttachmentList#getAttachments()}
* }
* </pre>
*
* The attachments of the list are rendered using
* {@link #renderAttachment(org.librecms.contentsection.ItemAttachment, java.util.Locale)}.
*
* @param attachmentList The {@link AttachmentList} to render.
* @param language The current language.
*
* @return A map containing the data of the {@link AttachmentList} and its
* {@link Attachment}s.
*/
protected Map<String, Object> renderAttachmentList( protected Map<String, Object> renderAttachmentList(
final AttachmentList attachmentList, final AttachmentList attachmentList,
final Locale language) { final Locale language) {
@ -112,6 +196,29 @@ public abstract class AbstractContentItemRenderer {
return result; return result;
} }
/**
* Renders an {@link ItemAttachment}. The generated map contains the
* following values:
*
* <pre>
* {
* "attachmentId": {@link ItemAttachment#getAttachmentId()}
* "uuid": {@link ItemAttachment#getUuid()}
* "sortKey": {@link ItemAttachment#getSortKey()}
* "asset": {@link ItemAttachment#getAsset()}
* }
* </pre>
*
* The associated {@link Asset} is rendered using the appropriate
* {@link AbstractAssetRenderer} implementation. The
* {@link AbstractAssetRenderer} to use is retrieved using
* {@link AssetRenderers#findRenderer(java.lang.Class)}.
*
* @param attachment The {@link ItemAttachment} to render.
* @param language The current language.
*
* @return A map with the data of the {@link ItemAttachment}.
*/
protected Map<String, Object> renderAttachment( protected Map<String, Object> renderAttachment(
final ItemAttachment<?> attachment, final ItemAttachment<?> attachment,
final Locale language) { final Locale language) {

View File

@ -27,13 +27,28 @@ import java.util.Map;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
/** /**
* * Renderer for {@link Article} items.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ContentItemRenderer(renders = Article.class) @ContentItemRenderer(renders = Article.class)
@RequestScoped @RequestScoped
public class ArticleRenderer extends AbstractContentItemRenderer { public class ArticleRenderer extends AbstractContentItemRenderer {
/**
* Render the provided {@link Article}. The following values are put into
* the map:
*
* <pre>
* {
* "text": {@link Article#getText()}
* }
* </pre>
*
* @param item The item to render.
* @param language The current language.
* @param result The map into which the result is placed.
*/
@Override @Override
public void renderItem(final ContentItem item, public void renderItem(final ContentItem item,
final Locale language, final Locale language,

View File

@ -31,6 +31,9 @@ import javax.enterprise.util.AnnotationLiteral;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* Provides access to all available implementations of
* {@link AbstractContentItemRenderer}.
*
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -43,6 +46,13 @@ public class ContentItemRenderers {
@Inject @Inject
private Instance<AbstractContentItemRenderer> renderers; private Instance<AbstractContentItemRenderer> renderers;
/**
* Tries to find the renderer for provided type and the default mode.
*
* @param itemType The type for which the renderer is retrieved.
*
* @return The renderer for the provided type.
*/
public AbstractContentItemRenderer findRenderer( public AbstractContentItemRenderer findRenderer(
final Class<? extends ContentItem> itemType) { final Class<? extends ContentItem> itemType) {
@ -51,6 +61,18 @@ public class ContentItemRenderers {
return findRenderer(itemType, "--DEFAULT--"); return findRenderer(itemType, "--DEFAULT--");
} }
/**
* Tries to find the renderer for provided type and the provided mode. If a
* appropriate renderer is found an default renderer with an empty
* implementation of
* {@link AbstractContentItemRenderer#renderItem(org.librecms.contentsection.ContentItem, java.util.Locale, java.util.Map)}
* is returned.
*
* @param itemType The type for which the renderer is retrieved.
* @param mode The render mode.
*
* @return The renderer for the provided type.
*/
public AbstractContentItemRenderer findRenderer( public AbstractContentItemRenderer findRenderer(
final Class<? extends ContentItem> itemType, final String mode) { final Class<? extends ContentItem> itemType, final String mode) {

View File

@ -25,12 +25,35 @@ import java.util.Locale;
import java.util.Map; import java.util.Map;
/** /**
* Renderer for {@link Event} items.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ContentItemRenderer(renders = Event.class) @ContentItemRenderer(renders = Event.class)
public class EventRenderer extends AbstractContentItemRenderer { public class EventRenderer extends AbstractContentItemRenderer {
/**
* Render the provided {@link Event}. The following values are put into
* {@code result}:
*
* <pre>
* {
* "text": {@link Event#getText()}
* "startDate": {@link Event#getStartDate()}
* "endDate": {@link Event#getEndDate()}
* "eventDate": {@link Event#getEventType()}
* "location": {@link Event#getLocation()}
* "mainContributor": {@link Event#getMainContributor()}
* "eventType": {@link Event#getEventType()}
* "mapLink": {@link Event#getMapLink()}
* "cost": {@link Event#getCost()}
* }
* </pre>
*
* @param item The item to render.
* @param language The current language.
* @param result The map into which the result is placed.
*/
@Override @Override
public void renderItem(final ContentItem item, public void renderItem(final ContentItem item,
final Locale language, final Locale language,

View File

@ -28,12 +28,33 @@ import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* Renderer for {@link MultiPartArticle} items.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ContentItemRenderer(renders = MultiPartArticle.class) @ContentItemRenderer(renders = MultiPartArticle.class)
public class MultiPartArticleRenderer extends AbstractContentItemRenderer { public class MultiPartArticleRenderer extends AbstractContentItemRenderer {
/**
* Renders the provided {@link MultiPartArticle}. The following values are
* put into {@code result}:
*
* <pre>
* {
* "summary": {@link MultiPartArticle#getSummary()}
* "sections": {@link MultiPartArticle#getSections()}
* }
* </pre>
*
* The value of {@code sections} is a list containing a {@link Map}
* generated by
* {@link #renderSection(org.librecms.contenttypes.MultiPartArticleSection, java.util.Locale)}
* for each section.
*
* @param item The item to render.
* @param language The current language.
* @param result The map into which the result is placed.
*/
@Override @Override
public void renderItem(final ContentItem item, public void renderItem(final ContentItem item,
final Locale language, final Locale language,
@ -45,7 +66,7 @@ public class MultiPartArticleRenderer extends AbstractContentItemRenderer {
} else { } else {
return; return;
} }
result.put("summary", article.getSummary().getValue(language)); result.put("summary", article.getSummary().getValue(language));
result.put("sections", result.put("sections",
article article
@ -56,6 +77,25 @@ public class MultiPartArticleRenderer extends AbstractContentItemRenderer {
} }
/**
* Renders a {@link MultiPartArticleSection}. The generated map contains the
* following values:
*
* <pre>
* {
* "sectionId": {@link MultiPartArticleSection#getSectionId()}
* "title": {@link MultiPartArticleSection#getTitle()}
* "rank": {@link MultiPartArticleSection#getRank()}
* "pageBreak": {@link MultiPartArticleSection#isPageBreak()}
* "text": {@link MultiPartArticleSection#getText()}
* }
* </pre>
*
* @param section The section to render.
* @param language The current language.
*
* @return A map with the data of the section.
*/
protected Map<String, Object> renderSection( protected Map<String, Object> renderSection(
final MultiPartArticleSection section, final Locale language) { final MultiPartArticleSection section, final Locale language) {

View File

@ -27,13 +27,28 @@ import java.util.Map;
import javax.enterprise.context.RequestScoped; import javax.enterprise.context.RequestScoped;
/** /**
* * Renderer for {@link News} items.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ContentItemRenderer(renders = News.class) @ContentItemRenderer(renders = News.class)
@RequestScoped @RequestScoped
public class NewsRenderer extends AbstractContentItemRenderer { public class NewsRenderer extends AbstractContentItemRenderer {
/**
* Renders the provided {@link News} item. The following values are put into {@code result}:
*
* <pre>
* {
* "text": {@link News#getText()}
* "releaseDate": {@link News#getReleaseDate()}
* }
* </pre>
*
* @param item The item to render.
* @param language The current language.
* @param result The map into which the result is placed.
*/
@Override @Override
public void renderItem(final ContentItem item, public void renderItem(final ContentItem item,
final Locale language, final Locale language,
@ -45,7 +60,7 @@ public class NewsRenderer extends AbstractContentItemRenderer {
} else { } else {
return; return;
} }
result.put("text", news.getText().getValue(language)); result.put("text", news.getText().getValue(language));
result.put("releaseDate", news.getReleaseDate()); result.put("releaseDate", news.getReleaseDate());
} }

View File

@ -30,13 +30,10 @@ import java.util.Objects;
import javax.persistence.CollectionTable; import javax.persistence.CollectionTable;
import javax.persistence.ElementCollection; import javax.persistence.ElementCollection;
import javax.persistence.Embedded;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.MapKeyColumn; import javax.persistence.MapKeyColumn;
import javax.persistence.MapKeyJoinColumn;
import javax.persistence.NamedQueries; import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery; import javax.persistence.NamedQuery;
import javax.persistence.Table; import javax.persistence.Table;
@ -45,7 +42,8 @@ import static org.librecms.CmsConstants.*;
import static org.librecms.pages.PagesConstants.*; import static org.librecms.pages.PagesConstants.*;
/** /**
* * A CMS page is a container which contains several data how a page is displayed.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@Entity @Entity
@ -64,20 +62,24 @@ public class Page extends CcmObject implements Serializable {
private static final long serialVersionUID = 5108486858438122008L; private static final long serialVersionUID = 5108486858438122008L;
/**
* The page model for the index item of the associated category.
*/
@ManyToOne @ManyToOne
@JoinColumn(name = "INDEX_PAGE_MODEL_ID") @JoinColumn(name = "INDEX_PAGE_MODEL_ID")
private PageModel indexPageModel; private PageModel indexPageModel;
/**
* The page model for other items in the associated category.
*/
@ManyToOne @ManyToOne
@JoinColumn(name = "ITEM_PAGE_MODEL_ID") @JoinColumn(name = "ITEM_PAGE_MODEL_ID")
private PageModel itemPageModel; private PageModel itemPageModel;
/**
* The configurations for this page.
*/
@ElementCollection @ElementCollection
// @JoinTable(name = "PAGE_THEME_CONFIGURATIONS",
// schema = DB_SCHEMA,
// joinColumns = {
// @JoinColumn(name = "PAGE_ID")
// })
@CollectionTable(name = "PAGE_THEME_CONFIGURATIONS", @CollectionTable(name = "PAGE_THEME_CONFIGURATIONS",
schema = DB_SCHEMA, schema = DB_SCHEMA,
joinColumns = { joinColumns = {

View File

@ -28,7 +28,10 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import static org.librecms.pages.PagesConstants.*;
/** /**
* Manager for {@link Page} entities.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -37,13 +40,22 @@ public class PageManager {
@Inject @Inject
private CategoryManager categoryManager; private CategoryManager categoryManager;
@Inject @Inject
private CategoryRepository categoryRepo; private CategoryRepository categoryRepo;
@Inject @Inject
private PageRepository pageRepo; private PageRepository pageRepo;
/**
* Finds the {@link Page} associated with an {@link Category}. If there is
* no {@link Page} associated with the provided {@link Category} this method
* will return the {@link Page} associated with the parent category.
*
* @param category The {@link Category} which is associated with the {@link Page}.
*
* @return The {@link Page} associated with the provided {@code category}.
*/
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public Page findPageForCategory(final Category category) { public Page findPageForCategory(final Category category) {
@ -66,12 +78,19 @@ public class PageManager {
} }
} }
/**
* Create
* @param category
* @return
*/
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public Page createPageForCategory(final Category category) { public Page createPageForCategory(final Category category) {
final Page page = new Page(); final Page page = new Page();
pageRepo.save(page); pageRepo.save(page);
categoryManager.addObjectToCategory(page, category); categoryManager.addObjectToCategory(page,
category,
CATEGORIZATION_TYPE_PAGE_CONF);
return page; return page;
} }

View File

@ -30,12 +30,19 @@ import javax.persistence.NoResultException;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
/** /**
* * Repository for {@link Page} entities.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
public class PageRepository extends AbstractEntityRepository<Long, Page>{ public class PageRepository extends AbstractEntityRepository<Long, Page>{
/**
* Find the {@link Page} associated with a {@link Category}.
*
* @param category The {@link Category} associated with the {@link Page}.
* @return
*/
public Optional<Page> findPageForCategory(final Category category) { public Optional<Page> findPageForCategory(final Category category) {
final TypedQuery<Page> query = getEntityManager() final TypedQuery<Page> query = getEntityManager()

View File

@ -35,7 +35,9 @@ import javax.persistence.Table;
import static org.librecms.CmsConstants.*; import static org.librecms.CmsConstants.*;
/** /**
* * The {@code Pages} application. Each instance of this application provides
* the page tree for specific site.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@Entity @Entity
@ -68,10 +70,16 @@ public class Pages extends CcmApplication implements Serializable {
private static final long serialVersionUID = -352205318143692477L; private static final long serialVersionUID = -352205318143692477L;
/**
* The {@link Site} to which this pages instance belongs.
*/
@OneToOne @OneToOne
@JoinColumn(name = "SITE_ID") @JoinColumn(name = "SITE_ID")
private Site site; private Site site;
/**
* The category {@link Domain} which is used the model the page tree.
*/
@OneToOne @OneToOne
@JoinColumn(name = "CATEGORY_DOMAIN_ID") @JoinColumn(name = "CATEGORY_DOMAIN_ID")
private Domain categoryDomain; private Domain categoryDomain;

View File

@ -25,7 +25,7 @@ import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application; import javax.ws.rs.core.Application;
/** /**
* * JAX-RS application for {@link Pages}.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */

View File

@ -19,7 +19,8 @@
package org.librecms.pages; package org.librecms.pages;
/** /**
* * Constants used by the classes in the package.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
public final class PagesConstants { public final class PagesConstants {

View File

@ -24,7 +24,8 @@ import javax.enterprise.context.RequestScoped;
import javax.inject.Inject; import javax.inject.Inject;
/** /**
* * Manager class for {@link Pages}.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped

View File

@ -18,7 +18,6 @@
*/ */
package org.librecms.pages; package org.librecms.pages;
import org.libreccm.core.AbstractEntityRepository; import org.libreccm.core.AbstractEntityRepository;
import org.libreccm.core.CoreConstants; import org.libreccm.core.CoreConstants;
import org.libreccm.security.RequiresPrivilege; import org.libreccm.security.RequiresPrivilege;
@ -33,6 +32,7 @@ import javax.persistence.TypedQuery;
import javax.transaction.Transactional; import javax.transaction.Transactional;
/** /**
* Repository for {@link Pages}.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -42,6 +42,14 @@ public class PagesRepository extends AbstractEntityRepository<Long, Pages> {
@Inject @Inject
private SiteRepository siteRepo; private SiteRepository siteRepo;
/**
* Retrieves the {@link Pages} instance for the site identified by the
* provided domain.
*
* @param domainOfSite The domain of the site.
*
* @return The {@link Pages} instance for the site if any.
*/
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public Optional<Pages> findPagesForSite(final String domainOfSite) { public Optional<Pages> findPagesForSite(final String domainOfSite) {

View File

@ -56,6 +56,7 @@ import javax.ws.rs.core.UriInfo;
import static org.librecms.pages.PagesConstants.*; import static org.librecms.pages.PagesConstants.*;
/** /**
* JAX-RS class providing access to the pages.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -99,6 +100,15 @@ public class PagesRouter {
defaultLocale = kernelConfig.getDefaultLocale(); defaultLocale = kernelConfig.getDefaultLocale();
} }
/**
* Retrieve the index page of a category. Redirects to
* {@link #getCategoryIndexPageAsHtml(javax.ws.rs.core.UriInfo, java.lang.String)}.
*
* @param uriInfo
* @param page
*
* @return
*/
@Path("/") @Path("/")
public Response getCategoryIndexPage( public Response getCategoryIndexPage(
@Context @Context
@ -127,6 +137,15 @@ public class PagesRouter {
return Response.temporaryRedirect(uri).build(); return Response.temporaryRedirect(uri).build();
} }
/**
* Retrieves the category index page. Redirects to
* {@link #getCategoryIndexPageAsHtml(javax.ws.rs.core.UriInfo, java.lang.String)}.
*
* @param uriInfo
* @param page
*
* @return
*/
@Path("/index.html") @Path("/index.html")
public Response getCategoryIndexPageAsHtml( public Response getCategoryIndexPageAsHtml(
@Context @Context
@ -156,6 +175,18 @@ public class PagesRouter {
return Response.temporaryRedirect(uri).build(); return Response.temporaryRedirect(uri).build();
} }
/**
* Retrieves the category index page.
*
* @param uriInfo Data about the URI called.
* @param page The path of the category to show.
* @param language The selected language.
* @param theme The theme to use.
* @param themeVersion The version of the theme to use.
* @param pageModelVersion The version of the page model to use.
*
* @return The HTML representation of the index page.
*/
@Path("/index.{lang}.html") @Path("/index.{lang}.html")
@Produces("text/html") @Produces("text/html")
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@ -184,6 +215,16 @@ public class PagesRouter {
return themes.process(buildResult, themeInfo); return themes.process(buildResult, themeInfo);
} }
/**
* Retrieves the category index page as JSON:
*
* @param uriInfo
* @param page
* @param language
* @param pageModelVersion
*
* @return
*/
@Path("/index.{lang}.json") @Path("/index.{lang}.json")
@Produces("text/html") @Produces("text/html")
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@ -201,6 +242,16 @@ public class PagesRouter {
return getCategoryIndexPage(uriInfo, page, language, pageModelVersion); return getCategoryIndexPage(uriInfo, page, language, pageModelVersion);
} }
/**
* Retrieves the category index page as XML.
*
* @param uriInfo
* @param page
* @param language
* @param pageModelVersion
*
* @return
*/
@Path("/index.{lang}.xml") @Path("/index.{lang}.xml")
@Produces("text/html") @Produces("text/html")
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
@ -218,6 +269,19 @@ public class PagesRouter {
return getCategoryIndexPage(uriInfo, page, language, pageModelVersion); return getCategoryIndexPage(uriInfo, page, language, pageModelVersion);
} }
/**
* Retrieve the item page for a category and the content item associated
* with the category and identified by {@code itemName}.
*
* Redirects to
* {@link #getItemPageAsHtml(javax.ws.rs.core.UriInfo, java.lang.String, java.lang.String)}.
*
* @param uriInfo
* @param page
* @param itemName
*
* @return
*/
@Path("/{name}") @Path("/{name}")
public Response getItemPage( public Response getItemPage(
@Context final UriInfo uriInfo, @Context final UriInfo uriInfo,
@ -245,6 +309,17 @@ public class PagesRouter {
return Response.temporaryRedirect(uri).build(); return Response.temporaryRedirect(uri).build();
} }
/**
* Retrieve the item page for a category and the content item associated
* with the category and identified by {@code itemName}. Redirects to
* {@link #getItemPageAsHtml(javax.ws.rs.core.UriInfo, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)}.
*
* @param uriInfo
* @param page
* @param itemName
*
* @return
*/
@Path("/{name},html") @Path("/{name},html")
public Response getItemPageAsHtml( public Response getItemPageAsHtml(
@Context final UriInfo uriInfo, @Context final UriInfo uriInfo,
@ -276,6 +351,20 @@ public class PagesRouter {
return Response.temporaryRedirect(uri).build(); return Response.temporaryRedirect(uri).build();
} }
/**
* Retrieve the item page as HTML for a category and the content item
* associated with the category and identified by {@code itemName}.
*
* @param uriInfo
* @param page
* @param itemName
* @param language
* @param theme
* @param themeVersion
* @param pageModelVersion
*
* @return
*/
@Path("/{name}.{lang}.html") @Path("/{name}.{lang}.html")
public String getItemPageAsHtml( public String getItemPageAsHtml(
@Context @Context
@ -304,6 +393,18 @@ public class PagesRouter {
return themes.process(buildResult, themeInfo); return themes.process(buildResult, themeInfo);
} }
/**
* Retrieve the item page as JSON for a category and the content item
* associated with the category and identified by {@code itemName}.
*
* @param uriInfo
* @param page
* @param itemName
* @param language
* @param pageModelVersion
*
* @return
*/
@Path("/{name}.{lang}.html") @Path("/{name}.{lang}.html")
public Map<String, Object> getItemPageAsJson( public Map<String, Object> getItemPageAsJson(
@Context @Context
@ -325,6 +426,18 @@ public class PagesRouter {
pageModelVersion); pageModelVersion);
} }
/**
* Retrieve the item page as XML for a category and the content item
* associated with the category and identified by {@code itemName}.
*
* @param uriInfo
* @param page
* @param itemName
* @param language
* @param pageModelVersion
*
* @return
*/
@Path("/{name}.{lang}.html") @Path("/{name}.{lang}.html")
public Map<String, Object> getItemPageAsXml( public Map<String, Object> getItemPageAsXml(
@Context @Context

View File

@ -25,7 +25,8 @@ import javax.persistence.Column;
import javax.persistence.Embeddable; import javax.persistence.Embeddable;
/** /**
* * Configuration for the {@link Page} and a {@link Site}.
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@Embeddable @Embeddable
@ -33,12 +34,21 @@ public class ThemeConfiguration implements Serializable {
private static final long serialVersionUID = -989896906728810984L; private static final long serialVersionUID = -989896906728810984L;
/**
* The theme associated with this configuration.
*/
@Column(name = "THEME") @Column(name = "THEME")
private String theme; private String theme;
/**
* The template provided by the theme to use for index pages.
*/
@Column(name = "INDEX_PAGE_TEMPLATE") @Column(name = "INDEX_PAGE_TEMPLATE")
private String indexPageTemplate; private String indexPageTemplate;
/**
* The template provided by the theme to use for item pages.
*/
@Column(name = "ITEM_PAGE_TEMPLATE") @Column(name = "ITEM_PAGE_TEMPLATE")
private String itemPageTemplate; private String itemPageTemplate;

View File

@ -219,6 +219,23 @@ drop sequence if exists HIBERNATE_SEQUENCE;
primary key (OBJECT_ID, REV) primary key (OBJECT_ID, REV)
); );
create table CCM_CMS.CATEGORIZED_ITEM_COMPONENTS (
COMPONENT_MODEL_ID bigint not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.CATEGORY_TREE_COMPONENTS (
SHOW_FULL_TREE boolean,
COMPONENT_MODEL_ID bigint not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.CONTENT_ITEM_COMPONENTS (
MODE varchar(255),
COMPONENT_MODEL_ID bigint not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.CONTENT_ITEM_DESCRIPTIONS ( create table CCM_CMS.CONTENT_ITEM_DESCRIPTIONS (
OBJECT_ID bigint not null, OBJECT_ID bigint not null,
LOCALIZED_VALUE varchar(2147483647), LOCALIZED_VALUE varchar(2147483647),
@ -509,6 +526,12 @@ drop sequence if exists HIBERNATE_SEQUENCE;
primary key (OBJECT_ID, REV) primary key (OBJECT_ID, REV)
); );
create table CCM_CMS.FIXED_CONTENT_ITEM_COMPONENTS (
COMPONENT_MODEL_ID bigint not null,
CONTENT_ITEM_ID bigint,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.FOLDER_CONTENT_SECTION_MAP ( create table CCM_CMS.FOLDER_CONTENT_SECTION_MAP (
CONTENT_SECTION_ID bigint, CONTENT_SECTION_ID bigint,
FOLDER_ID bigint not null, FOLDER_ID bigint not null,
@ -521,6 +544,11 @@ drop sequence if exists HIBERNATE_SEQUENCE;
primary key (OBJECT_ID) primary key (OBJECT_ID)
); );
create table CCM_CMS.GREETING_ITEM_COMPONENTS (
COMPONENT_MODEL_ID bigint not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.IMAGES ( create table CCM_CMS.IMAGES (
HEIGHT bigint, HEIGHT bigint,
WIDTH bigint, WIDTH bigint,
@ -538,6 +566,19 @@ drop sequence if exists HIBERNATE_SEQUENCE;
primary key (OBJECT_ID, REV) primary key (OBJECT_ID, REV)
); );
create table CCM_CMS.ITEM_LIST_COMPONENTS (
DESCINDING boolean,
LIMIT_TO_TYPE varchar(255),
PAGE_SIZE integer,
COMPONENT_MODEL_ID bigint not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.ITEM_LIST_ORDER (
ITEM_LIST_ID bigint not null,
LIST_ORDER varchar(255)
);
create table CCM_CMS.LEGAL_METADATA ( create table CCM_CMS.LEGAL_METADATA (
CREATOR varchar(255), CREATOR varchar(255),
PUBLISHER varchar(255), PUBLISHER varchar(255),
@ -1392,11 +1433,11 @@ drop sequence if exists HIBERNATE_SEQUENCE;
SETTING_ID bigint not null, SETTING_ID bigint not null,
CONFIGURATION_CLASS varchar(512) not null, CONFIGURATION_CLASS varchar(512) not null,
NAME varchar(512) not null, NAME varchar(512) not null,
SETTING_VALUE_DOUBLE double,
SETTING_VALUE_BIG_DECIMAL decimal(19,2), SETTING_VALUE_BIG_DECIMAL decimal(19,2),
SETTING_VALUE_STRING varchar(1024), SETTING_VALUE_STRING varchar(1024),
SETTING_VALUE_DOUBLE double,
SETTING_VALUE_LONG bigint,
SETTING_VALUE_BOOLEAN boolean, SETTING_VALUE_BOOLEAN boolean,
SETTING_VALUE_LONG bigint,
primary key (SETTING_ID) primary key (SETTING_ID)
); );
@ -1744,6 +1785,21 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (OBJECT_ID, REV) foreign key (OBJECT_ID, REV)
references CCM_CMS.ASSETS_AUD; references CCM_CMS.ASSETS_AUD;
alter table CCM_CMS.CATEGORIZED_ITEM_COMPONENTS
add constraint FKlraxqtl9cnntdo0qovq340y7b
foreign key (COMPONENT_MODEL_ID)
references CCM_CMS.CONTENT_ITEM_COMPONENTS;
alter table CCM_CMS.CATEGORY_TREE_COMPONENTS
add constraint FKfhc51tkdf705o0sy8sndqpkqa
foreign key (COMPONENT_MODEL_ID)
references CCM_CORE.PAGE_MODEL_COMPONENT_MODELS;
alter table CCM_CMS.CONTENT_ITEM_COMPONENTS
add constraint FKp83o82kxo2ipa0xo03wxp4dcr
foreign key (COMPONENT_MODEL_ID)
references CCM_CORE.PAGE_MODEL_COMPONENT_MODELS;
alter table CCM_CMS.CONTENT_ITEM_DESCRIPTIONS alter table CCM_CMS.CONTENT_ITEM_DESCRIPTIONS
add constraint FK6mt4tjnenr79o52wcj99tpeu4 add constraint FK6mt4tjnenr79o52wcj99tpeu4
foreign key (OBJECT_ID) foreign key (OBJECT_ID)
@ -2029,6 +2085,16 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (OBJECT_ID, REV) foreign key (OBJECT_ID, REV)
references CCM_CMS.BINARY_ASSETS_AUD; references CCM_CMS.BINARY_ASSETS_AUD;
alter table CCM_CMS.FIXED_CONTENT_ITEM_COMPONENTS
add constraint FKlfv2clu7ubk18unio8fyvlbnf
foreign key (CONTENT_ITEM_ID)
references CCM_CMS.CONTENT_ITEMS;
alter table CCM_CMS.FIXED_CONTENT_ITEM_COMPONENTS
add constraint FKkpiuth8e994phxy1x1drh2wf5
foreign key (COMPONENT_MODEL_ID)
references CCM_CMS.CONTENT_ITEM_COMPONENTS;
alter table CCM_CMS.FOLDER_CONTENT_SECTION_MAP alter table CCM_CMS.FOLDER_CONTENT_SECTION_MAP
add constraint FKnof2m7o4f0ufrugeh4g5wt3g9 add constraint FKnof2m7o4f0ufrugeh4g5wt3g9
foreign key (CONTENT_SECTION_ID) foreign key (CONTENT_SECTION_ID)
@ -2044,6 +2110,11 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (OBJECT_ID) foreign key (OBJECT_ID)
references CCM_CORE.CATEGORIES; references CCM_CORE.CATEGORIES;
alter table CCM_CMS.GREETING_ITEM_COMPONENTS
add constraint FK3fble8pmmolb7lmsca8akmb94
foreign key (COMPONENT_MODEL_ID)
references CCM_CMS.CONTENT_ITEM_COMPONENTS;
alter table CCM_CMS.IMAGES alter table CCM_CMS.IMAGES
add constraint FK51ja1101epvl74auenv6sqyev add constraint FK51ja1101epvl74auenv6sqyev
foreign key (LEGAL_METADATA_ID) foreign key (LEGAL_METADATA_ID)
@ -2059,6 +2130,16 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (OBJECT_ID, REV) foreign key (OBJECT_ID, REV)
references CCM_CMS.BINARY_ASSETS_AUD; references CCM_CMS.BINARY_ASSETS_AUD;
alter table CCM_CMS.ITEM_LIST_COMPONENTS
add constraint FKje8r8nvkqv8fj7i0eo1pew2yq
foreign key (COMPONENT_MODEL_ID)
references CCM_CORE.PAGE_MODEL_COMPONENT_MODELS;
alter table CCM_CMS.ITEM_LIST_ORDER
add constraint FKisnil2ibh98y2ws8or6guij21
foreign key (ITEM_LIST_ID)
references CCM_CMS.ITEM_LIST_COMPONENTS;
alter table CCM_CMS.LEGAL_METADATA alter table CCM_CMS.LEGAL_METADATA
add constraint FKnxl7uyv1ks0qabgeienx2t9d1 add constraint FKnxl7uyv1ks0qabgeienx2t9d1
foreign key (OBJECT_ID) foreign key (OBJECT_ID)

View File

@ -218,6 +218,23 @@ drop sequence if exists HIBERNATE_SEQUENCE;
primary key (OBJECT_ID, REV) primary key (OBJECT_ID, REV)
); );
create table CCM_CMS.CATEGORIZED_ITEM_COMPONENTS (
COMPONENT_MODEL_ID int8 not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.CATEGORY_TREE_COMPONENTS (
SHOW_FULL_TREE boolean,
COMPONENT_MODEL_ID int8 not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.CONTENT_ITEM_COMPONENTS (
MODE varchar(255),
COMPONENT_MODEL_ID int8 not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.CONTENT_ITEM_DESCRIPTIONS ( create table CCM_CMS.CONTENT_ITEM_DESCRIPTIONS (
OBJECT_ID int8 not null, OBJECT_ID int8 not null,
LOCALIZED_VALUE text, LOCALIZED_VALUE text,
@ -508,6 +525,12 @@ drop sequence if exists HIBERNATE_SEQUENCE;
primary key (OBJECT_ID, REV) primary key (OBJECT_ID, REV)
); );
create table CCM_CMS.FIXED_CONTENT_ITEM_COMPONENTS (
COMPONENT_MODEL_ID int8 not null,
CONTENT_ITEM_ID int8,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.FOLDER_CONTENT_SECTION_MAP ( create table CCM_CMS.FOLDER_CONTENT_SECTION_MAP (
CONTENT_SECTION_ID int8, CONTENT_SECTION_ID int8,
FOLDER_ID int8 not null, FOLDER_ID int8 not null,
@ -520,6 +543,11 @@ drop sequence if exists HIBERNATE_SEQUENCE;
primary key (OBJECT_ID) primary key (OBJECT_ID)
); );
create table CCM_CMS.GREETING_ITEM_COMPONENTS (
COMPONENT_MODEL_ID int8 not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.IMAGES ( create table CCM_CMS.IMAGES (
HEIGHT int8, HEIGHT int8,
WIDTH int8, WIDTH int8,
@ -537,6 +565,19 @@ drop sequence if exists HIBERNATE_SEQUENCE;
primary key (OBJECT_ID, REV) primary key (OBJECT_ID, REV)
); );
create table CCM_CMS.ITEM_LIST_COMPONENTS (
DESCINDING boolean,
LIMIT_TO_TYPE varchar(255),
PAGE_SIZE int4,
COMPONENT_MODEL_ID int8 not null,
primary key (COMPONENT_MODEL_ID)
);
create table CCM_CMS.ITEM_LIST_ORDER (
ITEM_LIST_ID int8 not null,
LIST_ORDER varchar(255)
);
create table CCM_CMS.LEGAL_METADATA ( create table CCM_CMS.LEGAL_METADATA (
CREATOR varchar(255), CREATOR varchar(255),
PUBLISHER varchar(255), PUBLISHER varchar(255),
@ -1391,11 +1432,11 @@ drop sequence if exists HIBERNATE_SEQUENCE;
SETTING_ID int8 not null, SETTING_ID int8 not null,
CONFIGURATION_CLASS varchar(512) not null, CONFIGURATION_CLASS varchar(512) not null,
NAME varchar(512) not null, NAME varchar(512) not null,
SETTING_VALUE_DOUBLE float8,
SETTING_VALUE_BIG_DECIMAL numeric(19, 2), SETTING_VALUE_BIG_DECIMAL numeric(19, 2),
SETTING_VALUE_STRING varchar(1024), SETTING_VALUE_STRING varchar(1024),
SETTING_VALUE_DOUBLE float8,
SETTING_VALUE_LONG int8,
SETTING_VALUE_BOOLEAN boolean, SETTING_VALUE_BOOLEAN boolean,
SETTING_VALUE_LONG int8,
primary key (SETTING_ID) primary key (SETTING_ID)
); );
@ -1743,6 +1784,21 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (OBJECT_ID, REV) foreign key (OBJECT_ID, REV)
references CCM_CMS.ASSETS_AUD; references CCM_CMS.ASSETS_AUD;
alter table CCM_CMS.CATEGORIZED_ITEM_COMPONENTS
add constraint FKlraxqtl9cnntdo0qovq340y7b
foreign key (COMPONENT_MODEL_ID)
references CCM_CMS.CONTENT_ITEM_COMPONENTS;
alter table CCM_CMS.CATEGORY_TREE_COMPONENTS
add constraint FKfhc51tkdf705o0sy8sndqpkqa
foreign key (COMPONENT_MODEL_ID)
references CCM_CORE.PAGE_MODEL_COMPONENT_MODELS;
alter table CCM_CMS.CONTENT_ITEM_COMPONENTS
add constraint FKp83o82kxo2ipa0xo03wxp4dcr
foreign key (COMPONENT_MODEL_ID)
references CCM_CORE.PAGE_MODEL_COMPONENT_MODELS;
alter table CCM_CMS.CONTENT_ITEM_DESCRIPTIONS alter table CCM_CMS.CONTENT_ITEM_DESCRIPTIONS
add constraint FK6mt4tjnenr79o52wcj99tpeu4 add constraint FK6mt4tjnenr79o52wcj99tpeu4
foreign key (OBJECT_ID) foreign key (OBJECT_ID)
@ -2028,6 +2084,16 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (OBJECT_ID, REV) foreign key (OBJECT_ID, REV)
references CCM_CMS.BINARY_ASSETS_AUD; references CCM_CMS.BINARY_ASSETS_AUD;
alter table CCM_CMS.FIXED_CONTENT_ITEM_COMPONENTS
add constraint FKlfv2clu7ubk18unio8fyvlbnf
foreign key (CONTENT_ITEM_ID)
references CCM_CMS.CONTENT_ITEMS;
alter table CCM_CMS.FIXED_CONTENT_ITEM_COMPONENTS
add constraint FKkpiuth8e994phxy1x1drh2wf5
foreign key (COMPONENT_MODEL_ID)
references CCM_CMS.CONTENT_ITEM_COMPONENTS;
alter table CCM_CMS.FOLDER_CONTENT_SECTION_MAP alter table CCM_CMS.FOLDER_CONTENT_SECTION_MAP
add constraint FKnof2m7o4f0ufrugeh4g5wt3g9 add constraint FKnof2m7o4f0ufrugeh4g5wt3g9
foreign key (CONTENT_SECTION_ID) foreign key (CONTENT_SECTION_ID)
@ -2043,6 +2109,11 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (OBJECT_ID) foreign key (OBJECT_ID)
references CCM_CORE.CATEGORIES; references CCM_CORE.CATEGORIES;
alter table CCM_CMS.GREETING_ITEM_COMPONENTS
add constraint FK3fble8pmmolb7lmsca8akmb94
foreign key (COMPONENT_MODEL_ID)
references CCM_CMS.CONTENT_ITEM_COMPONENTS;
alter table CCM_CMS.IMAGES alter table CCM_CMS.IMAGES
add constraint FK51ja1101epvl74auenv6sqyev add constraint FK51ja1101epvl74auenv6sqyev
foreign key (LEGAL_METADATA_ID) foreign key (LEGAL_METADATA_ID)
@ -2058,6 +2129,16 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (OBJECT_ID, REV) foreign key (OBJECT_ID, REV)
references CCM_CMS.BINARY_ASSETS_AUD; references CCM_CMS.BINARY_ASSETS_AUD;
alter table CCM_CMS.ITEM_LIST_COMPONENTS
add constraint FKje8r8nvkqv8fj7i0eo1pew2yq
foreign key (COMPONENT_MODEL_ID)
references CCM_CORE.PAGE_MODEL_COMPONENT_MODELS;
alter table CCM_CMS.ITEM_LIST_ORDER
add constraint FKisnil2ibh98y2ws8or6guij21
foreign key (ITEM_LIST_ID)
references CCM_CMS.ITEM_LIST_COMPONENTS;
alter table CCM_CMS.LEGAL_METADATA alter table CCM_CMS.LEGAL_METADATA
add constraint FKnxl7uyv1ks0qabgeienx2t9d1 add constraint FKnxl7uyv1ks0qabgeienx2t9d1
foreign key (OBJECT_ID) foreign key (OBJECT_ID)

View File

@ -20,6 +20,8 @@ package org.libreccm.modules;
import org.libreccm.configuration.Configuration; import org.libreccm.configuration.Configuration;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.pagemodel.ComponentModel;
import org.libreccm.pagemodel.PageModel;
import org.libreccm.pagemodel.PageModelComponentModel; import org.libreccm.pagemodel.PageModelComponentModel;
import org.libreccm.web.ApplicationType; import org.libreccm.web.ApplicationType;
@ -84,12 +86,19 @@ public @interface Module {
* *
* @return An array containing all configuration classes provided by the * @return An array containing all configuration classes provided by the
* module. * module.
* *
* @see Configuration * @see Configuration
* @see ConfigurationManager * @see ConfigurationManager
*/ */
Class<?>[] configurations() default {}; Class<?>[] configurations() default {};
/**
* Components for use in {@link PageModel}s provided by the annotated
* module.
*
* @return An array containing all {@link ComponentModel}s provided by the
* annotated module.
*/
PageModelComponentModel[] pageModelComponentModels() default {}; PageModelComponentModel[] pageModelComponentModels() default {};
} }

View File

@ -44,12 +44,13 @@ public abstract class AbstractPageRenderer implements PageRenderer {
* the component objects created by the {@link ComponentRenderer}s are added * the component objects created by the {@link ComponentRenderer}s are added
* to the page. * to the page.
* *
* @param pageModel The {@link PageModel} to process. * @param pageModel The {@link PageModel} to render.
* @param parameters Parameters provided by application which wants to * @param parameters Parameters provided by application which wants to
* render a {@link PageModel}. The parameters are passed * render a {@link PageModel}. The parameters are passed
* the {@link ComponentRenderer}s. * the {@link ComponentRenderer}s.
* *
* @return A page containing all components from the {@link PageModel}. * @return A map containing the results from rendering the components of the
* page model.
*/ */
@Override @Override
public Map<String, Object> renderPage(final PageModel pageModel, public Map<String, Object> renderPage(final PageModel pageModel,
@ -73,22 +74,24 @@ public abstract class AbstractPageRenderer implements PageRenderer {
/** /**
* Helper method for rendering the components. * Helper method for rendering the components.
* *
* @param <M> Generics variable for the type the component * @param <M> Generics variable for the type of rendered
* created. * component
* @param componentModel The {@link ComponentModel} to process. * @param componentModel The {@link ComponentModel} to process.
* @param componentModelClass The class of the {@link ComponentModel}. * @param componentModelClass The class of the {@link ComponentModel}.
* @param parameters Parameters provided by application which wants * @param parameters Parameters provided by application which wants
* to render a {@link PageModel}. The parameters * to render a {@link PageModel}. The parameters
* are passed the {@link ComponentRenderer}s. * are passed the {@link ComponentRenderer}s.
* *
* @return The components described by the {@code componentModel}. * @return A map containing the results from rendering the components of the
* page model.
*/ */
protected <M extends ComponentModel> Optional<Object> renderComponent( protected <M extends ComponentModel> Optional<Object> renderComponent(
final ComponentModel componentModel, final ComponentModel componentModel,
final Class<M> componentModelClass, final Class<M> componentModelClass,
final Map<String, Object> parameters) { final Map<String, Object> parameters) {
componentRendererManager.findComponentRenderer(componentModel.getClass()); componentRendererManager
.findComponentRenderer(componentModel.getClass());
final Optional<ComponentRenderer<M>> renderer = componentRendererManager final Optional<ComponentRenderer<M>> renderer = componentRendererManager
.findComponentRenderer(componentModelClass); .findComponentRenderer(componentModelClass);
@ -96,7 +99,8 @@ public abstract class AbstractPageRenderer implements PageRenderer {
if (renderer.isPresent()) { if (renderer.isPresent()) {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
final M model = (M) componentModel; final M model = (M) componentModel;
return Optional.of(renderer.get().renderComponent(model, parameters)); return Optional
.of(renderer.get().renderComponent(model, parameters));
} else { } else {
return Optional.empty(); return Optional.empty();
} }

View File

@ -19,6 +19,7 @@
package org.libreccm.pagemodel; package org.libreccm.pagemodel;
import org.libreccm.core.CoreConstants; import org.libreccm.core.CoreConstants;
import org.libreccm.modules.Module;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
@ -37,9 +38,12 @@ import javax.persistence.ManyToOne;
import javax.persistence.Table; import javax.persistence.Table;
/** /**
* Base class for the components model for use in a {@link PageModel}. This * Base class for the component models for use in a {@link PageModel}. This
* class is not designed for direct use. Instead the classes for concrete * class is not designed for direct use. Instead the classes for concrete
* components have be used. A component must be annotation with * components have to be used. A component model must be registered by adding it
* to list of component models provided by a module by adding it the the list
* provided by {@link Module#pageModelComponentModels() } using the
* {@link PageModelComponentModel} annotation.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@ -50,32 +54,63 @@ public class ComponentModel implements Serializable {
private static final long serialVersionUID = 8585775139379396806L; private static final long serialVersionUID = 8585775139379396806L;
/**
* ID in the database for this instance.
*/
@Id @Id
@Column(name = "COMPONENT_MODEL_ID") @Column(name = "COMPONENT_MODEL_ID")
@GeneratedValue(strategy = GenerationType.AUTO) @GeneratedValue(strategy = GenerationType.AUTO)
private long componentModelId; private long componentModelId;
/**
* The UUID of the instance.
*/
@Column(name = "UUID", length = 255, nullable = false) @Column(name = "UUID", length = 255, nullable = false)
@NotNull @NotNull
private String uuid; private String uuid;
/**
* The UUID of the {@code ComponentModel} which is the same for the draft
* and live version.
*/
@Column(name = "MODEL_UUID", length = 255, nullable = false) @Column(name = "MODEL_UUID", length = 255, nullable = false)
@NotNull @NotNull
private String modelUuid; private String modelUuid;
/**
* The {@link PageModel} to which the {@code ComponentModel} belongs.
*/
@ManyToOne @ManyToOne
@JoinColumn(name = "PAGE_MODEL_ID") @JoinColumn(name = "PAGE_MODEL_ID")
private PageModel pageModel; private PageModel pageModel;
/**
* ID of the component. Must be unique inside a {@link PageModel}.
*/
@Column(name = "ID_ATTRIBUTE", length = 255) @Column(name = "ID_ATTRIBUTE", length = 255)
private String idAttribute; private String idAttribute;
/**
* CSS Style classes to add to the HTML element representing the component
* in the HTML generated from the rendered component model.
*/
@Column(name = "CLASS_ATTRIBUTE", length = 512) @Column(name = "CLASS_ATTRIBUTE", length = 512)
private String classAttribute; private String classAttribute;
/**
* CSS styles to add to the HTML element representing the component in the
* HTML generated from the rendered component model. Avoid using this as it
* will add inline styles to the HTML.
*/
@Column(name = "STYLE_ATTRIBUTE", length = 1024) @Column(name = "STYLE_ATTRIBUTE", length = 1024)
private String styleAttribute; private String styleAttribute;
/**
* Key for identifying the component in a {@link PageModel}. The will be
* used as key in the map generated by
* {@link PageRenderer#renderPage(java.util.Map)} and
* {@link PageRenderer#renderPage(org.libreccm.pagemodel.PageModel, java.util.Map)}.
*/
@Column(name = "COMPONENT_KEY", length = 255) @Column(name = "COMPONENT_KEY", length = 255)
private String key; private String key;
@ -98,11 +133,11 @@ public class ComponentModel implements Serializable {
public String getModelUuid() { public String getModelUuid() {
return modelUuid; return modelUuid;
} }
protected void setModelUuid(final String modelUuid) { protected void setModelUuid(final String modelUuid) {
this.modelUuid = modelUuid; this.modelUuid = modelUuid;
} }
public PageModel getPageModel() { public PageModel getPageModel() {
return pageModel; return pageModel;
} }

View File

@ -25,7 +25,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import java.lang.annotation.Target;
/** /**
* Specifies which type of components a {@link ComponentRenderer} implenentation * Specifies which type of components a {@link ComponentRenderer} implementation
* renders. * renders.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>

View File

@ -18,6 +18,7 @@
*/ */
package org.libreccm.pagemodel; package org.libreccm.pagemodel;
import java.util.Collection;
import java.util.Map; import java.util.Map;
/** /**
@ -30,7 +31,36 @@ import java.util.Map;
*/ */
public interface ComponentRenderer<M extends ComponentModel> { public interface ComponentRenderer<M extends ComponentModel> {
/**
* Renders a {@link ComponentModel}.
*
* The result of the rendering process is a 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
* grantee 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> renderComponent(M componentModel,
final Map<String, Object> parameters); Map<String, Object> parameters);
} }

View File

@ -91,6 +91,9 @@ public class ComponentRendererManager {
} }
/**
* Annotation literal for the {@link ComponentModelType} annotation.
*/
private class ComponentModelTypeLiteral private class ComponentModelTypeLiteral
extends AnnotationLiteral<ComponentModelType> extends AnnotationLiteral<ComponentModelType>
implements ComponentModelType { implements ComponentModelType {

View File

@ -137,7 +137,7 @@ public class PageModel implements Serializable {
private String uuid; private String uuid;
/** /**
* The UUID of the model. Same for draft and live version. * The UUID of the model. Same for draft and live versions.
*/ */
@Column(name = "MODEL_UUID", length = 255, nullable = false) @Column(name = "MODEL_UUID", length = 255, nullable = false)
@NotNull @NotNull

View File

@ -34,13 +34,21 @@ import javax.inject.Inject;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import javax.transaction.Transactional; import javax.transaction.Transactional;
import java.beans.BeanInfo; import java.beans.BeanInfo;
import java.beans.IntrospectionException; import java.beans.IntrospectionException;
import java.beans.Introspector; import java.beans.Introspector;
import java.beans.PropertyDescriptor; import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.Set;
/** /**
* Provides several methods for managing {@link PageModel}s. * Provides several methods for managing {@link PageModel}s.
@ -95,8 +103,8 @@ public class PageModelManager {
} }
/** /**
* Creates a new {@link PageModel} for the provided application. The tries * Creates a new {@link PageModel} for the provided application. The method
* to retrieve the appropriate page model by using * tries to retrieve the appropriate page model by using
* {@link PageModelRepository#findByApplicationAndName(org.libreccm.web.CcmApplication, java.lang.String)}. * {@link PageModelRepository#findByApplicationAndName(org.libreccm.web.CcmApplication, java.lang.String)}.
* Please note that this method will always return the <strong>live</strong> * Please note that this method will always return the <strong>live</strong>
* version of the page model. * version of the page model.
@ -105,7 +113,7 @@ public class PageModelManager {
* application. * application.
* @param application The application for which the {@link PageModel} is * @param application The application for which the {@link PageModel} is
* created. * created.
* @param type Type of the page model (view technology). * @param type Type of the page model.
* *
* @return The new {@link PageModel}. * @return The new {@link PageModel}.
*/ */

View File

@ -35,10 +35,13 @@ import java.util.Map;
public interface PageRenderer { public interface PageRenderer {
/** /**
* Render a page for the view technology supported by this page renderer * Render a page with the default components for a application. An
* without any additional components. * implementation of {@link #renderPage(org.libreccm.pagemodel.PageModel)}
* {@link #renderPage(org.libreccm.pagemodel.PageModel)} should use this * should use this method for creating the default page.
* 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 * @param parameters Parameters provided by application which wants to
* render a {@link PageModel}. The parameters are passed * render a {@link PageModel}. The parameters are passed
@ -49,10 +52,15 @@ public interface PageRenderer {
Map<String, Object> renderPage(Map<String, Object> parameters); Map<String, Object> renderPage(Map<String, Object> parameters);
/** /**
* Render a page of type {@code P} using the provided {@link PageModel}. * Render a page using the provided {@link PageModel}.
* Implementations should call the implementation of {@link #renderPage()} * Implementations should call the implementation of {@link #renderPage()}
* for creating the basic page with the default components. * 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 pageModel The {@link PageModel} from which the page is generated.
* @param parameters Parameters provided by application which wants to * @param parameters Parameters provided by application which wants to
* render a {@link PageModel}. The parameters are passed * render a {@link PageModel}. The parameters are passed

View File

@ -20,15 +20,14 @@
* <p> * <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 of CCM for this purpose.
* </p> * </p>
* <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 and therefore which information is displayed on a page. It is intended * page and 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 containers which are read by * page in ccm-cms module. The Page Model system uses data containers which are
* a renderer class. Because we are not using any active code in the page * read by a renderer class.
* models this avoids a potential attack point.
* </p> * </p>
* <p> * <p>
* The central interface is the {@link org.libreccm.pagemodel.PageRenderer} * The central interface is the {@link org.libreccm.pagemodel.PageRenderer}
@ -36,8 +35,9 @@
* {@link org.libreccm.pagemodel.PageModel} and process it and create a page * {@link org.libreccm.pagemodel.PageModel} and process it and create a page
* from it using the view technology supported by the implementation. * from it using the view technology supported by the implementation.
* {@code PageRenderer}s are CDI beans. Implementations can be retrieved using * {@code PageRenderer}s are CDI beans. Implementations can be retrieved using
* the {@link org.libreccm.pagemodel.PageRendererManager#findPageRenderer(String, Class)} method. * the
* {@link org.libreccm.pagemodel.PageRendererManager#findPageRenderer(String, Class)}
* method.
* </p> * </p>
*
*/ */
package org.libreccm.pagemodel; package org.libreccm.pagemodel;

View File

@ -530,10 +530,10 @@ drop sequence if exists HIBERNATE_SEQUENCE;
SETTING_ID bigint not null, SETTING_ID bigint not null,
CONFIGURATION_CLASS varchar(512) not null, CONFIGURATION_CLASS varchar(512) not null,
NAME varchar(512) not null, NAME varchar(512) not null,
SETTING_VALUE_LONG bigint,
SETTING_VALUE_BIG_DECIMAL decimal(19,2),
SETTING_VALUE_DOUBLE double,
SETTING_VALUE_STRING varchar(1024), SETTING_VALUE_STRING varchar(1024),
SETTING_VALUE_DOUBLE double,
SETTING_VALUE_BIG_DECIMAL decimal(19,2),
SETTING_VALUE_LONG bigint,
SETTING_VALUE_BOOLEAN boolean, SETTING_VALUE_BOOLEAN boolean,
primary key (SETTING_ID) primary key (SETTING_ID)
); );

View File

@ -529,11 +529,11 @@ drop sequence if exists HIBERNATE_SEQUENCE;
SETTING_ID int8 not null, SETTING_ID int8 not null,
CONFIGURATION_CLASS varchar(512) not null, CONFIGURATION_CLASS varchar(512) not null,
NAME varchar(512) not null, NAME varchar(512) not null,
SETTING_VALUE_BOOLEAN boolean, SETTING_VALUE_STRING varchar(1024),
SETTING_VALUE_DOUBLE float8,
SETTING_VALUE_BIG_DECIMAL numeric(19, 2), SETTING_VALUE_BIG_DECIMAL numeric(19, 2),
SETTING_VALUE_LONG int8, SETTING_VALUE_LONG int8,
SETTING_VALUE_DOUBLE float8, SETTING_VALUE_BOOLEAN boolean,
SETTING_VALUE_STRING varchar(1024),
primary key (SETTING_ID) primary key (SETTING_ID)
); );
@ -554,6 +554,14 @@ drop sequence if exists HIBERNATE_SEQUENCE;
value varchar(255) value varchar(255)
); );
create table CCM_CORE.SITES (
DEFAULT_SITE boolean,
DEFAULT_THEME varchar(255),
DOMAIN_OF_SITE varchar(255),
OBJECT_ID int8 not null,
primary key (OBJECT_ID)
);
create table CCM_CORE.THREADS ( create table CCM_CORE.THREADS (
OBJECT_ID int8 not null, OBJECT_ID int8 not null,
ROOT_ID int8, ROOT_ID int8,
@ -679,6 +687,9 @@ drop sequence if exists HIBERNATE_SEQUENCE;
alter table CCM_CORE.SETTINGS alter table CCM_CORE.SETTINGS
add constraint UK5whinfxdaepqs09e5ia9y71uk unique (CONFIGURATION_CLASS, NAME); add constraint UK5whinfxdaepqs09e5ia9y71uk unique (CONFIGURATION_CLASS, NAME);
alter table CCM_CORE.SITES
add constraint UK_kou1h4y4st2m173he44yy8grx unique (DOMAIN_OF_SITE);
alter table CCM_CORE.WORKFLOW_TASK_COMMENTS alter table CCM_CORE.WORKFLOW_TASK_COMMENTS
add constraint UK_4nnedf08odyjxalfkg16fmjoi unique (UUID); add constraint UK_4nnedf08odyjxalfkg16fmjoi unique (UUID);
@ -1105,6 +1116,11 @@ drop sequence if exists HIBERNATE_SEQUENCE;
foreign key (LIST_ID) foreign key (LIST_ID)
references CCM_CORE.SETTINGS; references CCM_CORE.SETTINGS;
alter table CCM_CORE.SITES
add constraint FKrca95c6p023men53b8ayu26kp
foreign key (OBJECT_ID)
references CCM_CORE.CCM_OBJECTS;
alter table CCM_CORE.THREADS alter table CCM_CORE.THREADS
add constraint FKsx08mpwvwnw97uwdgjs76q39g add constraint FKsx08mpwvwnw97uwdgjs76q39g
foreign key (ROOT_ID) foreign key (ROOT_ID)
@ -1203,3 +1219,4 @@ drop sequence if exists HIBERNATE_SEQUENCE;
alter table CCM_CORE.WORKFLOWS alter table CCM_CORE.WORKFLOWS
add constraint FK9ray5beiny6wm2mi0uwyecay2 add constraint FK9ray5beiny6wm2mi0uwyecay2
foreign key (TEMPLATE_ID) foreign key (TEMPLATE_ID)
references CCM_CORE.WORKFLOWS;