Skip to content

Commit

Permalink
Page resolving: add flag to resolve empty regions in Content API #10209
Browse files Browse the repository at this point in the history
- Introduced xp.content config variable resolveEmptyRegions (set to 'false' by default) that
allows to switch between previous content page resolving behavior that forces injection of all descriptor's regions into page/layout and new one where content's page object is returned as it is
- Updated core-content classes to read config variable and build page object according to it
- Updated portal-impl classes to read descriptor and inject empty regions into page if it is not being made by content api, and not to read and inject regions if it is done by content api
  • Loading branch information
ashklianko committed Jul 20, 2023
1 parent d739f41 commit 36cd89a
Show file tree
Hide file tree
Showing 35 changed files with 574 additions and 351 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -35,6 +38,12 @@ class AbstractCreatingOrUpdatingContentCommand

final List<ContentValidator> contentValidators;

protected final PageDescriptorService pageDescriptorService;

protected final PartDescriptorService partDescriptorService;

protected final LayoutDescriptorService layoutDescriptorService;

final boolean allowUnsafeAttachmentNames;

AbstractCreatingOrUpdatingContentCommand( final Builder<?> builder )
Expand All @@ -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<B extends Builder<B>>
Expand All @@ -60,6 +72,12 @@ public static class Builder<B extends Builder<B>>

private boolean allowUnsafeAttachmentNames;

private PageDescriptorService pageDescriptorService;

private PartDescriptorService partDescriptorService;

private LayoutDescriptorService layoutDescriptorService;

Builder()
{
}
Expand All @@ -71,6 +89,9 @@ public static class Builder<B extends Builder<B>>
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")
Expand Down Expand Up @@ -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()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@

boolean attachments_allowUnsafeNames() default false;

boolean resolveEmptyRegions() default false;

String auditlog_filter() default "!system.content.update,*";
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 )
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 )
Expand All @@ -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<Property> extraDataDependencies = content.hasExtraData() ? content.getAllExtraData().
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -322,12 +311,6 @@ static class Builder

private FormDefaultValuesProcessor formDefaultValuesProcessor;

private PageDescriptorService pageDescriptorService;

private PartDescriptorService partDescriptorService;

private LayoutDescriptorService layoutDescriptorService;

private Builder()
{
}
Expand Down Expand Up @@ -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()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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()
Expand Down Expand Up @@ -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 ).
Expand Down Expand Up @@ -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;
Expand All @@ -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()
{
Expand Down
Loading

0 comments on commit 36cd89a

Please sign in to comment.