diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractCreatingOrUpdatingContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractCreatingOrUpdatingContentCommand.java index 4f74db24f6d..c8b34c105cf 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractCreatingOrUpdatingContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractCreatingOrUpdatingContentCommand.java @@ -13,6 +13,9 @@ import com.enonic.xp.context.Context; import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.core.internal.FileNames; +import com.enonic.xp.page.PageDescriptorService; +import com.enonic.xp.region.LayoutDescriptorService; +import com.enonic.xp.region.PartDescriptorService; import com.enonic.xp.schema.xdata.XDataService; import com.enonic.xp.security.User; import com.enonic.xp.site.SiteService; @@ -35,6 +38,12 @@ class AbstractCreatingOrUpdatingContentCommand final List contentValidators; + protected final PageDescriptorService pageDescriptorService; + + protected final PartDescriptorService partDescriptorService; + + protected final LayoutDescriptorService layoutDescriptorService; + final boolean allowUnsafeAttachmentNames; AbstractCreatingOrUpdatingContentCommand( final Builder builder ) @@ -45,6 +54,9 @@ class AbstractCreatingOrUpdatingContentCommand this.contentProcessors = List.copyOf( builder.contentProcessors ); this.contentValidators = List.copyOf( builder.contentValidators ); this.allowUnsafeAttachmentNames = builder.allowUnsafeAttachmentNames; + this.pageDescriptorService = builder.pageDescriptorService; + this.partDescriptorService = builder.partDescriptorService; + this.layoutDescriptorService = builder.layoutDescriptorService; } public static class Builder> @@ -60,6 +72,12 @@ public static class Builder> private boolean allowUnsafeAttachmentNames; + private PageDescriptorService pageDescriptorService; + + private PartDescriptorService partDescriptorService; + + private LayoutDescriptorService layoutDescriptorService; + Builder() { } @@ -71,6 +89,9 @@ public static class Builder> this.siteService = source.siteService; this.contentProcessors = source.contentProcessors; this.contentValidators = source.contentValidators; + this.pageDescriptorService = source.pageDescriptorService; + this.partDescriptorService = source.partDescriptorService; + this.layoutDescriptorService = source.layoutDescriptorService; } @SuppressWarnings("unchecked") @@ -108,6 +129,24 @@ B allowUnsafeAttachmentNames( final boolean allowUnsafeAttachmentNames ) return (B) this; } + B pageDescriptorService( final PageDescriptorService pageDescriptorService ) + { + this.pageDescriptorService = pageDescriptorService; + return (B) this; + } + + B partDescriptorService( final PartDescriptorService partDescriptorService ) + { + this.partDescriptorService = partDescriptorService; + return (B) this; + } + + B layoutDescriptorService( final LayoutDescriptorService layoutDescriptorService ) + { + this.layoutDescriptorService = layoutDescriptorService; + return (B) this; + } + @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentConfig.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentConfig.java index 31860b63d5e..d91b05c595c 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentConfig.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentConfig.java @@ -8,5 +8,7 @@ boolean attachments_allowUnsafeNames() default false; + boolean resolveEmptyRegions() default false; + String auditlog_filter() default "!system.content.update,*"; } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentNodeTranslator.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentNodeTranslator.java index 00a50ab8283..6f23187db25 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentNodeTranslator.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentNodeTranslator.java @@ -26,9 +26,19 @@ public class ContentNodeTranslator private final ContentDataSerializer contentDataSerializer; public ContentNodeTranslator( final NodeService nodeService ) + { + this(nodeService, new ContentDataSerializer()); + } + + public ContentNodeTranslator( final NodeService nodeService, final ContentDataSerializer contentDataSerializer ) { this.nodeService = nodeService; - this.contentDataSerializer = new ContentDataSerializer(); + this.contentDataSerializer = contentDataSerializer; + } + + public ContentDataSerializer getContentDataSerializer() + { + return contentDataSerializer; } public Contents fromNodes( final Nodes nodes, final boolean resolveHasChildren ) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentOutboundDependenciesIdsResolver.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentOutboundDependenciesIdsResolver.java index 94a8363e63f..2c18732ad42 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentOutboundDependenciesIdsResolver.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentOutboundDependenciesIdsResolver.java @@ -18,12 +18,9 @@ class ContentOutboundDependenciesIdsResolver { private final ContentService contentService; - private final ContentDataSerializer contentDataSerializer; - ContentOutboundDependenciesIdsResolver( final ContentService contentService ) { this.contentService = contentService; - this.contentDataSerializer = new ContentDataSerializer(); } public ContentIds resolve( final ContentId contentId ) @@ -40,7 +37,7 @@ private ContentIds resolveOutboundDependenciesIds( final ContentId contentId ) final PropertySet contentPageData = new PropertyTree().getRoot(); if ( content.getPage() != null ) { - contentDataSerializer.toPageData( content.getPage(), contentPageData ); + new ContentDataSerializer().toPageData( content.getPage(), contentPageData ); } final Stream extraDataDependencies = content.hasExtraData() ? content.getAllExtraData(). diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentServiceImpl.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentServiceImpl.java index b7303b7703a..8d4d6ce990c 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentServiceImpl.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentServiceImpl.java @@ -10,7 +10,6 @@ import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Modified; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ReferenceCardinality; import org.osgi.service.component.annotations.ReferencePolicy; @@ -100,6 +99,8 @@ import com.enonic.xp.content.processor.ContentProcessor; import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.context.ContextBuilder; +import com.enonic.xp.core.impl.content.serializer.ContentDataSerializer; +import com.enonic.xp.core.impl.content.serializer.FullContentDataSerializer; import com.enonic.xp.data.PropertyTree; import com.enonic.xp.event.EventPublisher; import com.enonic.xp.form.FormDefaultValuesProcessor; @@ -173,25 +174,19 @@ public class ContentServiceImpl private ContentAuditLogSupport contentAuditLogSupport; - private volatile ContentConfig config; + private final ContentConfig config; @Activate public ContentServiceImpl( @Reference final NodeService nodeService, @Reference final PageDescriptorService pageDescriptorService, @Reference final PartDescriptorService partDescriptorService, - @Reference final LayoutDescriptorService layoutDescriptorService ) + @Reference final LayoutDescriptorService layoutDescriptorService, ContentConfig config ) { + this.config = config; this.nodeService = nodeService; this.pageDescriptorService = pageDescriptorService; this.partDescriptorService = partDescriptorService; this.layoutDescriptorService = layoutDescriptorService; - this.translator = new ContentNodeTranslator( nodeService ); - } - - @Activate - @Modified - public void initialize( final ContentConfig config ) - { - this.config = config; + this.translator = new ContentNodeTranslator( nodeService, getContentDataSerializer() ); } @Override @@ -1247,6 +1242,19 @@ public InputStream getBinaryInputStream( final ContentId contentId, final Binary } } + private ContentDataSerializer getContentDataSerializer() + { + return config.resolveEmptyRegions() ? createFullContentDataSerializer() : new ContentDataSerializer(); + } + + private FullContentDataSerializer createFullContentDataSerializer() + { + return FullContentDataSerializer.create() + .layoutDescriptorService( layoutDescriptorService ) + .pageDescriptorService( pageDescriptorService ) + .build(); + } + private static void verifyContextBranch( final Branch branch ) { final Branch contextBranch = ContextAccessor.current().getBranch(); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateContentCommand.java index 663a7872759..552e02b848e 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateContentCommand.java @@ -35,9 +35,6 @@ import com.enonic.xp.node.NodeAccessException; import com.enonic.xp.node.NodeAlreadyExistAtPathException; import com.enonic.xp.node.RefreshMode; -import com.enonic.xp.page.PageDescriptorService; -import com.enonic.xp.region.LayoutDescriptorService; -import com.enonic.xp.region.PartDescriptorService; import com.enonic.xp.schema.content.ContentType; import com.enonic.xp.schema.content.GetContentTypeParams; import com.enonic.xp.security.PrincipalKey; @@ -56,21 +53,12 @@ final class CreateContentCommand private final FormDefaultValuesProcessor formDefaultValuesProcessor; - private final PageDescriptorService pageDescriptorService; - - private final PartDescriptorService partDescriptorService; - - private final LayoutDescriptorService layoutDescriptorService; - private CreateContentCommand( final Builder builder ) { super( builder ); this.params = builder.params; this.mediaInfo = builder.mediaInfo; this.formDefaultValuesProcessor = builder.formDefaultValuesProcessor; - this.pageDescriptorService = builder.pageDescriptorService; - this.partDescriptorService = builder.partDescriptorService; - this.layoutDescriptorService = builder.layoutDescriptorService; } static Builder create() @@ -108,6 +96,7 @@ private Content doExecute() .xDataService( this.xDataService ) .partDescriptorService( this.partDescriptorService ) .layoutDescriptorService( this.layoutDescriptorService ) + .contentDataSerializer( this.translator.getContentDataSerializer() ) .siteService( this.siteService ) .build() .produce().refresh( params.isRefresh() ? RefreshMode.ALL : RefreshMode.STORAGE ).build(); @@ -322,12 +311,6 @@ static class Builder private FormDefaultValuesProcessor formDefaultValuesProcessor; - private PageDescriptorService pageDescriptorService; - - private PartDescriptorService partDescriptorService; - - private LayoutDescriptorService layoutDescriptorService; - private Builder() { } @@ -355,24 +338,6 @@ Builder formDefaultValuesProcessor( final FormDefaultValuesProcessor formDefault return this; } - Builder pageDescriptorService( final PageDescriptorService value ) - { - this.pageDescriptorService = value; - return this; - } - - Builder partDescriptorService( final PartDescriptorService value ) - { - this.partDescriptorService = value; - return this; - } - - Builder layoutDescriptorService( final LayoutDescriptorService value ) - { - this.layoutDescriptorService = value; - return this; - } - @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateMediaCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateMediaCommand.java index e3a21bc021e..eabe83bba03 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateMediaCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateMediaCommand.java @@ -13,9 +13,6 @@ import com.enonic.xp.form.FormDefaultValuesProcessor; import com.enonic.xp.media.MediaInfo; import com.enonic.xp.media.MediaInfoService; -import com.enonic.xp.page.PageDescriptorService; -import com.enonic.xp.region.LayoutDescriptorService; -import com.enonic.xp.region.PartDescriptorService; import com.enonic.xp.schema.content.ContentTypeFromMimeTypeResolver; import com.enonic.xp.schema.content.ContentTypeName; @@ -28,21 +25,12 @@ final class CreateMediaCommand private final FormDefaultValuesProcessor formDefaultValuesProcessor; - private final PageDescriptorService pageDescriptorService; - - private final PartDescriptorService partDescriptorService; - - private final LayoutDescriptorService layoutDescriptorService; - private CreateMediaCommand( final Builder builder ) { super( builder ); this.params = builder.params; this.mediaInfoService = builder.mediaInfoService; this.formDefaultValuesProcessor = builder.formDefaultValuesProcessor; - this.pageDescriptorService = builder.pageDescriptorService; - this.partDescriptorService = builder.partDescriptorService; - this.layoutDescriptorService = builder.layoutDescriptorService; } Content execute() @@ -103,6 +91,7 @@ private Content doExecute() final CreateContentCommand createCommand = CreateContentCommand.create( this ). mediaInfo( mediaInfo ). + translator( this.translator ). params( createContentParams ). siteService( this.siteService ). xDataService( this.xDataService ). @@ -140,12 +129,6 @@ public static class Builder private FormDefaultValuesProcessor formDefaultValuesProcessor; - private PageDescriptorService pageDescriptorService; - - private PartDescriptorService partDescriptorService; - - private LayoutDescriptorService layoutDescriptorService; - public Builder params( final CreateMediaParams params ) { this.params = params; @@ -164,24 +147,6 @@ public Builder formDefaultValuesProcessor( final FormDefaultValuesProcessor form return this; } - Builder pageDescriptorService( final PageDescriptorService value ) - { - this.pageDescriptorService = value; - return this; - } - - Builder partDescriptorService( final PartDescriptorService value ) - { - this.partDescriptorService = value; - return this; - } - - Builder layoutDescriptorService( final LayoutDescriptorService value ) - { - this.layoutDescriptorService = value; - return this; - } - @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateNodeParamsFactory.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateNodeParamsFactory.java index 83ff3555919..9be7d16f35f 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateNodeParamsFactory.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CreateNodeParamsFactory.java @@ -45,6 +45,8 @@ public class CreateNodeParamsFactory private final SiteService siteService; + private final ContentDataSerializer contentDataSerializer; + public CreateNodeParamsFactory( final Builder builder ) { this.params = builder.params; @@ -54,11 +56,11 @@ public CreateNodeParamsFactory( final Builder builder ) this.pageDescriptorService = builder.pageDescriptorService; this.partDescriptorService = builder.partDescriptorService; this.layoutDescriptorService = builder.layoutDescriptorService; + this.contentDataSerializer = builder.contentDataSerializer; } public CreateNodeParams.Builder produce() { - final ContentDataSerializer contentDataSerializer = new ContentDataSerializer(); final PropertyTree contentAsData = contentDataSerializer.toCreateNodeData( params ); final PropertySet extraDataSet = contentAsData.getPropertySet( PropertyPath.from( ContentPropertyNames.EXTRA_DATA ) ); @@ -147,6 +149,8 @@ public static class Builder private LayoutDescriptorService layoutDescriptorService; + private ContentDataSerializer contentDataSerializer; + private SiteService siteService; Builder( final CreateContentTranslatorParams params ) @@ -190,6 +194,12 @@ Builder layoutDescriptorService( final LayoutDescriptorService value ) return this; } + Builder contentDataSerializer( final ContentDataSerializer value ) + { + this.contentDataSerializer = value; + return this; + } + void validate() { Preconditions.checkNotNull( params ); @@ -197,6 +207,7 @@ void validate() Preconditions.checkNotNull( pageDescriptorService ); Preconditions.checkNotNull( siteService ); Preconditions.checkNotNull( xDataService ); + Preconditions.checkNotNull( contentDataSerializer ); } public CreateNodeParamsFactory build() diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ImportContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ImportContentCommand.java index 193ba58e536..f7e02a925e1 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ImportContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ImportContentCommand.java @@ -34,6 +34,7 @@ private ImportContentResult doExecute() { final Node importNode = ImportContentFactory.create(). params( params ). + contentDataSerializer( this.translator.getContentDataSerializer() ). build().execute(); final ImportNodeParams importNodeParams = ImportNodeParams.create().importNode( importNode ) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ImportContentFactory.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ImportContentFactory.java index 9fe4c6395d2..ec8bcc97e63 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ImportContentFactory.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ImportContentFactory.java @@ -20,9 +20,12 @@ public class ImportContentFactory { private final ImportContentParams params; + private final ContentDataSerializer contentDataSerializer; + private ImportContentFactory( Builder builder ) { this.params = builder.params; + this.contentDataSerializer = builder.contentDataSerializer; } public static Builder create() @@ -32,7 +35,6 @@ public static Builder create() public Node execute() { - final ContentDataSerializer contentDataSerializer = new ContentDataSerializer(); final PropertyTree nodeData = contentDataSerializer.toNodeData( params.getContent() ); if ( params.getInherit() != null ) @@ -72,6 +74,8 @@ public static final class Builder { private ImportContentParams params; + private ContentDataSerializer contentDataSerializer; + private Builder() { } @@ -82,6 +86,12 @@ public Builder params( final ImportContentParams params ) return this; } + public Builder contentDataSerializer( final ContentDataSerializer contentDataSerializer ) + { + this.contentDataSerializer = contentDataSerializer; + return this; + } + private void validate() { Preconditions.checkNotNull( this.params, "params cannot be null" ); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/RenameContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/RenameContentCommand.java index c7aacbf4db6..03120ab3fa1 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/RenameContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/RenameContentCommand.java @@ -13,9 +13,6 @@ import com.enonic.xp.node.NodeName; import com.enonic.xp.node.RefreshMode; import com.enonic.xp.node.RenameNodeParams; -import com.enonic.xp.page.PageDescriptorService; -import com.enonic.xp.region.LayoutDescriptorService; -import com.enonic.xp.region.PartDescriptorService; import static com.enonic.xp.core.impl.content.ContentNodeHelper.translateNodePathToContentPath; @@ -25,19 +22,10 @@ final class RenameContentCommand { private final RenameContentParams params; - private final PageDescriptorService pageDescriptorService; - - private final PartDescriptorService partDescriptorService; - - private final LayoutDescriptorService layoutDescriptorService; - private RenameContentCommand( final Builder builder ) { super( builder ); this.params = builder.params; - this.pageDescriptorService = builder.pageDescriptorService; - this.partDescriptorService = builder.partDescriptorService; - this.layoutDescriptorService = builder.layoutDescriptorService; } public static Builder create( final RenameContentParams params ) @@ -126,35 +114,11 @@ public static class Builder { private final RenameContentParams params; - private PageDescriptorService pageDescriptorService; - - private PartDescriptorService partDescriptorService; - - private LayoutDescriptorService layoutDescriptorService; - Builder( final RenameContentParams params ) { this.params = params; } - Builder pageDescriptorService( final PageDescriptorService value ) - { - this.pageDescriptorService = value; - return this; - } - - Builder partDescriptorService( final PartDescriptorService value ) - { - this.partDescriptorService = value; - return this; - } - - Builder layoutDescriptorService( final LayoutDescriptorService value ) - { - this.layoutDescriptorService = value; - return this; - } - @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ReprocessContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ReprocessContentCommand.java index 2e34d96c2c8..d89e10edddd 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ReprocessContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ReprocessContentCommand.java @@ -15,9 +15,6 @@ import com.enonic.xp.node.NodeId; import com.enonic.xp.node.RefreshMode; import com.enonic.xp.node.UpdateNodeParams; -import com.enonic.xp.page.PageDescriptorService; -import com.enonic.xp.region.LayoutDescriptorService; -import com.enonic.xp.region.PartDescriptorService; import static com.enonic.xp.content.ContentPropertyNames.MODIFIED_TIME; @@ -29,20 +26,11 @@ final class ReprocessContentCommand private final MediaInfoService mediaInfoService; - private final PageDescriptorService pageDescriptorService; - - private final PartDescriptorService partDescriptorService; - - private final LayoutDescriptorService layoutDescriptorService; - private ReprocessContentCommand( final Builder builder ) { super( builder ); this.params = builder.params; this.mediaInfoService = builder.mediaInfoService; - this.pageDescriptorService = builder.pageDescriptorService; - this.partDescriptorService = builder.partDescriptorService; - this.layoutDescriptorService = builder.layoutDescriptorService; } Content execute() @@ -107,12 +95,6 @@ public static class Builder private MediaInfoService mediaInfoService; - private PageDescriptorService pageDescriptorService; - - private PartDescriptorService partDescriptorService; - - private LayoutDescriptorService layoutDescriptorService; - private Builder( final ReprocessContentParams params ) { this.params = params; @@ -124,30 +106,6 @@ public Builder mediaInfoService( final MediaInfoService value ) return this; } - public Builder pageDescriptorService( final PageDescriptorService value ) - { - this.pageDescriptorService = value; - return this; - } - - public Builder partDescriptorService( final PartDescriptorService value ) - { - this.partDescriptorService = value; - return this; - } - - public Builder layoutDescriptorService( final LayoutDescriptorService value ) - { - this.layoutDescriptorService = value; - return this; - } - - @Override - void validate() - { - super.validate(); - } - public ReprocessContentCommand build() { validate(); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateContentCommand.java index e24f6134eca..ed652064669 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateContentCommand.java @@ -45,9 +45,6 @@ import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeIds; import com.enonic.xp.node.UpdateNodeParams; -import com.enonic.xp.page.PageDescriptorService; -import com.enonic.xp.region.LayoutDescriptorService; -import com.enonic.xp.region.PartDescriptorService; import com.enonic.xp.schema.content.ContentType; import com.enonic.xp.schema.content.ContentTypeName; import com.enonic.xp.schema.content.GetContentTypeParams; @@ -63,20 +60,11 @@ final class UpdateContentCommand private final MediaInfo mediaInfo; - private final PageDescriptorService pageDescriptorService; - - private final PartDescriptorService partDescriptorService; - - private final LayoutDescriptorService layoutDescriptorService; - private UpdateContentCommand( final Builder builder ) { super( builder ); this.params = builder.params; this.mediaInfo = builder.mediaInfo; - this.pageDescriptorService = builder.pageDescriptorService; - this.partDescriptorService = builder.partDescriptorService; - this.layoutDescriptorService = builder.layoutDescriptorService; } public static Builder create( final UpdateContentParams params ) @@ -197,6 +185,7 @@ private Content doExecute() .pageDescriptorService( this.pageDescriptorService ) .partDescriptorService( this.partDescriptorService ) .layoutDescriptorService( this.layoutDescriptorService ) + .contentDataSerializer( this.translator.getContentDataSerializer() ) .siteService( this.siteService ) .build() .produce(); @@ -355,12 +344,6 @@ public static class Builder private MediaInfo mediaInfo; - private PageDescriptorService pageDescriptorService; - - private PartDescriptorService partDescriptorService; - - private LayoutDescriptorService layoutDescriptorService; - Builder( final UpdateContentParams params ) { this.params = params; @@ -383,24 +366,6 @@ Builder mediaInfo( final MediaInfo value ) return this; } - Builder pageDescriptorService( final PageDescriptorService value ) - { - this.pageDescriptorService = value; - return this; - } - - Builder partDescriptorService( final PartDescriptorService value ) - { - this.partDescriptorService = value; - return this; - } - - Builder layoutDescriptorService( final LayoutDescriptorService value ) - { - this.layoutDescriptorService = value; - return this; - } - @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateMediaCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateMediaCommand.java index f521e19b050..fb6ff459e45 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateMediaCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateMediaCommand.java @@ -11,9 +11,6 @@ import com.enonic.xp.content.UpdateMediaParams; import com.enonic.xp.media.MediaInfo; import com.enonic.xp.media.MediaInfoService; -import com.enonic.xp.page.PageDescriptorService; -import com.enonic.xp.region.LayoutDescriptorService; -import com.enonic.xp.region.PartDescriptorService; import com.enonic.xp.schema.content.ContentTypeFromMimeTypeResolver; import com.enonic.xp.schema.content.ContentTypeName; @@ -24,20 +21,11 @@ final class UpdateMediaCommand private final MediaInfoService mediaInfoService; - private final PageDescriptorService pageDescriptorService; - - private final PartDescriptorService partDescriptorService; - - private final LayoutDescriptorService layoutDescriptorService; - private UpdateMediaCommand( final Builder builder ) { super( builder ); this.params = builder.params; this.mediaInfoService = builder.mediaInfoService; - this.pageDescriptorService = builder.pageDescriptorService; - this.partDescriptorService = builder.partDescriptorService; - this.layoutDescriptorService = builder.layoutDescriptorService; } public static Builder create( final UpdateMediaParams params ) @@ -123,13 +111,6 @@ public static class Builder private MediaInfoService mediaInfoService; - private PageDescriptorService pageDescriptorService; - - private PartDescriptorService partDescriptorService; - - private LayoutDescriptorService layoutDescriptorService; - - Builder( final UpdateMediaParams params ) { this.params = params; @@ -147,24 +128,6 @@ public Builder mediaInfoService( final MediaInfoService value ) return this; } - public Builder pageDescriptorService( final PageDescriptorService value ) - { - this.pageDescriptorService = value; - return this; - } - - public Builder partDescriptorService( final PartDescriptorService value ) - { - this.partDescriptorService = value; - return this; - } - - public Builder layoutDescriptorService( final LayoutDescriptorService value ) - { - this.layoutDescriptorService = value; - return this; - } - @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateNodeParamsFactory.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateNodeParamsFactory.java index 373ba3bf726..7a4e2f75048 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateNodeParamsFactory.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UpdateNodeParamsFactory.java @@ -44,6 +44,8 @@ public class UpdateNodeParamsFactory private final SiteService siteService; + private final ContentDataSerializer contentDataSerializer; + public UpdateNodeParamsFactory( final Builder builder ) { this.editedContent = builder.editedContent; @@ -55,6 +57,7 @@ public UpdateNodeParamsFactory( final Builder builder ) this.pageDescriptorService = builder.pageDescriptorService; this.partDescriptorService = builder.partDescriptorService; this.layoutDescriptorService = builder.layoutDescriptorService; + this.contentDataSerializer = builder.contentDataSerializer; this.siteService = builder.siteService; } @@ -81,7 +84,6 @@ public static Builder create() private NodeEditor toNodeEditor() { - final ContentDataSerializer contentDataSerializer = new ContentDataSerializer(); final PropertyTree nodeData = contentDataSerializer.toUpdateNodeData( editedContent, modifier, attachments ); final ContentIndexConfigFactory indexConfigFactory = ContentIndexConfigFactory.create(). @@ -127,6 +129,8 @@ public static class Builder private LayoutDescriptorService layoutDescriptorService; + private ContentDataSerializer contentDataSerializer; + private SiteService siteService; Builder editedContent( final Content editedContent ) @@ -189,6 +193,12 @@ Builder siteService( final SiteService value ) return this; } + Builder contentDataSerializer( final ContentDataSerializer contentDataSerializer ) + { + this.contentDataSerializer = contentDataSerializer; + return this; + } + void validate() { Preconditions.checkNotNull( modifier, "modifier cannot be null" ); @@ -201,6 +211,7 @@ void validate() Preconditions.checkNotNull( pageDescriptorService ); Preconditions.checkNotNull( partDescriptorService ); Preconditions.checkNotNull( layoutDescriptorService ); + Preconditions.checkNotNull( contentDataSerializer ); } public UpdateNodeParamsFactory build() diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/ComponentDataSerializerProvider.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/ComponentDataSerializerProvider.java index 00b391c8227..8328365955f 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/ComponentDataSerializerProvider.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/ComponentDataSerializerProvider.java @@ -4,6 +4,7 @@ import com.enonic.xp.region.FragmentComponentType; import com.enonic.xp.region.ImageComponentType; import com.enonic.xp.region.LayoutComponentType; +import com.enonic.xp.region.LayoutDescriptorService; import com.enonic.xp.region.PartComponentType; import com.enonic.xp.region.TextComponentType; @@ -21,14 +22,22 @@ public final class ComponentDataSerializerProvider private final RegionDataSerializer regionDataSerializer; - public ComponentDataSerializerProvider( ) + public ComponentDataSerializerProvider() + { + this( null ); + } + + public ComponentDataSerializerProvider( final LayoutDescriptorService layoutDescriptorService ) { this.regionDataSerializer = new RegionDataSerializer( this ); this.partDataSerializer = new PartComponentDataSerializer(); this.textDataSerializer = new TextComponentDataSerializer(); - this.layoutDataSerializer = new LayoutComponentDataSerializer( this.regionDataSerializer ); this.imageDataSerializer = new ImageComponentDataSerializer(); this.fragmentDataSerializer = new FragmentComponentDataSerializer(); + + this.layoutDataSerializer = layoutDescriptorService == null + ? new LayoutComponentDataSerializer( this.regionDataSerializer ) + : new FullLayoutComponentDataSerializer( layoutDescriptorService, regionDataSerializer ); } public ComponentDataSerializer getDataSerializer( final ComponentType componentType ) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/ContentDataSerializer.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/ContentDataSerializer.java index 500552cd9b2..184dd8fc335 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/ContentDataSerializer.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/ContentDataSerializer.java @@ -89,7 +89,12 @@ public class ContentDataSerializer public ContentDataSerializer( ) { - this.pageDataSerializer = new PageDataSerializer(); + this( new PageDataSerializer() ); + } + + protected ContentDataSerializer( final PageDataSerializer pageDataSerializer ) + { + this.pageDataSerializer = pageDataSerializer; this.extraDataSerializer = new ExtraDataSerializer(); this.workflowInfoSerializer = new WorkflowInfoSerializer(); this.publishInfoSerializer = new PublishInfoSerializer(); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullContentDataSerializer.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullContentDataSerializer.java new file mode 100644 index 00000000000..87288ce63c7 --- /dev/null +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullContentDataSerializer.java @@ -0,0 +1,54 @@ +package com.enonic.xp.core.impl.content.serializer; + +import com.google.common.base.Preconditions; + +import com.enonic.xp.page.PageDescriptorService; +import com.enonic.xp.region.LayoutDescriptorService; + +public class FullContentDataSerializer extends ContentDataSerializer +{ + private FullContentDataSerializer( final Builder builder ) + { + super( FullPageDataSerializer.create() + .pageDescriptorService( builder.pageDescriptorService ) + .layoutDescriptorService( builder.layoutDescriptorService ) + .build() ); + } + + public static Builder create() + { + return new Builder(); + } + + public static class Builder + { + private PageDescriptorService pageDescriptorService; + + private LayoutDescriptorService layoutDescriptorService; + + public Builder pageDescriptorService( final PageDescriptorService value ) + { + this.pageDescriptorService = value; + return this; + } + + public Builder layoutDescriptorService( final LayoutDescriptorService value ) + { + this.layoutDescriptorService = value; + return this; + } + + void validate() + { + Preconditions.checkNotNull( pageDescriptorService ); + Preconditions.checkNotNull( layoutDescriptorService ); + } + + public FullContentDataSerializer build() + { + validate(); + return new FullContentDataSerializer( this ); + } + } + +} diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullLayoutComponentDataSerializer.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullLayoutComponentDataSerializer.java new file mode 100644 index 00000000000..a38f64970ea --- /dev/null +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullLayoutComponentDataSerializer.java @@ -0,0 +1,56 @@ +package com.enonic.xp.core.impl.content.serializer; + + +import java.util.List; + +import com.enonic.xp.data.PropertySet; +import com.enonic.xp.page.DescriptorKey; +import com.enonic.xp.region.LayoutComponent; +import com.enonic.xp.region.LayoutComponentType; +import com.enonic.xp.region.LayoutDescriptor; +import com.enonic.xp.region.LayoutDescriptorService; +import com.enonic.xp.region.LayoutRegions; + +class FullLayoutComponentDataSerializer + extends LayoutComponentDataSerializer +{ + private final LayoutDescriptorService layoutDescriptorService; + + FullLayoutComponentDataSerializer( final LayoutDescriptorService layoutDescriptorService, final RegionDataSerializer regionDataSerializer ) + { + super( regionDataSerializer ); + this.layoutDescriptorService = layoutDescriptorService; + } + + public LayoutComponent fromData( final PropertySet layoutData, final List componentsAsData ) + { + final LayoutComponent.Builder layoutComponent = LayoutComponent.create(); + + final LayoutRegions.Builder layoutRegionsBuilder = LayoutRegions.create(); + + final PropertySet specialBlockSet = layoutData.getSet( LayoutComponentType.INSTANCE.toString() ); + + if ( specialBlockSet != null && specialBlockSet.isNotNull( DESCRIPTOR ) ) + { + final DescriptorKey descriptorKey = DescriptorKey.from( specialBlockSet.getString( DESCRIPTOR ) ); + + layoutComponent.descriptor( descriptorKey ); + layoutComponent.config( getConfigFromData( specialBlockSet, descriptorKey ) ); + + final LayoutDescriptor layoutDescriptor = layoutDescriptorService.getByKey( descriptorKey ); + + final String layoutPath = layoutData.getString( PATH ); + + if ( layoutDescriptor.getRegions() != null && layoutDescriptor.getRegions().numberOfRegions() > 0 ) + { + layoutDescriptor.getRegions().forEach( regionDescriptor -> { + layoutRegionsBuilder.add( regionDataSerializer.fromData( regionDescriptor, layoutPath, componentsAsData ) ); + } ); + } + } + + layoutComponent.regions( layoutRegionsBuilder.build() ); + + return layoutComponent.build(); + } +} diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullPageDataSerializer.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullPageDataSerializer.java new file mode 100644 index 00000000000..ef9f879b3d7 --- /dev/null +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/FullPageDataSerializer.java @@ -0,0 +1,78 @@ +package com.enonic.xp.core.impl.content.serializer; + +import java.util.List; + +import com.google.common.base.Preconditions; + +import com.enonic.xp.data.PropertySet; +import com.enonic.xp.page.DescriptorKey; +import com.enonic.xp.page.PageDescriptor; +import com.enonic.xp.page.PageDescriptorService; +import com.enonic.xp.page.PageRegions; +import com.enonic.xp.region.ComponentPath; +import com.enonic.xp.region.LayoutDescriptorService; +import com.enonic.xp.region.RegionDescriptors; + +final class FullPageDataSerializer + extends PageDataSerializer +{ + private final PageDescriptorService pageDescriptorService; + + private FullPageDataSerializer( final Builder builder ) + { + this.pageDescriptorService = builder.pageDescriptorService; + this.componentDataSerializerProvider = new ComponentDataSerializerProvider( builder.layoutDescriptorService ); + } + + protected PageRegions getPageRegions( final DescriptorKey descriptorKey, final List componentsAsData ) + { + final PageDescriptor pageDescriptor = pageDescriptorService.getByKey( descriptorKey ); + + final RegionDescriptors regionDescriptors = pageDescriptor.getRegions(); + + final PageRegions.Builder pageRegionsBuilder = PageRegions.create(); + + regionDescriptors.forEach( regionDescriptor -> { + pageRegionsBuilder.add( componentDataSerializerProvider.getRegionDataSerializer() + .fromData( regionDescriptor, ComponentPath.DIVIDER, componentsAsData ) ); + } ); + + return pageRegionsBuilder.build(); + } + + public static Builder create() + { + return new Builder(); + } + + public static class Builder + { + private PageDescriptorService pageDescriptorService; + + private LayoutDescriptorService layoutDescriptorService; + + public Builder pageDescriptorService( final PageDescriptorService value ) + { + this.pageDescriptorService = value; + return this; + } + + public Builder layoutDescriptorService( final LayoutDescriptorService value ) + { + this.layoutDescriptorService = value; + return this; + } + + void validate() + { + Preconditions.checkNotNull( pageDescriptorService ); + Preconditions.checkNotNull( layoutDescriptorService ); + } + + public FullPageDataSerializer build() + { + validate(); + return new FullPageDataSerializer( this ); + } + } +} diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/LayoutComponentDataSerializer.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/LayoutComponentDataSerializer.java index c6787af16b0..6c73a1fe45f 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/LayoutComponentDataSerializer.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/LayoutComponentDataSerializer.java @@ -15,10 +15,10 @@ import com.enonic.xp.region.Region; import com.enonic.xp.region.RegionDescriptors; -final class LayoutComponentDataSerializer +class LayoutComponentDataSerializer extends DescriptorBasedComponentDataSerializer { - private final RegionDataSerializer regionDataSerializer; + protected final RegionDataSerializer regionDataSerializer; LayoutComponentDataSerializer( final RegionDataSerializer regionDataSerializer ) { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/PageDataSerializer.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/PageDataSerializer.java index d7a079d4df7..246c12404a3 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/PageDataSerializer.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/serializer/PageDataSerializer.java @@ -1,5 +1,6 @@ package com.enonic.xp.core.impl.content.serializer; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -25,18 +26,23 @@ import static com.enonic.xp.core.impl.content.serializer.DescriptorBasedComponentDataSerializer.appNameToConfigPropertyName; import static com.enonic.xp.core.impl.content.serializer.DescriptorBasedComponentDataSerializer.getConfigFromData; -final class PageDataSerializer +class PageDataSerializer extends AbstractDataSetSerializer { private static final String TEMPLATE = "template"; private static final String CUSTOMIZED = "customized"; - private final ComponentDataSerializerProvider componentDataSerializerProvider; + protected ComponentDataSerializerProvider componentDataSerializerProvider; PageDataSerializer( ) { - this.componentDataSerializerProvider = new ComponentDataSerializerProvider(); + this(new ComponentDataSerializerProvider()); + } + + protected PageDataSerializer( final ComponentDataSerializerProvider componentDataSerializerProvider ) + { + this.componentDataSerializerProvider = componentDataSerializerProvider; } @Override @@ -52,13 +58,13 @@ public void toData( final Page page, final PropertySet parent ) } } - private void serializeFragment( final Page page, final PropertySet parent ) + protected void serializeFragment( final Page page, final PropertySet parent ) { final Component fragment = page.getFragment(); componentDataSerializerProvider.getDataSerializer( fragment.getType() ).toData( fragment, parent ); } - private void serializePage( final Page page, final PropertySet parent ) + protected void serializePage( final Page page, final PropertySet parent ) { final PropertySet asSet = parent.addSet( COMPONENTS ); @@ -104,7 +110,6 @@ private void addRegions( final Page page, final PropertySet asSet ) } } - @Override public Page fromData( final PropertySet asSet ) { final List componentsAsData = asSet.getProperties( COMPONENTS ) @@ -118,10 +123,25 @@ public Page fromData( final PropertySet asSet ) return null; } + if ( !isRootComponent( componentsAsData.get( 0 ) ) ) + { + componentsAsData.sort( Comparator.comparing( this::getComponentPath ) ); + } + return fromData( componentsAsData ); } - private Page fromData( final List componentsAsData ) + private boolean isRootComponent( final PropertySet componentData ) + { + return getComponentPath( componentData ).equals( ComponentPath.DIVIDER ); + } + + private String getComponentPath( final PropertySet componentData ) + { + return componentData.getString( PATH ); + } + + protected Page fromData( final List componentsAsData ) { final PropertySet pageData = componentsAsData.get( 0 ); componentsAsData.remove( 0 ); @@ -129,7 +149,7 @@ private Page fromData( final List componentsAsData ) return fromData( pageData, componentsAsData ); } - private Page fromData( final PropertySet pageData, final List componentsAsData ) + protected Page fromData( final PropertySet pageData, final List componentsAsData ) { final boolean isFragment = !pageData.getString( TYPE ).equals( PAGE ); @@ -141,7 +161,7 @@ private Page fromData( final PropertySet pageData, final List compo return fromPageData( pageData, componentsAsData ); } - private Page fromFragmentData( final PropertySet fragmentData, final List componentsAsData ) + protected Page fromFragmentData( final PropertySet fragmentData, final List componentsAsData ) { final Page.Builder page = Page.create(); @@ -150,7 +170,7 @@ private Page fromFragmentData( final PropertySet fragmentData, final List componentsAsData ) + protected Page fromPageData( final PropertySet pageData, final List componentsAsData ) { final Page.Builder page = Page.create(); @@ -163,7 +183,7 @@ private Page fromPageData( final PropertySet pageData, final List c final DescriptorKey descriptorKey = DescriptorKey.from( specialBlockSet.getString( DESCRIPTOR ) ); page.descriptor( descriptorKey ); page.config( getConfigFromData( specialBlockSet, descriptorKey ) ); - page.regions( getPageRegions( componentsAsData ) ); + page.regions( getPageRegions( descriptorKey, componentsAsData ) ); } if ( specialBlockSet.isNotNull( TEMPLATE ) ) @@ -180,7 +200,7 @@ private Page fromPageData( final PropertySet pageData, final List c return page.build(); } - private PageRegions getPageRegions( final List componentsAsData ) + protected PageRegions getPageRegions( final DescriptorKey descriptorKey, final List componentsAsData ) { final RegionDescriptors regionDescriptors = componentDataSerializerProvider.getRegionDataSerializer().getRegionDescriptorsAtLevel( 1, componentsAsData ); diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/ContentOutboundDependenciesIdsResolverTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/ContentOutboundDependenciesIdsResolverTest.java index 90326088348..25df5e51b47 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/ContentOutboundDependenciesIdsResolverTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/ContentOutboundDependenciesIdsResolverTest.java @@ -14,6 +14,7 @@ import com.enonic.xp.content.Contents; import com.enonic.xp.content.ExtraData; import com.enonic.xp.content.ExtraDatas; +import com.enonic.xp.core.impl.content.serializer.ContentDataSerializer; import com.enonic.xp.data.PropertyTree; import com.enonic.xp.schema.content.ContentTypeName; import com.enonic.xp.schema.xdata.XDataName; diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/ImportContentFactoryTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/ImportContentFactoryTest.java index 7a88e8009ca..a1de4a8e787 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/ImportContentFactoryTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/ImportContentFactoryTest.java @@ -17,6 +17,7 @@ import com.enonic.xp.content.ContentPath; import com.enonic.xp.content.ContentPublishInfo; import com.enonic.xp.content.ImportContentParams; +import com.enonic.xp.core.impl.content.serializer.ContentDataSerializer; import com.enonic.xp.data.PropertyTree; import com.enonic.xp.node.Node; import com.enonic.xp.project.ProjectName; @@ -107,6 +108,6 @@ public void removePublishInfo() private ImportContentFactory createFactory() { - return ImportContentFactory.create().params( this.params ).build(); + return ImportContentFactory.create().params( this.params ).contentDataSerializer( new ContentDataSerializer() ).build(); } } diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/RenameContentCommandTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/RenameContentCommandTest.java index a9760ecb84f..e40cedece26 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/RenameContentCommandTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/RenameContentCommandTest.java @@ -97,6 +97,7 @@ void setUp() when( nodeService.rename( isA( RenameNodeParams.class ) ) ).thenReturn( mockNode ); when( nodeService.getById( mockNode.id() ) ).thenReturn( mockNode ); + when( translator.getContentDataSerializer() ).thenReturn( new ContentDataSerializer() ); } @Test diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/serializer/FullLayoutComponentDataSerializerTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/serializer/FullLayoutComponentDataSerializerTest.java new file mode 100644 index 00000000000..d624d902e38 --- /dev/null +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/serializer/FullLayoutComponentDataSerializerTest.java @@ -0,0 +1,66 @@ +package com.enonic.xp.core.impl.content.serializer; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import com.enonic.xp.data.PropertySet; +import com.enonic.xp.data.PropertyTree; +import com.enonic.xp.form.Form; +import com.enonic.xp.page.DescriptorKey; +import com.enonic.xp.region.ComponentPath; +import com.enonic.xp.region.LayoutComponent; +import com.enonic.xp.region.LayoutComponentType; +import com.enonic.xp.region.LayoutDescriptor; +import com.enonic.xp.region.LayoutDescriptorService; +import com.enonic.xp.region.RegionDescriptor; +import com.enonic.xp.region.RegionDescriptors; + +import static com.enonic.xp.content.ContentPropertyNames.PAGE; +import static com.enonic.xp.core.impl.content.serializer.ComponentDataSerializer.COMPONENTS; +import static com.enonic.xp.core.impl.content.serializer.ComponentDataSerializer.PATH; +import static com.enonic.xp.core.impl.content.serializer.ComponentDataSerializer.TYPE; +import static com.enonic.xp.core.impl.content.serializer.DescriptorBasedComponentDataSerializer.DESCRIPTOR; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class FullLayoutComponentDataSerializerTest +{ + private LayoutDescriptorService layoutDescriptorService; + + private FullLayoutComponentDataSerializer componentDataSerializer; + + private RegionDataSerializer regionDataSerializer; + + @BeforeEach + public void setUp() + { + this.regionDataSerializer = new RegionDataSerializer( new ComponentDataSerializerProvider() ); + this.layoutDescriptorService = Mockito.mock( LayoutDescriptorService.class ); + this.componentDataSerializer = new FullLayoutComponentDataSerializer( layoutDescriptorService, regionDataSerializer ); + } + + @Test + public void testRegionsFetched() + { + final DescriptorKey pageDescriptorKey = DescriptorKey.from( "myapplication:my-page" ); + final RegionDescriptors regions = RegionDescriptors.create().add( RegionDescriptor.create().name( "main" ).build() ).build(); + final LayoutDescriptor layoutDescriptor = LayoutDescriptor.create().key( pageDescriptorKey ) + .config( Form.create().build() ) + .regions( regions ) + .build(); + + final PropertyTree newPropertyTree = new PropertyTree(); + final PropertySet layoutRootData = newPropertyTree.getRoot(); + final PropertySet layoutData = layoutRootData.addSet( LayoutComponentType.INSTANCE.toString() ); + + Mockito.when( layoutDescriptorService.getByKey( pageDescriptorKey ) ).thenReturn( layoutDescriptor ); + + layoutData.addString( DESCRIPTOR, "myapplication:my-page" ); + + final LayoutComponent layoutComponent = componentDataSerializer.fromData( layoutRootData ); + + assertNotNull( layoutComponent ); + assertNotNull( layoutComponent.getRegion( "main" ) ); + } +} diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/serializer/FullPageDataSerializerTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/serializer/FullPageDataSerializerTest.java new file mode 100644 index 00000000000..0a95cb63b16 --- /dev/null +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/serializer/FullPageDataSerializerTest.java @@ -0,0 +1,77 @@ +package com.enonic.xp.core.impl.content.serializer; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import com.enonic.xp.core.impl.content.page.AbstractDataSerializerTest; +import com.enonic.xp.data.PropertySet; +import com.enonic.xp.data.PropertyTree; +import com.enonic.xp.form.Form; +import com.enonic.xp.page.DescriptorKey; +import com.enonic.xp.page.Page; +import com.enonic.xp.page.PageDescriptor; +import com.enonic.xp.page.PageDescriptorService; +import com.enonic.xp.region.ComponentPath; +import com.enonic.xp.region.LayoutDescriptorService; +import com.enonic.xp.region.RegionDescriptor; +import com.enonic.xp.region.RegionDescriptors; + +import static com.enonic.xp.content.ContentPropertyNames.PAGE; +import static com.enonic.xp.core.impl.content.serializer.ComponentDataSerializer.COMPONENTS; +import static com.enonic.xp.core.impl.content.serializer.ComponentDataSerializer.PATH; +import static com.enonic.xp.core.impl.content.serializer.ComponentDataSerializer.TYPE; +import static com.enonic.xp.core.impl.content.serializer.DescriptorBasedComponentDataSerializer.DESCRIPTOR; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class FullPageDataSerializerTest + extends AbstractDataSerializerTest +{ + + private FullContentDataSerializer contentDataSerializer; + + private PageDescriptorService pageDescriptorService; + + private LayoutDescriptorService layoutDescriptorService; + + @BeforeEach + public void setUp() + { + this.pageDescriptorService = Mockito.mock( PageDescriptorService.class ); + this.layoutDescriptorService = Mockito.mock( LayoutDescriptorService.class ); + this.contentDataSerializer = FullContentDataSerializer.create() + .layoutDescriptorService( layoutDescriptorService ) + .pageDescriptorService( pageDescriptorService ) + .build(); + } + + @Test + public void testRegionsFetched() + { + final DescriptorKey pageDescriptorKey = DescriptorKey.from( "myapplication:my-page" ); + final RegionDescriptors regions = RegionDescriptors.create().add( RegionDescriptor.create().name( "main" ).build() ).build(); + final PageDescriptor pageDescriptor = PageDescriptor.create() + .key( pageDescriptorKey ) + .regions( regions ) + .config( Form.create().build() ) + .build(); + + Mockito.when( pageDescriptorService.getByKey( pageDescriptorKey ) ).thenReturn( pageDescriptor ); + + final PropertyTree newPropertyTree = new PropertyTree(); + final PropertySet contentAsData = newPropertyTree.getRoot(); + final PropertySet asSet = contentAsData.addSet( COMPONENTS ); + + asSet.setString( TYPE, PAGE ); + asSet.setString( PATH, ComponentPath.DIVIDER ); + + final PropertySet specialBlockSet = asSet.addSet( PAGE ); + specialBlockSet.addString( DESCRIPTOR, pageDescriptorKey.toString() ); + + final Page parsedPage = contentDataSerializer.fromPageData( contentAsData ); + + assertTrue( parsedPage.hasRegions() ); + assertNotNull( parsedPage.getRegions().getRegion( "main" ) ); + } +} diff --git a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentServiceTest.java b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentServiceTest.java index 1dc2d19e0e9..e59b02973e5 100644 --- a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentServiceTest.java +++ b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentServiceTest.java @@ -144,6 +144,8 @@ public abstract class AbstractContentServiceTest protected ContentServiceImpl contentService; + protected ContentConfig config; + protected NodeServiceImpl nodeService; protected MixinService mixinService; @@ -320,7 +322,8 @@ void setUpAbstractContentServiceTest() projectService.create( CreateProjectParams.create().name( testprojectName ).displayName( "test" ).build() ); - contentService = new ContentServiceImpl( nodeService, pageDescriptorService, partDescriptorService, layoutDescriptorService ); + this.config = mock( ContentConfig.class, invocation -> invocation.getMethod().getDefaultValue() ); + contentService = new ContentServiceImpl( nodeService, pageDescriptorService, partDescriptorService, layoutDescriptorService, config ); contentService.setEventPublisher( eventPublisher ); contentService.setMediaInfoService( mediaInfoService ); contentService.setSiteService( siteService ); @@ -334,8 +337,6 @@ void setUpAbstractContentServiceTest() contentService.addContentValidator( new SiteConfigsValidator( siteService ) ); contentService.addContentValidator( new OccurrenceValidator() ); contentService.addContentValidator( new ExtraDataValidator( xDataService ) ); - - contentService.initialize( mock( ContentConfig.class, invocation -> invocation.getMethod().getDefaultValue() ) ); } @AfterEach diff --git a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentSynchronizerTest.java b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentSynchronizerTest.java index 6ddc3a12a4d..a28a2448c33 100644 --- a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentSynchronizerTest.java +++ b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/AbstractContentSynchronizerTest.java @@ -254,7 +254,8 @@ private void setUpContentService() final ContentAuditLogSupportImpl contentAuditLogSupport = new ContentAuditLogSupportImpl( contentConfig, Runnable::run, auditLogService, contentAuditLogFilterService ); - contentService = new ContentServiceImpl( nodeService, pageDescriptorService, partDescriptorService, layoutDescriptorService ); + final ContentConfig config = mock( ContentConfig.class, invocation -> invocation.getMethod().getDefaultValue() ); + contentService = new ContentServiceImpl( nodeService, pageDescriptorService, partDescriptorService, layoutDescriptorService, config ); contentService.setEventPublisher( eventPublisher ); contentService.setMediaInfoService( mediaInfoService ); contentService.setSiteService( siteService ); @@ -263,7 +264,6 @@ private void setUpContentService() contentService.setFormDefaultValuesProcessor( ( form, data ) -> { } ); contentService.setContentAuditLogSupport( contentAuditLogSupport ); - contentService.initialize( mock( ContentConfig.class, invocation -> invocation.getMethod().getDefaultValue() ) ); } private void setupTaskService() diff --git a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_media.java b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_media.java index 660e483b2be..e2fc6dcdf2c 100644 --- a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_media.java +++ b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_media.java @@ -84,10 +84,8 @@ public void create_media_image_invalid_file_name_allowed_by_config() Mockito.when( this.xDataService.getFromContentType( Mockito.any( ContentType.class ) ) ).thenReturn( XDatas.empty() ); - final ContentConfig contentConfig = mock( ContentConfig.class ); - when( contentConfig.attachments_allowUnsafeNames() ).thenReturn( true ); + when( config.attachments_allowUnsafeNames() ).thenReturn( true ); - contentService.initialize( contentConfig ); final Content content = this.contentService.create( createMediaParams ); final Content storedContent = this.contentService.getById( content.getId() ); diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/postprocess/instruction/ComponentInstruction.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/postprocess/instruction/ComponentInstruction.java index 8ecf6a93da0..de8b201edbd 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/postprocess/instruction/ComponentInstruction.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/postprocess/instruction/ComponentInstruction.java @@ -87,7 +87,7 @@ private Component resolveComponent( final PortalRequest portalRequest, final Str { if ( FRAGMENT_COMPONENT.equalsIgnoreCase( componentSelector ) ) { - return resolveFragmentComponent( portalRequest ); + return getPageFragment( portalRequest ); } if ( componentSelector.startsWith( APPLICATION_COMPONENT_PREFIX ) ) @@ -138,33 +138,9 @@ private Component resolveComponent( final PortalRequest portalRequest, final Com throw new RenderException( MessageFormat.format( "Component not found: [{0}]", path ) ); } - if ( component instanceof LayoutComponent ) - { - return resolveLayoutWithRegions( (LayoutComponent) component, content.getPage() ); - } - return component; } - private LayoutComponent resolveLayoutWithRegions( final LayoutComponent existingLayout, final Page page ) - { - if ( !existingLayout.hasDescriptor() ) - { - return existingLayout; - } - - final LayoutComponent layoutFromDescriptor = (LayoutComponent) componentService.getByKey( existingLayout.getDescriptor() ); - - if ( layoutFromDescriptor == null ) - { - return existingLayout; - } - - final LayoutComponent layoutComponent = buildLayoutWithRegions( existingLayout, layoutFromDescriptor ); - setParentRegionOnLayout( page, existingLayout, layoutComponent ); - return layoutComponent; - } - private LayoutComponent buildLayoutWithRegions( final LayoutComponent existingLayout, final LayoutComponent layoutFromDescriptor ) { final LayoutComponent.Builder layoutBuilder = LayoutComponent.create( existingLayout ); @@ -217,22 +193,6 @@ private Component resolveComponentInFragment( final Content content, final Compo return component; } - private Component resolveFragmentComponent( final PortalRequest portalRequest ) - { - final Component fragmentComponent = getPageFragment( portalRequest ); - return processFragment( fragmentComponent ); - } - - private Component processFragment( final Component fragmentComponent ) - { - if ( fragmentComponent instanceof LayoutComponent ) - { - return resolveLayoutWithRegions( (LayoutComponent) fragmentComponent, null ); - } - - return fragmentComponent; - } - private Component getPageFragment( final PortalRequest portalRequest ) { final Content content = portalRequest.getContent(); diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/rendering/FragmentRenderer.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/rendering/FragmentRenderer.java index 217b68aa45e..6a1f71a8719 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/rendering/FragmentRenderer.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/rendering/FragmentRenderer.java @@ -17,6 +17,11 @@ import com.enonic.xp.portal.RenderMode; import com.enonic.xp.region.Component; import com.enonic.xp.region.FragmentComponent; +import com.enonic.xp.region.LayoutComponent; +import com.enonic.xp.region.LayoutDescriptor; +import com.enonic.xp.region.LayoutDescriptorService; +import com.enonic.xp.region.LayoutRegions; +import com.enonic.xp.region.Region; public final class FragmentRenderer { @@ -32,14 +37,18 @@ public final class FragmentRenderer private final ContentService contentService; + private final LayoutDescriptorService layoutDescriptorService; + private final RendererDelegate rendererDelegate; private final FragmentPageResolver fragmentPageResolver = new FragmentPageResolver(); - public FragmentRenderer( final ContentService contentService, final RendererDelegate rendererDelegate ) + public FragmentRenderer( final ContentService contentService, final LayoutDescriptorService layoutDescriptorService, + final RendererDelegate rendererDelegate ) { this.contentService = contentService; this.rendererDelegate = rendererDelegate; + this.layoutDescriptorService = layoutDescriptorService; } public PortalResponse render( final FragmentComponent component, final PortalRequest portalRequest ) @@ -106,23 +115,65 @@ private PortalResponse wrapFragmentForEditMode( final PortalResponse response, f private Component getFragmentComponent( final FragmentComponent component ) { - final Content fragmentContent; try { - fragmentContent = contentService.getById( component.getFragment() ); + final Content fragmentContent = contentService.getById( component.getFragment() ); + return getFragmentFromContent( fragmentContent ); } catch ( ContentNotFoundException e ) { return null; } + } + + private Component getFragmentFromContent( final Content fragmentContent ) + { if ( fragmentContent.getType().isFragment() || fragmentContent.getPage() != null ) { - return fragmentContent.getPage().getFragment(); + return processFragmentComponent( fragmentContent.getPage().getFragment() ); } - else + + return null; + } + + private Component processFragmentComponent( final Component fragmentComponent ) + { + if ( fragmentComponent instanceof LayoutComponent ) { - return null; + return processLayoutComponent( (LayoutComponent) fragmentComponent ); + } + + return fragmentComponent; + } + + private LayoutComponent processLayoutComponent( final LayoutComponent component ) + { + final LayoutDescriptor layoutDescriptor = + component.hasDescriptor() ? layoutDescriptorService.getByKey( component.getDescriptor() ) : null; + + if ( layoutDescriptor == null || layoutDescriptor.getModifiedTime() == null ) + { + return component; + } + + return buildLayoutWithRegions( component, layoutDescriptor ); + } + + private LayoutComponent buildLayoutWithRegions( final LayoutComponent existingLayout, final LayoutDescriptor layoutDescriptor ) + { + final LayoutComponent.Builder layoutBuilder = LayoutComponent.create( existingLayout ); + final LayoutRegions.Builder regionsBuilder = LayoutRegions.create(); + + if ( layoutDescriptor.getRegions() != null ) + { + layoutDescriptor.getRegions().forEach( region -> { + final Region existingRegion = existingLayout.getRegion( region.getName() ); + final Region regionToAdd = existingRegion == null ? Region.create().name( region.getName() ).build() : existingRegion; + regionsBuilder.add( regionToAdd ); + } ); } + + return layoutBuilder.regions( regionsBuilder.build() ).build(); } private PortalResponse renderEmptyFragment( final RenderMode renderMode, final FragmentComponent component ) @@ -136,10 +187,6 @@ private PortalResponse renderErrorComponentPlaceHolder( final FragmentComponent { final String escapedMessage = HtmlEscapers.htmlEscaper().escape( errorMessage ); final String html = MessageFormat.format( COMPONENT_PLACEHOLDER_ERROR_HTML, component.getType().toString(), escapedMessage ); - return PortalResponse.create(). - contentType( MediaType.HTML_UTF_8 ). - postProcess( false ). - body( html ). - build(); + return PortalResponse.create().contentType( MediaType.HTML_UTF_8 ).postProcess( false ).body( html ).build(); } } diff --git a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/rendering/RendererDelegateImpl.java b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/rendering/RendererDelegateImpl.java index 9663462bf0b..615a8eae255 100644 --- a/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/rendering/RendererDelegateImpl.java +++ b/modules/portal/portal-impl/src/main/java/com/enonic/xp/portal/impl/rendering/RendererDelegateImpl.java @@ -12,6 +12,7 @@ import com.enonic.xp.portal.PortalRequest; import com.enonic.xp.portal.PortalResponse; import com.enonic.xp.region.FragmentComponent; +import com.enonic.xp.region.LayoutDescriptorService; @Component public final class RendererDelegateImpl @@ -21,10 +22,14 @@ public final class RendererDelegateImpl private final ContentService contentService; + private final LayoutDescriptorService layoutDescriptorService; + @Activate - public RendererDelegateImpl( @Reference final ContentService contentService ) + public RendererDelegateImpl( @Reference final ContentService contentService, + @Reference final LayoutDescriptorService layoutDescriptorService ) { this.contentService = contentService; + this.layoutDescriptorService = layoutDescriptorService; } @Override @@ -32,7 +37,7 @@ public PortalResponse render( Object renderable, PortalRequest portalRequest ) { if ( renderable instanceof FragmentComponent ) { - return new FragmentRenderer( contentService, this ).render( (FragmentComponent) renderable, portalRequest ); + return new FragmentRenderer( contentService, layoutDescriptorService, this ).render( (FragmentComponent) renderable, portalRequest ); } return renderers.stream(). filter( r -> r.getType().isInstance( renderable ) ). diff --git a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/postprocess/instruction/ComponentInstructionTest.java b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/postprocess/instruction/ComponentInstructionTest.java index 20606e632a3..427da91315d 100644 --- a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/postprocess/instruction/ComponentInstructionTest.java +++ b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/postprocess/instruction/ComponentInstructionTest.java @@ -103,32 +103,6 @@ private void testLayoutIsReturned( final LayoutComponent layoutComponent ) assertEquals( captor.getValue(), layoutComponent ); } - @Test - public void testLayoutIsReturnedWithRegions() - throws Exception - { - final ArgumentCaptor captor = ArgumentCaptor.forClass( Component.class ); - returnOnRender( "render result", captor.capture() ); - - final DescriptorKey layoutDescriptorKey = DescriptorKey.from( "myapplication:layout" ); - final LayoutRegions regions = - LayoutRegions.create().add( Region.create().name( "r1" ).build() ).add( Region.create().name( "r2" ).build() ).build(); - final LayoutComponent layoutFromService = LayoutComponent.create().descriptor( layoutDescriptorKey ).regions( regions ).build(); - - when( componentService.getByKey( Mockito.any( DescriptorKey.class) ) ).thenReturn( layoutFromService ); - - final PortalRequest portalRequest = new PortalRequest(); - final LayoutComponent emptyLayoutComponent = - LayoutComponent.create().descriptor( DescriptorKey.from( "myapplication:layout" ) ).build(); - - final Content content = createPage( "content-id", "content-name", "myapplication:content-type", emptyLayoutComponent ); - portalRequest.setContent( content ); - - instruction.evaluate( portalRequest, "COMPONENT myRegion/0" ); - - assertEquals( captor.getValue(), layoutFromService ); - } - @Test public void testFragmentContentNotLayoutThrowsException() { diff --git a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/rendering/RendererDelegateImplTest.java b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/rendering/RendererDelegateImplTest.java index 0d46c98ea1f..cdbf09bf9c1 100644 --- a/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/rendering/RendererDelegateImplTest.java +++ b/modules/portal/portal-impl/src/test/java/com/enonic/xp/portal/impl/rendering/RendererDelegateImplTest.java @@ -8,6 +8,7 @@ import com.enonic.xp.page.PageTemplate; import com.enonic.xp.portal.PortalRequest; import com.enonic.xp.portal.PortalResponse; +import com.enonic.xp.region.LayoutDescriptorService; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -18,7 +19,7 @@ public class RendererDelegateImplTest @Test public void given_Renderable_matching_only_on_superType_when_getRenderer_then_Renderer_for_superType_is_returned() { - RendererDelegateImpl factory = new RendererDelegateImpl( mock( ContentService.class ) ); + RendererDelegateImpl factory = new RendererDelegateImpl( mock( ContentService.class ), mock( LayoutDescriptorService.class ) ); final PortalResponse response = PortalResponse.create().build(); factory.addRenderer( createRenderer( Content.class, response ) ); @@ -32,7 +33,7 @@ public void given_Renderable_matching_only_on_superType_when_getRenderer_then_Re @Test public void given_Renderable_having_not_matching_Renderer_when_getRenderer_then_Renderer_for_that_type_is_returned() { - RendererDelegateImpl factory = new RendererDelegateImpl( mock( ContentService.class ) ); + RendererDelegateImpl factory = new RendererDelegateImpl( mock( ContentService.class ), mock( LayoutDescriptorService.class ) ); final PortalResponse response = PortalResponse.create().build(); factory.addRenderer( createRenderer( Content.class, response ) ); @@ -46,7 +47,7 @@ public void given_Renderable_having_not_matching_Renderer_when_getRenderer_then_ @Test public void given_Renderable_matching_no_given_type_when_getRenderer_then_Renderer_for_that_type_is_returned() { - RendererDelegateImpl factory = new RendererDelegateImpl( mock( ContentService.class ) ); + RendererDelegateImpl factory = new RendererDelegateImpl( mock( ContentService.class ), mock( LayoutDescriptorService.class ) ); factory.addRenderer( createRenderer( RendererDelegateImplTest.class, null ) ); // exercise