diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/AbstractContentItemComponentBuilder.java b/ccm-cms/src/main/java/org/librecms/pagemodel/AbstractContentItemComponentBuilder.java index 9b8b4463a..7181f85fa 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/AbstractContentItemComponentBuilder.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/AbstractContentItemComponentBuilder.java @@ -21,32 +21,18 @@ package org.librecms.pagemodel; import com.arsdigita.kernel.KernelConfig; import org.libreccm.configuration.ConfigurationManager; -import org.libreccm.core.UnexpectedErrorException; -import org.libreccm.l10n.LocalizedString; import org.libreccm.pagemodel.ComponentBuilder; import org.libreccm.security.PermissionChecker; import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItemL10NManager; import org.librecms.contentsection.ContentItemManager; import org.librecms.contentsection.privileges.ItemPrivileges; +import org.librecms.pagemodel.contentitems.AbstractContentItemRenderer; +import org.librecms.pagemodel.contentitems.ContentItemRenderers; -import java.beans.BeanInfo; -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; import javax.inject.Inject; import javax.transaction.Transactional; @@ -66,6 +52,9 @@ public abstract class AbstractContentItemComponentBuilder buildComponent( final T componentModel, final Map parameters) { - + Objects.requireNonNull(componentModel); Objects.requireNonNull(parameters); @@ -146,259 +135,13 @@ public abstract class AbstractContentItemComponentBuilder result = new HashMap<>(); - - for (final PropertyDescriptor propertyDescriptor : properties) { - renderProperty(propertyDescriptor, - componentModel, - language, - item, - result); - } - - return result; + + final AbstractContentItemRenderer renderer = contentItemRenderers + .findRenderer(item.getClass(), componentModel.getMode()); + + return renderer.render(item, language); } else { throw new NotFoundException("Requested language is not available."); } } - - protected void renderProperty(final PropertyDescriptor propertyDescriptor, - final T componentModel, - final Locale language, - final ContentItem item, - final Map result) { - - final String propertyName = propertyDescriptor.getName(); - if (componentModel.getExcludedPropertyPaths().contains(propertyName)) { - return; - } - - final Method readMethod = propertyDescriptor.getReadMethod(); - if (Collection.class.isAssignableFrom(propertyDescriptor - .getPropertyType())) { - - final Collection collection; - try { - collection = (Collection) readMethod.invoke(item); - } catch (IllegalAccessException | InvocationTargetException ex) { - throw new UnexpectedErrorException(ex); - } - - final List> associatedObjs = new ArrayList<>(); - for (final Object obj : collection) { - associatedObjs.add(generateAssociatedObject(obj, language)); - } - - result.put(propertyName, associatedObjs); - } else if (isValueType(propertyDescriptor.getPropertyType())) { - try { - result.put(propertyName, readMethod.invoke(item)); - } catch (IllegalAccessException | InvocationTargetException ex) { - throw new UnexpectedErrorException(ex); - } - } else if (LocalizedString.class.isAssignableFrom(propertyDescriptor - .getPropertyType())) { - - final LocalizedString localizedString; - try { - localizedString = (LocalizedString) readMethod.invoke(item); - } catch (IllegalAccessException | InvocationTargetException ex) { - throw new UnexpectedErrorException(ex); - } - - result.put(propertyName, localizedString.getValue(language)); - } else { - final Map associatedObj; - try { - associatedObj = generateAssociatedObject( - readMethod.invoke(item), language); - } catch (IllegalAccessException | InvocationTargetException ex) { - throw new UnexpectedErrorException(ex); - } - result.put(propertyName, associatedObj); - } - - final Set includedPropertyPaths = componentModel - .getIncludedPropertyPaths(); - final BeanInfo beanInfo; - try { - beanInfo = Introspector.getBeanInfo(item.getClass()); - } catch (IntrospectionException ex) { - throw new UnexpectedErrorException(ex); - } - final Map propertyDescriptors = Arrays - .stream(beanInfo.getPropertyDescriptors()) - .collect(Collectors.toMap(PropertyDescriptor::getName, - descriptor -> descriptor)); - for (final String propertyPath : includedPropertyPaths) { - final String[] pathTokens = propertyPath.split("."); - if (pathTokens.length < 3) { - continue; - } - if (!propertyDescriptors.containsKey(pathTokens[0])) { - continue; - } - final Object propResult = renderPropertyPath( - propertyDescriptors.get(pathTokens[0]), - Arrays.copyOfRange(pathTokens, 1, pathTokens.length), - language, - item); - if (propResult != null) { - result.put(propertyPath, propResult); - } - } - } - - protected Object renderPropertyPath( - final PropertyDescriptor propertyDescriptor, - final String[] propertyPath, - final Locale language, - final Object item) { - - if (propertyPath.length == 1) { - - final BeanInfo beanInfo; - try { - beanInfo = Introspector.getBeanInfo(item.getClass()); - } catch (IntrospectionException ex) { - throw new UnexpectedErrorException(ex); - } - final Map propertyDescriptors = Arrays - .stream(beanInfo.getPropertyDescriptors()) - .collect(Collectors.toMap(PropertyDescriptor::getName, - descriptor -> descriptor)); - if (propertyDescriptors.containsKey(propertyPath[0])) { - final Method readMethod = propertyDescriptors - .get(propertyPath[0]) - .getReadMethod(); - try { - return readMethod.invoke(item); - } catch(IllegalAccessException | InvocationTargetException ex) { - throw new UnexpectedErrorException(ex); - } - } else { - return null; - } - - } else { - final Method readMethod = propertyDescriptor.getReadMethod(); - final Object obj; - try { - obj = readMethod.invoke(item); - } catch (IllegalAccessException | InvocationTargetException ex) { - throw new UnexpectedErrorException(ex); - } - - if (isValueType(obj.getClass())) { - return null; - } - - final BeanInfo beanInfo; - try { - beanInfo = Introspector.getBeanInfo(obj.getClass()); - } catch (IntrospectionException ex) { - throw new UnexpectedErrorException(ex); - } - - final Map propertyDescriptors = Arrays - .stream(beanInfo.getPropertyDescriptors()) - .collect(Collectors.toMap(PropertyDescriptor::getName, - descriptor -> descriptor)); - - if (propertyDescriptors.containsKey(propertyPath[0])) { - return renderPropertyPath( - propertyDescriptors.get(propertyPath[0]), - Arrays.copyOfRange(propertyPath, 1, propertyPath.length), - language, - item); - } else { - return null; - } - } - } - - protected Map generateAssociatedObject( - final Object obj, final Locale language) { - - final BeanInfo beanInfo; - try { - beanInfo = Introspector.getBeanInfo(obj.getClass()); - } catch (IntrospectionException ex) { - throw new UnexpectedErrorException(ex); - } - - final PropertyDescriptor[] properties = beanInfo - .getPropertyDescriptors(); - - final Map result = new HashMap<>(); - for (final PropertyDescriptor propertyDescriptor : properties) { - final Class type = propertyDescriptor.getPropertyType(); - if (isValueType(type)) { - final Method readMethod = propertyDescriptor.getReadMethod(); - try { - result.put(propertyDescriptor.getName(), - readMethod.invoke(obj)); - } catch (IllegalAccessException | InvocationTargetException ex) { - throw new UnexpectedErrorException(ex); - } - } else if (LocalizedString.class.isAssignableFrom(type)) { - final Method readMethod = propertyDescriptor.getReadMethod(); - try { - final LocalizedString str = (LocalizedString) readMethod - .invoke(obj); - result.put(propertyDescriptor.getName(), - str.getValue(language)); - } catch (IllegalAccessException | InvocationTargetException ex) { - throw new UnexpectedErrorException(ex); - } - } - } - - return result; - } - - protected boolean isValueType(final Class typeToTest) { - final Class[] types = new Class[]{ - Boolean.class, - Boolean.TYPE, - Character.class, - Character.TYPE, - Byte.class, - Byte.TYPE, - Double.class, - Double.TYPE, - Float.class, - Float.TYPE, - Integer.class, - Integer.TYPE, - Long.class, - Long.TYPE, - Short.class, - Short.TYPE, - String.class - }; - - for (final Class type : types) { - if (type.isAssignableFrom(typeToTest)) { - return true; - } - } - - return typeToTest.isArray() - && (typeToTest.getComponentType() - .isAssignableFrom(Byte.class) - || typeToTest.getComponentType() - .isAssignableFrom(Byte.TYPE)); - } - } diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/ContentItemComponent.java b/ccm-cms/src/main/java/org/librecms/pagemodel/ContentItemComponent.java index 21e53b75e..b04d3316a 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/ContentItemComponent.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/ContentItemComponent.java @@ -27,6 +27,7 @@ import java.util.Objects; import java.util.Set; import javax.persistence.CollectionTable; +import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.JoinColumn; @@ -46,66 +47,21 @@ public class ContentItemComponent extends ComponentModel { private static final long serialVersionUID = 4904530823926147281L; - @ElementCollection - @CollectionTable(name = "GREETING_ITEM_INCLUDED_PATHS", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "GREETING_ITEM_ID") - }) - private Set includedPropertyPaths; + @Column(name = "MODE") + private String mode; - @ElementCollection - @CollectionTable(name = "GREETING_ITEM_EXCLUDED_PATHS", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "GREETING_ITEM_ID") - }) - private Set excludedProperties; - - public ContentItemComponent() { - includedPropertyPaths = new HashSet<>(); - excludedProperties = new HashSet<>(); + public String getMode() { + return mode; } - public Set getIncludedPropertyPaths() { - return Collections.unmodifiableSet(includedPropertyPaths); - } - - protected void setIncludedPropertyPaths( - final Set includePropertyPaths) { - this.includedPropertyPaths = new HashSet<>(includePropertyPaths); - } - - public void addIncludedPropertyPath(final String path) { - includedPropertyPaths.add(path); - } - - public void removeIncludedPropertyPath(final String path) { - includedPropertyPaths.remove(path); - } - - public Set getExcludedPropertyPaths() { - return Collections.unmodifiableSet(excludedProperties); - } - - protected void setExcludedPropertyPaths( - final Set excludedProperties) { - this.excludedProperties = new HashSet<>(excludedProperties); - } - - public void addExcludedProperty(final String path) { - excludedProperties.add(path); - } - - public void removeExcludedProperty(final String path) { - excludedProperties.remove(path); + public void setMode(final String mode) { + this.mode = mode; } @Override public int hashCode() { int hash = super.hashCode(); - hash = 13 * hash + Objects.hashCode(includedPropertyPaths); - hash = 13 * hash + Objects.hashCode(excludedProperties); + hash = 13 * hash + Objects.hashCode(mode); return hash; } @@ -128,12 +84,7 @@ public class ContentItemComponent extends ComponentModel { return false; } - if (!Objects.equals(includedPropertyPaths, - other.getIncludedPropertyPaths())) { - return false; - } - return Objects.equals(excludedProperties, - other.getExcludedPropertyPaths()); + return Objects.equals(mode, other.getMode()); } @Override @@ -144,10 +95,8 @@ public class ContentItemComponent extends ComponentModel { @Override public String toString(final String data) { return super.toString(String - .format(", includedPropertyPaths = %s, " - + "excludedProperties = %s%s", - Objects.toString(includedPropertyPaths), - Objects.toString(excludedProperties), + .format(", mode = \"%s\"", + Objects.toString(mode), data)); } diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/AbstractContentItemRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/AbstractContentItemRenderer.java index 4f33e7f1d..44afd0ec5 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/AbstractContentItemRenderer.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/AbstractContentItemRenderer.java @@ -28,11 +28,11 @@ import java.util.Map; /** * * @author Jens Pelzetter - * @param */ -public abstract class AbstractContentItemRenderer { +public abstract class AbstractContentItemRenderer { - public Map render(final T item, final Locale language) { + public Map render(final ContentItem item, + final Locale language) { final Map result = new HashMap<>(); @@ -55,7 +55,7 @@ public abstract class AbstractContentItemRenderer { return result; } - public abstract void renderItem(final T item, + protected abstract void renderItem(final ContentItem item, final Locale language, final Map result); diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ArticleRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ArticleRenderer.java index 6fc27f290..8dde33edd 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ArticleRenderer.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ArticleRenderer.java @@ -18,6 +18,7 @@ */ package org.librecms.pagemodel.contentitems; +import org.librecms.contentsection.ContentItem; import org.librecms.contenttypes.Article; import java.util.Locale; @@ -31,13 +32,20 @@ import javax.enterprise.context.RequestScoped; */ @ContentItemRenderer(renders = Article.class) @RequestScoped -public class ArticleRenderer extends AbstractContentItemRenderer
{ +public class ArticleRenderer extends AbstractContentItemRenderer { @Override - public void renderItem(final Article article, + public void renderItem(final ContentItem item, final Locale language, final Map result) { + final Article article; + if (item instanceof Article) { + article = (Article) item; + } else { + return; + } + result.put("text", article.getText().getValue(language)); } diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderers.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderers.java index 474aa7004..fee237a07 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderers.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/ContentItemRenderers.java @@ -41,18 +41,18 @@ public class ContentItemRenderers { .getLogger(ContentItemRenderers.class); @Inject - private Instance> renderers; + private Instance renderers; - public AbstractContentItemRenderer findRenderer( - final Class itemType) { + public AbstractContentItemRenderer findRenderer( + final Class itemType) { LOGGER.debug("Trying to find default renderer for item type \"{}\"...", itemType.getName()); return findRenderer(itemType, "--DEFAULT--"); } - public AbstractContentItemRenderer findRenderer( - final Class itemType, final String mode) { + public AbstractContentItemRenderer findRenderer( + final Class itemType, final String mode) { LOGGER.debug("Trying to find default renderer for item type \"{}\"" + "and mode \"{}\"...", @@ -63,7 +63,7 @@ public class ContentItemRenderers { = new ContentItemRendererLiteral( itemType, mode); - final Instance> instance = renderers + final Instance instance = renderers .select(literal); if (instance.isUnsatisfied()) { @@ -72,10 +72,10 @@ public class ContentItemRenderers { LOGGER.warn("No renderer for item type \"{}\" and mode " + "\"--DEFAULT--\". Returning default renderer.", itemType.getName()); - return new AbstractContentItemRenderer() { + return new AbstractContentItemRenderer() { @Override - public void renderItem(final T item, + public void renderItem(final ContentItem item, final Locale language, final Map result) { //Nothing here. @@ -91,13 +91,13 @@ public class ContentItemRenderers { return findRenderer(itemType); } } else { - final AbstractContentItemRenderer renderer = instance + final AbstractContentItemRenderer renderer = instance .iterator() .next(); @SuppressWarnings("unchecked") - final AbstractContentItemRenderer result - = (AbstractContentItemRenderer) renderer; + final AbstractContentItemRenderer result + = renderer; return result; } diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/EventRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/EventRenderer.java index 46b318569..913a4e56d 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/EventRenderer.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/EventRenderer.java @@ -18,6 +18,7 @@ */ package org.librecms.pagemodel.contentitems; +import org.librecms.contentsection.ContentItem; import org.librecms.contenttypes.Event; import java.util.Locale; @@ -28,13 +29,20 @@ import java.util.Map; * @author Jens Pelzetter */ @ContentItemRenderer(renders = Event.class) -public class EventRenderer extends AbstractContentItemRenderer { +public class EventRenderer extends AbstractContentItemRenderer { @Override - public void renderItem(final Event event, + public void renderItem(final ContentItem item, final Locale language, final Map result) { + final Event event; + if (item instanceof Event) { + event = (Event) item; + } else { + return; + } + result.put("text", event.getText().getValue(language)); result.put("startDate", event.getStartDate()); result.put("endDate", event.getEndDate()); diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/MultiPartArticleRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/MultiPartArticleRenderer.java index 97d3997a4..7ff44348f 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/MultiPartArticleRenderer.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/MultiPartArticleRenderer.java @@ -18,6 +18,7 @@ */ package org.librecms.pagemodel.contentitems; +import org.librecms.contentsection.ContentItem; import org.librecms.contenttypes.MultiPartArticle; import org.librecms.contenttypes.MultiPartArticleSection; @@ -31,14 +32,20 @@ import java.util.stream.Collectors; * @author Jens Pelzetter */ @ContentItemRenderer(renders = MultiPartArticle.class) -public class MultiPartArticleRenderer - extends AbstractContentItemRenderer { +public class MultiPartArticleRenderer extends AbstractContentItemRenderer { @Override - public void renderItem(final MultiPartArticle article, + public void renderItem(final ContentItem item, final Locale language, final Map result) { + final MultiPartArticle article; + if (item instanceof MultiPartArticle) { + article = (MultiPartArticle) item; + } else { + return; + } + result.put("summary", article.getSummary().getValue(language)); result.put("sections", article diff --git a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/NewsRenderer.java b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/NewsRenderer.java index e8a063133..d25a2d562 100644 --- a/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/NewsRenderer.java +++ b/ccm-cms/src/main/java/org/librecms/pagemodel/contentitems/NewsRenderer.java @@ -18,6 +18,7 @@ */ package org.librecms.pagemodel.contentitems; +import org.librecms.contentsection.ContentItem; import org.librecms.contenttypes.News; import java.util.Locale; @@ -31,13 +32,20 @@ import javax.enterprise.context.RequestScoped; */ @ContentItemRenderer(renders = News.class) @RequestScoped -public class NewsRenderer extends AbstractContentItemRenderer { +public class NewsRenderer extends AbstractContentItemRenderer { @Override - public void renderItem(final News news, + public void renderItem(final ContentItem item, final Locale language, final Map result) { + final News news; + if (item instanceof News) { + news = (News) item; + } else { + return; + } + result.put("text", news.getText().getValue(language)); result.put("releaseDate", news.getReleaseDate()); }