From 162ffbf5ef26e935d4c352eb24549eef46742545 Mon Sep 17 00:00:00 2001 From: rymsha Date: Fri, 9 Dec 2022 18:37:18 +0100 Subject: [PATCH 01/11] save --- .../com/enonic/xp/content/ContentService.java | 1 + .../main/java/com/enonic/xp/node/Node.java | 12 +-- .../java/com/enonic/xp/node/NodeService.java | 1 + .../impl/content/ContentVersionFactory.java | 7 +- .../GetContentByPathAndVersionIdCommand.java | 1 + .../branch/storage/BranchServiceImpl.java | 21 +++-- .../repo/impl/branch/storage/NodeFactory.java | 41 +++------ .../xp/repo/impl/dump/DumpServiceImpl.java | 1 - .../impl/node/AbstractGetBinaryCommand.java | 49 ++--------- .../node/ApplyNodePermissionsCommand.java | 3 +- .../impl/node/GetBinaryByVersionCommand.java | 13 ++- .../xp/repo/impl/node/GetBinaryCommand.java | 18 +--- .../node/GetNodeByIdAndVersionIdCommand.java | 10 ++- .../GetNodeByPathAndVersionIdCommand.java | 9 +- .../impl/node/NodePermissionsResolver.java | 13 ++- .../impl/node/SetActiveVersionCommand.java | 25 ++++-- .../repository/RepositoryServiceImpl.java | 1 - .../repo/impl/storage/NodeStorageService.java | 6 +- .../impl/storage/NodeStorageServiceImpl.java | 86 ++++++------------- .../repo/impl/node/GetBinaryCommandTest.java | 30 ------- .../storage/NodeStorageServiceImplTest.java | 6 +- 21 files changed, 109 insertions(+), 245 deletions(-) diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/content/ContentService.java b/modules/core/core-api/src/main/java/com/enonic/xp/content/ContentService.java index 6abd97c90d2..ae3fd971298 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/content/ContentService.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/content/ContentService.java @@ -137,6 +137,7 @@ public interface ContentService Content getByIdAndVersionId( ContentId contentId, ContentVersionId versionId ); + @Deprecated Content getByPathAndVersionId( ContentPath contentPath, ContentVersionId versionId ); ImportContentResult importContent( ImportContentParams params ); diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/Node.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/Node.java index f24ff3cc139..6218fdf67c7 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/node/Node.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/Node.java @@ -83,16 +83,8 @@ else if ( builder.parentPath != null && builder.name != null ) this.path = null; } - if ( builder.indexConfigDocument != null ) - { - this.indexConfigDocument = builder.indexConfigDocument; - } - else - { - this.indexConfigDocument = PatternIndexConfigDocument.create(). - defaultConfig( IndexConfig.BY_TYPE ). - build(); - } + this.indexConfigDocument = Objects.requireNonNullElseGet( builder.indexConfigDocument, PatternIndexConfigDocument.create() + .defaultConfig( IndexConfig.BY_TYPE )::build ); } public boolean isRoot() diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java index 7a8cef39883..19fcbe4c81e 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java @@ -35,6 +35,7 @@ public interface NodeService Node getByPath( NodePath path ); + @Deprecated Node getByPathAndVersionId( NodePath path, NodeVersionId versionId ); Nodes getByPaths( NodePaths paths ); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentVersionFactory.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentVersionFactory.java index 622c800eaa4..5f75404eac4 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentVersionFactory.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentVersionFactory.java @@ -50,7 +50,7 @@ public ContentVersions create( final NodeId nodeId, final NodeVersionsMetadata n public ContentVersion create( final NodeVersionMetadata nodeVersionMetadata ) { - final NodeVersion nodeVersion = getNodeVersion( nodeVersionMetadata ); + final NodeVersion nodeVersion = nodeService.getByNodeVersionKey( nodeVersionMetadata.getNodeVersionKey() ); return doCreateContentVersion( nodeVersionMetadata, nodeVersion ); } @@ -148,9 +148,4 @@ private ContentVersionPublishInfo.CommitType getType( final NodeCommitEntry node return ContentVersionPublishInfo.CommitType.CUSTOM; } - private NodeVersion getNodeVersion( final NodeVersionMetadata nodeVersionMetadata ) - { - return nodeService.getByNodeVersionKey( nodeVersionMetadata.getNodeVersionKey() ); - } - } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByPathAndVersionIdCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByPathAndVersionIdCommand.java index 05a92f1f21e..8323ab95c07 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByPathAndVersionIdCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByPathAndVersionIdCommand.java @@ -12,6 +12,7 @@ import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeVersionId; +@Deprecated public class GetContentByPathAndVersionIdCommand extends AbstractContentCommand { diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchServiceImpl.java index 1b48db62df0..81e9268f07e 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchServiceImpl.java @@ -60,17 +60,6 @@ public class BranchServiceImpl @Override public String store( final NodeBranchEntry nodeBranchEntry, final InternalContext context ) { - return store( nodeBranchEntry, null, context ); - } - - @Override - public String store( final NodeBranchEntry nodeBranchEntry, final NodePath previousPath, final InternalContext context ) - { - if ( previousPath != null && !previousPath.equals( nodeBranchEntry.getNodePath() ) ) - { - this.pathCache.evict( createPath( previousPath, context ) ); - } - if ( context.isSkipConstraints() ) { return doStore( nodeBranchEntry, context ); @@ -92,6 +81,16 @@ public String store( final NodeBranchEntry nodeBranchEntry, final NodePath previ } } + @Override + public String store( final NodeBranchEntry nodeBranchEntry, final NodePath previousPath, final InternalContext context ) + { + if ( previousPath != null && !previousPath.equals( nodeBranchEntry.getNodePath() ) ) + { + this.pathCache.evict( createPath( previousPath, context ) ); + } + return store( nodeBranchEntry, context ); + } + private String doStore( final NodeBranchEntry nodeBranchEntry, final InternalContext context ) { final String id = this.storageDao.store( BranchStorageRequestFactory.create( nodeBranchEntry, context ) ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/NodeFactory.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/NodeFactory.java index de8ef6e7fe2..c3a222bfcd9 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/NodeFactory.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/NodeFactory.java @@ -10,46 +10,25 @@ public class NodeFactory { public static Node create( final NodeVersion nodeVersion, final NodeBranchEntry nodeBranchEntry ) { - if ( nodeBranchEntry.getNodeId().equals( Node.ROOT_UUID ) ) + final Node.Builder builder = + Node.create( nodeVersion ).nodeVersionId( nodeBranchEntry.getVersionId() ).timestamp( nodeBranchEntry.getTimestamp() ); + if ( !Node.ROOT_UUID.equals( nodeVersion.getId() ) ) { - return Node.createRoot(). - nodeType( nodeVersion.getNodeType() ). - nodeVersionId( nodeBranchEntry.getVersionId() ). - timestamp( nodeBranchEntry.getTimestamp() ). - permissions( nodeVersion.getPermissions() ). - nodeState( nodeBranchEntry.getNodeState() ). - childOrder( nodeVersion.getChildOrder() ). - manualOrderValue( nodeVersion.getManualOrderValue() ). - data( nodeVersion.getData() ). - attachedBinaries( nodeVersion.getAttachedBinaries() ). - indexConfigDocument( nodeVersion.getIndexConfigDocument() ). - build(); + builder.parentPath( nodeBranchEntry.getNodePath().getParentPath() ).name( nodeBranchEntry.getNodePath().getName() ); } - - return Node.create( nodeVersion ). - parentPath( nodeBranchEntry.getNodePath().getParentPath() ). - name( nodeBranchEntry.getNodePath().getLastElement().toString() ). - timestamp( nodeBranchEntry.getTimestamp() ). - nodeState( nodeBranchEntry.getNodeState() ). - nodeVersionId( nodeBranchEntry.getVersionId() ). - build(); + return builder.build(); } public static Node create( final NodeVersion nodeVersion, final NodeVersionMetadata nodeVersionMetadata ) { - final Node.Builder builder = Node.create( nodeVersion ). - nodeVersionId( nodeVersionMetadata.getNodeVersionId() ). - parentPath( nodeVersionMetadata.getNodePath().getParentPath() ). - timestamp( nodeVersionMetadata.getTimestamp() ); + final Node.Builder builder = Node.create( nodeVersion ) + .nodeVersionId( nodeVersionMetadata.getNodeVersionId() ) + .timestamp( nodeVersionMetadata.getTimestamp() ); - if ( Node.ROOT_UUID.equals( nodeVersionMetadata.getNodeId() ) ) + if ( !Node.ROOT_UUID.equals( nodeVersion.getId() ) ) { - builder.inheritPermissions( false ); - } else { - builder.name( nodeVersionMetadata.getNodePath().getName() ); + builder.parentPath( nodeVersionMetadata.getNodePath().getParentPath() ).name( nodeVersionMetadata.getNodePath().getName() ); } - return builder.build(); } - } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/DumpServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/DumpServiceImpl.java index c7805caec4b..e64676c477e 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/DumpServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/dump/DumpServiceImpl.java @@ -450,7 +450,6 @@ private void createRootNode( final RepositoryId repositoryId ) this.nodeStorageService.store( Node.createRoot(). permissions( RepositoryConstants.DEFAULT_REPO_PERMISSIONS ). - inheritPermissions( false ). childOrder( RepositoryConstants.DEFAULT_CHILD_ORDER ). build(), rootNodeInternalContext ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/AbstractGetBinaryCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/AbstractGetBinaryCommand.java index ad80e7632f2..65de1b0e039 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/AbstractGetBinaryCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/AbstractGetBinaryCommand.java @@ -4,35 +4,27 @@ import com.google.common.io.ByteSource; import com.enonic.xp.context.ContextAccessor; -import com.enonic.xp.data.PropertyPath; import com.enonic.xp.node.AttachedBinaries; import com.enonic.xp.node.AttachedBinary; -import com.enonic.xp.node.Node; import com.enonic.xp.repo.impl.binary.BinaryService; -import com.enonic.xp.repository.RepositoryId; import com.enonic.xp.util.BinaryReference; abstract class AbstractGetBinaryCommand extends AbstractNodeCommand { - protected final BinaryReference binaryReference; + private final BinaryReference binaryReference; - protected final BinaryService binaryService; - - private final PropertyPath propertyPath; + private final BinaryService binaryService; AbstractGetBinaryCommand( final Builder builder ) { super( builder ); this.binaryReference = builder.binaryReference; - this.propertyPath = builder.propertyPath; this.binaryService = builder.binaryService; } - ByteSource getByBinaryReference( final Node node ) + ByteSource getByBinaryReference( final AttachedBinaries attachedBinaries ) { - final AttachedBinaries attachedBinaries = node.getAttachedBinaries(); - if ( attachedBinaries == null ) { return null; @@ -45,27 +37,7 @@ ByteSource getByBinaryReference( final Node node ) return null; } - return doGetByteSource( attachedBinary ); - } - - ByteSource getByPropertyPath( final Node node ) - { - final BinaryReference binaryReference = node.data().getBinaryReference( this.propertyPath ); - - if ( binaryReference == null ) - { - return null; - } - - final AttachedBinary attachedBinary = node.getAttachedBinaries().getByBinaryReference( binaryReference ); - - return doGetByteSource( attachedBinary ); - } - - private ByteSource doGetByteSource( final AttachedBinary attachedBinary ) - { - final RepositoryId repositoryId = ContextAccessor.current().getRepositoryId(); - return this.binaryService.get( repositoryId, attachedBinary ); + return this.binaryService.get( ContextAccessor.current().getRepositoryId(), attachedBinary ); } public static class Builder @@ -75,8 +47,6 @@ public static class Builder private BinaryService binaryService; - private PropertyPath propertyPath; - protected Builder() { } @@ -98,16 +68,7 @@ public B binaryService( final BinaryService val ) @Override void validate() { Preconditions.checkNotNull( binaryService, "binaryBlobStore not set" ); - Preconditions.checkArgument( propertyPath != null || binaryReference != null, - "Either propertyPath or binaryReference must be set" ); - } - - @SuppressWarnings("unchecked") - B propertyPath( final PropertyPath val ) - { - propertyPath = val; - return (B) this; + Preconditions.checkNotNull( binaryReference, "binaryReference must be set" ); } - } } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/ApplyNodePermissionsCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/ApplyNodePermissionsCommand.java index a452816ce3f..e3c79350541 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/ApplyNodePermissionsCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/ApplyNodePermissionsCommand.java @@ -22,7 +22,6 @@ import com.enonic.xp.security.acl.Permission; import static com.enonic.xp.repo.impl.node.NodeConstants.CLOCK; -import static com.enonic.xp.repo.impl.node.NodePermissionsResolver.contextUserHasPermissionOrAdmin; final class ApplyNodePermissionsCommand extends AbstractNodeCommand @@ -67,7 +66,7 @@ public ApplyNodePermissionsResult execute() private void applyPermissions( final AccessControlList permissions, final Node node ) { - if ( contextUserHasPermissionOrAdmin( Permission.WRITE_PERMISSIONS, node ) ) + if ( NodePermissionsResolver.contextUserHasPermissionOrAdmin( Permission.WRITE_PERMISSIONS, node.getPermissions() ) ) { final Node childApplied = storePermissions( permissions, node ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetBinaryByVersionCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetBinaryByVersionCommand.java index 26ffec4847b..c59b8cfe073 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetBinaryByVersionCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetBinaryByVersionCommand.java @@ -26,23 +26,20 @@ private GetBinaryByVersionCommand( final Builder builder ) public ByteSource execute() { - final Node node = this.nodeStorageService.get( nodeId, nodeVersionId, InternalContext.from( ContextAccessor.current() ) ); + final Node node = this.nodeStorageService.get( nodeVersionId, InternalContext.from( ContextAccessor.current() ) ); if ( node == null ) { throw new NodeNotFoundException( "Cannot get binary reference, node with versionId: " + this.nodeVersionId + " not found" ); } - if ( binaryReference != null ) + if ( !node.id().equals( nodeId ) ) { - return getByBinaryReference( node ); + throw new NodeNotFoundException( "NodeVersionId [" + nodeVersionId + "] not a version of Node with id [" + nodeId + "]" ); } - else - { - return getByPropertyPath( node ); - } - } + return getByBinaryReference( node.getAttachedBinaries() ); + } public static GetBinaryByVersionCommand.Builder create() { diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetBinaryCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetBinaryCommand.java index 283a51bf0a2..d05606464da 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetBinaryCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetBinaryCommand.java @@ -3,12 +3,9 @@ import com.google.common.base.Preconditions; import com.google.common.io.ByteSource; -import com.enonic.xp.data.PropertyPath; import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeNotFoundException; -import com.enonic.xp.repo.impl.binary.BinaryService; -import com.enonic.xp.util.BinaryReference; public class GetBinaryCommand extends AbstractGetBinaryCommand @@ -30,14 +27,7 @@ public ByteSource execute() throw new NodeNotFoundException( "Cannot get binary reference, node with id: " + this.nodeId + " not found" ); } - if ( binaryReference != null ) - { - return getByBinaryReference( node ); - } - else - { - return getByPropertyPath( node ); - } + return getByBinaryReference( node.getAttachedBinaries() ); } public static Builder create() @@ -48,14 +38,8 @@ public static Builder create() public static class Builder extends AbstractGetBinaryCommand.Builder { - private BinaryReference binaryReference; - - private PropertyPath propertyPath; - private NodeId nodeId; - private BinaryService binaryService; - public Builder nodeId( final NodeId nodeId ) { this.nodeId = nodeId; diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeByIdAndVersionIdCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeByIdAndVersionIdCommand.java index d1944b0f5b2..43ec5f87313 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeByIdAndVersionIdCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeByIdAndVersionIdCommand.java @@ -2,7 +2,6 @@ import com.google.common.base.Preconditions; -import com.enonic.xp.context.Context; import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeId; @@ -26,9 +25,14 @@ private GetNodeByIdAndVersionIdCommand( final Builder builder ) public Node execute() { - final Context context = ContextAccessor.current(); + final Node node = this.nodeStorageService.get( versionId, InternalContext.from( ContextAccessor.current() ) ); - return this.nodeStorageService.getNode( nodeId, versionId, InternalContext.from( context ) ); + if ( node == null || !node.id().equals( nodeId ) ) + { + return null; + } + + return node; } public static Builder create() diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeByPathAndVersionIdCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeByPathAndVersionIdCommand.java index 3a2a3880c8c..8a1b1bfdb03 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeByPathAndVersionIdCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/GetNodeByPathAndVersionIdCommand.java @@ -9,6 +9,7 @@ import com.enonic.xp.node.NodeVersionId; import com.enonic.xp.repo.impl.InternalContext; +@Deprecated public class GetNodeByPathAndVersionIdCommand extends AbstractNodeCommand { @@ -36,7 +37,13 @@ public Node execute() return null; } - return this.nodeStorageService.getNode( nodeBranchEntry.getNodeId(), versionId, context ); + final Node node = this.nodeStorageService.get( versionId, context ); + + if ( node == null || !node.id().equals( nodeBranchEntry.getNodeId() ) ) + { + return null; + } + return node; } public static Builder create() diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodePermissionsResolver.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodePermissionsResolver.java index 0be6328269a..c5a90f80ae8 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodePermissionsResolver.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodePermissionsResolver.java @@ -40,15 +40,14 @@ private static void doRequireContextUserPermission( final AuthenticationInfo aut } } - public static boolean contextUserHasPermissionOrAdmin( final Permission permission, final Node node ) + public static boolean contextUserHasPermissionOrAdmin( final Permission permission, final AccessControlList nodePermissions ) { final AuthenticationInfo authInfo = ContextAccessor.current().getAuthInfo(); - return authInfo.getPrincipals().contains( RoleKeys.ADMIN ) || userHasPermission( authInfo, permission, node ); - } - - private static boolean userHasPermission( final AuthenticationInfo authInfo, final Permission permission, final Node node ) - { - return doUserHasPermission( authInfo, permission, node.getPermissions() ); + if ( authInfo.getPrincipals().contains( RoleKeys.ADMIN ) ) + { + return true; + } + return doUserHasPermission( authInfo, permission, nodePermissions ); } public static boolean userHasPermission( final AuthenticationInfo authInfo, final Permission permission, diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/SetActiveVersionCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/SetActiveVersionCommand.java index 7e47950379f..f6f328b7483 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/SetActiveVersionCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/SetActiveVersionCommand.java @@ -2,17 +2,18 @@ import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.Node; +import com.enonic.xp.node.NodeAccessException; +import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeNotFoundException; import com.enonic.xp.node.NodeVersionId; import com.enonic.xp.repo.impl.InternalContext; import com.enonic.xp.security.acl.Permission; +import com.enonic.xp.security.auth.AuthenticationInfo; public class SetActiveVersionCommand extends AbstractNodeCommand { - private static final Permission REQUIRED_PERMISSION = Permission.MODIFY; - private final NodeId nodeId; private final NodeVersionId nodeVersionId; @@ -33,7 +34,7 @@ public NodeVersionId execute() { final InternalContext context = InternalContext.from( ContextAccessor.current() ); - final Node node = this.nodeStorageService.get(nodeId, nodeVersionId, context ); + final Node node = this.nodeStorageService.get( nodeVersionId, context ); if ( node == null ) { @@ -46,9 +47,23 @@ public NodeVersionId execute() throw new NodeNotFoundException( "NodeVersionId [" + nodeVersionId + "] not a version of Node with id [" + nodeId + "]" ); } - NodePermissionsResolver.requireContextUserPermissionOrAdmin( REQUIRED_PERMISSION, node ); + final NodeBranchEntry nodeBranchEntry = this.nodeStorageService.getBranchNodeVersion( nodeId, context ); + + final AuthenticationInfo authInfo = ContextAccessor.current().getAuthInfo(); + + final boolean hasPermission = NodePermissionsResolver.userHasPermission( authInfo, Permission.MODIFY, node.getPermissions() ); + + if ( !hasPermission ) + { + throw new NodeAccessException( authInfo.getUser(), nodeBranchEntry.getNodePath(), Permission.MODIFY ); + } + + final Node updatedNode = Node.create( node ) + .parentPath( nodeBranchEntry.getNodePath().getParentPath() ) + .name( nodeBranchEntry.getNodePath().getName() ) + .build(); - this.nodeStorageService.updateVersion( node, nodeVersionId, context ); + this.nodeStorageService.updateVersion( updatedNode, context ); return nodeVersionId; } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/repository/RepositoryServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/repository/RepositoryServiceImpl.java index fabec13ee19..c4c3051d3ef 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/repository/RepositoryServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/repository/RepositoryServiceImpl.java @@ -370,7 +370,6 @@ private void createRootNode( final CreateRepositoryParams params ) final Node rootNode = this.nodeStorageService.store( Node.createRoot() .permissions( params.getRootPermissions() ) - .inheritPermissions( false ) .childOrder( params.getRootChildOrder() ) .build(), rootNodeInternalContext ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java index eb6ae0da8a5..af2928967f4 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java @@ -37,7 +37,7 @@ public interface NodeStorageService void delete( Collection nodeBranchEntries, InternalContext context ); - void updateVersion( Node node, NodeVersionId nodeVersionId, InternalContext context ); + void updateVersion( Node node, InternalContext context ); void push( Node node, Branch target, InternalContext context ); @@ -53,7 +53,7 @@ public interface NodeStorageService Nodes get( NodePaths nodePaths, InternalContext context ); - Node get( NodeId nodeId, NodeVersionId nodeVersionId, InternalContext context ); + Node get( NodeVersionId nodeVersionId, InternalContext context ); NodeVersion getNodeVersion( NodeVersionKey nodeVersionKey, InternalContext context ); @@ -76,6 +76,4 @@ public interface NodeStorageService void handleNodeMoved( NodeMovedParams params, InternalContext context ); void handleNodePushed( NodeId nodeId, NodePath nodePath, NodePath currentTargetPath, InternalContext nodeContext ); - - Node getNode( NodeId nodeId, NodeVersionId nodeVersionId, InternalContext context ); } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java index 24cdd9f533d..53d585a2908 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java @@ -170,19 +170,18 @@ public void delete( final Collection entries, final InternalCon } @Override - public void updateVersion( final Node node, final NodeVersionId nodeVersionId, final InternalContext context ) + public void updateVersion( final Node node, final InternalContext context ) { //TODO Check - final NodeVersionMetadata nodeVersionMetadata = this.versionService.getVersion( nodeVersionId, context ); + final NodeVersionMetadata nodeVersionMetadata = this.versionService.getVersion( node.getNodeVersionId(), context ); if ( nodeVersionMetadata == null ) { - throw new NodeNotFoundException( "Cannot find node version with id: " + nodeVersionId ); + throw new NodeNotFoundException( "Cannot find node version with id: " + node.getNodeVersionId() ); } - this.branchService.store( NodeBranchEntry.create(). - nodeVersionId( nodeVersionId ). - nodeVersionKey( nodeVersionMetadata.getNodeVersionKey() ). + this.branchService.store( + NodeBranchEntry.create().nodeVersionId( node.getNodeVersionId() ).nodeVersionKey( nodeVersionMetadata.getNodeVersionKey() ). nodeId( node.id() ). timestamp( node.getTimestamp() ). nodePath( node.path() ). @@ -254,7 +253,14 @@ public Node get( final NodeId nodeId, final InternalContext context ) { final NodeBranchEntry nodeBranchEntry = this.branchService.get( nodeId, context ); - return doGetNode( nodeBranchEntry, context ); + if ( nodeBranchEntry == null ) + { + return null; + } + + final NodeVersion nodeVersion = nodeVersionService.get( nodeBranchEntry.getNodeVersionKey(), context ); + + return canRead( nodeVersion.getPermissions() ) ? NodeFactory.create( nodeVersion, nodeBranchEntry ) : null; } @Override @@ -262,7 +268,14 @@ public Node get( final NodePath nodePath, final InternalContext context ) { final NodeBranchEntry nodeBranchEntry = this.branchService.get( nodePath, context ); - return doGetNode( nodeBranchEntry, context ); + if ( nodeBranchEntry == null ) + { + return null; + } + + final NodeVersion nodeVersion = nodeVersionService.get( nodeBranchEntry.getNodeVersionKey(), context ); + + return canRead( nodeVersion.getPermissions() ) ? NodeFactory.create( nodeVersion, nodeBranchEntry ) : null; } @Override @@ -286,9 +299,9 @@ public Nodes get( final NodePaths nodePaths, final InternalContext context ) } @Override - public Node get( final NodeId nodeId, final NodeVersionId nodeVersionId, final InternalContext context ) + public Node get( final NodeVersionId nodeVersionId, final InternalContext context ) { - final NodeVersionMetadata nodeVersionMetadata = versionService.getVersion( nodeVersionId, context ); + final NodeVersionMetadata nodeVersionMetadata = versionService.getVersion( nodeVersionId, context ); if ( nodeVersionMetadata == null ) { @@ -297,19 +310,12 @@ public Node get( final NodeId nodeId, final NodeVersionId nodeVersionId, final I final NodeVersion nodeVersion = nodeVersionService.get( nodeVersionMetadata.getNodeVersionKey(), context ); - if ( nodeVersion == null ) + if ( nodeVersion == null || !canRead( nodeVersion.getPermissions() ) ) { return null; } - final NodeBranchEntry nodeBranchEntry = branchService.get( nodeVersionMetadata.getNodeId(), context ); - - if ( nodeBranchEntry == null ) - { - return null; - } - - return constructNode( nodeBranchEntry, nodeVersion ); + return NodeFactory.create( nodeVersion, nodeVersionMetadata ); } @Override @@ -387,48 +393,6 @@ public void handleNodePushed( final NodeId nodeId, final NodePath nodePath, fina } } - @Override - public Node getNode( final NodeId nodeId, final NodeVersionId nodeVersionId, final InternalContext context ) - { - final NodeVersionMetadata nodeVersionMetadata = versionService.getVersion( nodeVersionId, context ); - - if ( nodeVersionMetadata == null ) - { - return null; - } - - final NodeVersion nodeVersion = nodeVersionService.get( nodeVersionMetadata.getNodeVersionKey(), context ); - - if ( nodeVersion == null ) - { - return null; - } - - return constructNode( nodeVersion, nodeVersionMetadata ); - } - - private Node doGetNode( final NodeBranchEntry nodeBranchEntry, final InternalContext context ) - { - if ( nodeBranchEntry == null ) - { - return null; - } - - final NodeVersion nodeVersion = nodeVersionService.get( nodeBranchEntry.getNodeVersionKey(), context ); - - return constructNode( nodeBranchEntry, nodeVersion ); - } - - private Node constructNode( final NodeBranchEntry nodeBranchEntry, final NodeVersion nodeVersion ) - { - return canRead( nodeVersion.getPermissions() ) ? NodeFactory.create( nodeVersion, nodeBranchEntry ) : null; - } - - private Node constructNode( final NodeVersion nodeVersion, final NodeVersionMetadata nodeVersionMetadata ) - { - return canRead( nodeVersion.getPermissions() ) ? NodeFactory.create( nodeVersion, nodeVersionMetadata ) : null; - } - private BlobKeys getBinaryBlobKeys( final AttachedBinaries attachedBinaries ) { final BlobKeys.Builder blobKeys = BlobKeys.create(); diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/GetBinaryCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/GetBinaryCommandTest.java index 0975699fe59..8190bf5ff0d 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/GetBinaryCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/GetBinaryCommandTest.java @@ -5,7 +5,6 @@ import com.google.common.io.ByteSource; -import com.enonic.xp.data.PropertyPath; import com.enonic.xp.data.PropertyTree; import com.enonic.xp.node.CreateNodeParams; import com.enonic.xp.node.Node; @@ -52,33 +51,4 @@ public void get_by_reference() assertNotNull( myImage ); } - - @Test - public void get_by_propertyPath() - throws Exception - { - final PropertyTree data = new PropertyTree(); - final BinaryReference imageRef = BinaryReference.from( "myImage" ); - - data.addBinaryReferences( "myBinary", imageRef ); - - final Node node = createNode( CreateNodeParams.create(). - name( "my-node" ). - parent( NodePath.ROOT ). - data( data ). - attachBinary( imageRef, ByteSource.wrap( "thisIsMyImage".getBytes() ) ). - build() ); - - final ByteSource myImage = GetBinaryCommand.create(). - nodeId( node.id() ). - propertyPath( PropertyPath.from( "myBinary" ) ). - indexServiceInternal( this.indexServiceInternal ). - binaryService( this.binaryService ). - storageService( this.storageService ). - searchService( this.searchService ). - build(). - execute(); - - assertNotNull( myImage ); - } } diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImplTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImplTest.java index 103820370e4..94d07e53050 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImplTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImplTest.java @@ -96,7 +96,7 @@ public void testGetNode() thenReturn( nodeVersionMetadata ); when( nodeVersionService.get( any( NodeVersionKey.class ), any( InternalContext.class ) ) ).thenReturn( nodeVersion ); - final Node result = instance.getNode( nodeId, nodeVersionId, context ); + final Node result = instance.get( nodeVersionId, context ); assertNotNull( result ); @@ -113,7 +113,7 @@ public void testGetNode_NodeVersionMetadataNotFound() when( versionService.getVersion( any( NodeVersionId.class ), any( InternalContext.class ) ) ). thenReturn( null ); - final Node result = instance.getNode( nodeId, nodeVersionId, context ); + final Node result = instance.get( nodeVersionId, context ); assertNull( result ); @@ -132,7 +132,7 @@ public void testGetNode_NodeVersionNotFound() when( nodeVersionService.get( any( NodeVersionKey.class ), any( InternalContext.class ) ) ).thenReturn( null ); - final Node result = instance.getNode( nodeId, nodeVersionId, context ); + final Node result = instance.get( nodeVersionId, context ); assertNull( result ); From b98142e64293441a6091f7b1148e87437d57b020 Mon Sep 17 00:00:00 2001 From: rymsha Date: Mon, 12 Dec 2022 11:35:30 +0100 Subject: [PATCH 02/11] save --- .../core/impl/content/ContentServiceImpl.java | 4 +- .../impl/content/CreateContentCommand.java | 2 +- .../impl/content/DuplicateContentCommand.java | 2 +- .../content/FindContentVersionsCommand.java | 3 + .../impl/content/ImportContentCommand.java | 2 +- .../core/impl/content/MoveContentCommand.java | 2 +- .../impl/content/RenameContentCommand.java | 2 +- .../impl/content/ReprocessContentCommand.java | 2 +- .../impl/content/UpdateNodeParamsFactory.java | 2 +- .../core/impl/issue/CreateIssueCommand.java | 2 +- .../impl/issue/CreateIssueCommentCommand.java | 2 +- .../core/impl/issue/UpdateIssueCommand.java | 2 +- .../impl/issue/UpdateIssueCommentCommand.java | 2 +- .../export/NodeExportIntegrationTest.java | 7 -- .../xp/repo/impl/SingleRepoStorageSource.java | 16 ++-- .../storage/BranchEntriesExecutorMethod.java | 11 --- .../branch/storage/BranchServiceImpl.java | 16 ++-- .../impl/branch/storage/StorageException.java | 10 --- .../xp/repo/impl/cluster/ClusterService.java | 6 -- .../NodeStoreDocumentFactory.java | 7 +- .../document/DeleteDocument.java | 45 ----------- .../elasticsearch/executor/StoreExecutor.java | 81 ------------------- .../SingleRepoStorageSourceAdaptor.java | 2 +- .../elasticsearch/storage/StorageDaoImpl.java | 78 +++++++++++------- .../repo/impl/index/GetBranchDataCommand.java | 3 +- .../impl/node/CheckNodeExistsCommand.java | 6 -- .../impl/node/FindNodeCommitsCommand.java | 4 +- .../impl/node/FindNodeVersionsCommand.java | 4 +- ...FindNodesWithVersionDifferenceCommand.java | 3 +- .../node/HasUnpublishedChildrenCommand.java | 3 +- .../xp/repo/impl/node/MoveNodeCommand.java | 11 +-- .../xp/repo/impl/node/NodeServiceImpl.java | 2 - .../repository/RepositoryServiceImpl.java | 6 +- .../repo/impl/search/NodeSearchService.java | 9 ++- .../impl/search/NodeSearchServiceImpl.java | 35 ++++---- .../impl/storage/IndexDataServiceImpl.java | 4 +- .../impl/storage/NodeStorageServiceImpl.java | 36 ++++----- .../xp/repo/impl/storage/StorageDao.java | 6 +- .../xp/repo/impl/storage/StoreNodeParams.java | 12 +-- .../NodeIndexDocumentFactoryTest.java | 37 ++------- .../NodeStoreDocumentFactoryTest.java | 4 +- .../content/ContentServiceImplTest_find.java | 3 - 42 files changed, 152 insertions(+), 344 deletions(-) delete mode 100644 modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchEntriesExecutorMethod.java delete mode 100644 modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/StorageException.java delete mode 100644 modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/cluster/ClusterService.java delete mode 100644 modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/document/DeleteDocument.java delete mode 100644 modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/executor/StoreExecutor.java 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 d376a063c1a..56f9f301866 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 @@ -1062,7 +1062,7 @@ public Content setChildOrder( final SetContentChildOrderParams params ) { final SetNodeChildOrderParams.Builder builder = SetNodeChildOrderParams.create() .nodeId( NodeId.from( params.getContentId() ) ) - .refresh( RefreshMode.ALL ) + .refresh( RefreshMode.SEARCH ) .childOrder( params.getChildOrder() ); if ( params.stopInherit() ) @@ -1089,7 +1089,7 @@ public ReorderChildContentsResult reorderChildren( final ReorderChildContentsPar { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final ReorderChildNodesParams.Builder builder = ReorderChildNodesParams.create().refresh( RefreshMode.ALL ); + final ReorderChildNodesParams.Builder builder = ReorderChildNodesParams.create().refresh( RefreshMode.SEARCH ); for ( final ReorderChildParams param : params ) { 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 9ab0c40a7e9..be0f28a5940 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 @@ -115,7 +115,7 @@ private Content doExecute() .contentDataSerializer( this.contentDataSerializer ) .siteService( this.siteService ) .build() - .produce().refresh( params.isRefresh() ? RefreshMode.ALL : RefreshMode.STORAGE ).build(); + .produce().refresh( params.isRefresh() ? RefreshMode.SEARCH : null ).build(); final Node createdNode; try diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/DuplicateContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/DuplicateContentCommand.java index 9e9a595f15b..9cbf2e267ac 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/DuplicateContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/DuplicateContentCommand.java @@ -62,7 +62,7 @@ private DuplicateContentsResult doExecute() .nodeId( sourceNodeId ) .dataProcessor( new DuplicateContentProcessor( params.getWorkflowInfo() ) ) .includeChildren( params.getIncludeChildren() ) - .refresh( RefreshMode.ALL ) + .refresh( RefreshMode.SEARCH ) .build(); final Node duplicatedNode = nodeService.duplicate( duplicateNodeParams ); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/FindContentVersionsCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/FindContentVersionsCommand.java index 8ddc1128afd..b639bb0e04b 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/FindContentVersionsCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/FindContentVersionsCommand.java @@ -6,6 +6,7 @@ import com.enonic.xp.node.GetNodeVersionsParams; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeVersionQueryResult; +import com.enonic.xp.node.RefreshMode; public class FindContentVersionsCommand extends AbstractContentCommand @@ -40,6 +41,8 @@ private FindContentVersionsResult doGetContentVersions() { final NodeId nodeId = NodeId.from( this.contentId ); + nodeService.refresh( RefreshMode.STORAGE ); + final NodeVersionQueryResult nodeVersionQueryResult = nodeService.findVersions( GetNodeVersionsParams.create(). nodeId( nodeId ). from( this.from ). 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 ba194e2f6fa..fddf11bced8 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 @@ -47,7 +47,7 @@ private ImportContentResult doExecute() .dryRun( params.isDryRun() ) .importPermissions( params.isImportPermissions() ) .importPermissionsOnCreate( params.isImportPermissionsOnCreate() ) - .refresh( RefreshMode.ALL ) + .refresh( RefreshMode.SEARCH ) .build(); final ImportNodeResult result = nodeService.importNode( importNodeParams ); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/MoveContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/MoveContentCommand.java index 01a2e3ed638..78b2c41886a 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/MoveContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/MoveContentCommand.java @@ -83,7 +83,7 @@ private MoveContentsResult doExecute() final NodeId sourceNodeId = NodeId.from( contentId ); final MoveNodeParams.Builder builder = - MoveNodeParams.create().nodeId( sourceNodeId ).parentNodePath( newParentPath ).refresh( RefreshMode.ALL ).moveListener( this ); + MoveNodeParams.create().nodeId( sourceNodeId ).parentNodePath( newParentPath ).refresh( RefreshMode.SEARCH ).moveListener( this ); if ( params.stopInherit() ) { 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 78ee70e3751..73666acda69 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 @@ -68,7 +68,7 @@ private Content doExecute() final NodeName nodeName = NodeName.from( params.getNewName().toString() ); - final RenameNodeParams.Builder builder = RenameNodeParams.create().nodeId( nodeId ).refresh( RefreshMode.ALL ).nodeName( nodeName ); + final RenameNodeParams.Builder builder = RenameNodeParams.create().nodeId( nodeId ).refresh( RefreshMode.SEARCH ).nodeName( nodeName ); if ( params.stopInherit() ) { 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 c3022fc3feb..2f2e8bbe52b 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 @@ -93,7 +93,7 @@ private Content revertModifiedTime( final Content content, final Instant modifie final UpdateNodeParams update = UpdateNodeParams.create() .id( NodeId.from( content.getId() ) ) .editor( ( node ) -> node.data.getRoot().setInstant( MODIFIED_TIME, modifiedTime ) ) - .refresh( RefreshMode.ALL ) + .refresh( RefreshMode.SEARCH ) .build(); final Node node = this.nodeService.update( update ); 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 7a4e2f75048..e2ac9b37def 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 @@ -68,7 +68,7 @@ public UpdateNodeParams produce() final UpdateNodeParams.Builder builder = UpdateNodeParams.create(). id( NodeId.from( editedContent.getId() ) ). editor( nodeEditor ). - refresh( RefreshMode.ALL ); + refresh( RefreshMode.SEARCH ); for ( final CreateAttachment createAttachment : createAttachments ) { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/CreateIssueCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/CreateIssueCommand.java index ce263ad6335..0eaba535f3d 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/CreateIssueCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/CreateIssueCommand.java @@ -153,7 +153,7 @@ public static CreateNodeParams create( final CreateIssueParams params, final Use inheritPermissions( true ). childOrder( IssueConstants.DEFAULT_CHILD_ORDER ). nodeType( IssueConstants.ISSUE_NODE_COLLECTION ). - refresh( RefreshMode.ALL ); + refresh( RefreshMode.SEARCH ); return builder.build(); } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/CreateIssueCommentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/CreateIssueCommentCommand.java index 661a2442003..7ba1a56ead0 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/CreateIssueCommentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/CreateIssueCommentCommand.java @@ -108,7 +108,7 @@ public static CreateNodeParams create( final CreateIssueCommentParams params, No inheritPermissions( true ). childOrder( IssueCommentConstants.DEFAULT_CHILD_ORDER ). nodeType( IssueCommentConstants.NODE_COLLECTION ). - refresh( RefreshMode.ALL ); + refresh( RefreshMode.SEARCH ); return builder.build(); } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/UpdateIssueCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/UpdateIssueCommand.java index 57075a2b329..026c6096c4f 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/UpdateIssueCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/UpdateIssueCommand.java @@ -43,7 +43,7 @@ private Issue doExecute() final UpdateNodeParams updateNodeParams = UpdateNodeParams.create() .id( NodeId.from( editedIssue.getId() ) ) .editor( editableNode -> editableNode.data = ISSUE_DATA_SERIALIZER.toUpdateNodeData( editedIssue ) ) - .refresh( RefreshMode.ALL ) + .refresh( RefreshMode.SEARCH ) .build(); final Node updatedNode = this.nodeService.update( updateNodeParams ); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/UpdateIssueCommentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/UpdateIssueCommentCommand.java index 89386897438..f729c05848e 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/UpdateIssueCommentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/issue/UpdateIssueCommentCommand.java @@ -32,7 +32,7 @@ private IssueComment doExecute() final UpdateNodeParams updateNodeParams = UpdateNodeParams.create() .id( this.params.getComment() ) .editor( e -> ISSUE_COMMENT_DATA_SERIALIZER.updateNodeData( e.data, this.params ) ) - .refresh( RefreshMode.ALL ) + .refresh( RefreshMode.SEARCH ) .build(); final Node udpatedNode = nodeService.update( updateNodeParams ); diff --git a/modules/core/core-export/src/test/java/com/enonic/xp/core/impl/export/NodeExportIntegrationTest.java b/modules/core/core-export/src/test/java/com/enonic/xp/core/impl/export/NodeExportIntegrationTest.java index e964e108f69..ededab929be 100644 --- a/modules/core/core-export/src/test/java/com/enonic/xp/core/impl/export/NodeExportIntegrationTest.java +++ b/modules/core/core-export/src/test/java/com/enonic/xp/core/impl/export/NodeExportIntegrationTest.java @@ -21,7 +21,6 @@ import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeName; import com.enonic.xp.node.NodePath; -import com.enonic.xp.node.RefreshMode; import com.enonic.xp.node.RenameNodeParams; import com.enonic.xp.node.UpdateNodeParams; import com.enonic.xp.repo.impl.node.AbstractNodeTest; @@ -229,8 +228,6 @@ public void writerOrderList() createNode( root.path(), "child5" ); createNode( root.path(), "child6" ); - nodeService.refresh( RefreshMode.ALL ); - final NodeExportResult result = NodeExporter.create() .nodeService( this.nodeService ) .nodeExportWriter( new FileExportWriter() ) @@ -256,8 +253,6 @@ public void export_from_child_of_child() createNode( child1_1.path(), "child1_1_1" ); createNode( child1_1.path(), "child1_1_2" ); - nodeService.refresh( RefreshMode.ALL ); - final NodeExportResult result = NodeExporter.create() .nodeService( this.nodeService ) .nodeExportWriter( new FileExportWriter() ) @@ -284,8 +279,6 @@ public void include_export_root_and_nested_children() createNode( child1_1.path(), "child1_1_1" ); createNode( child1_1.path(), "child1_1_2" ); - nodeService.refresh( RefreshMode.ALL ); - final NodeExportResult result = NodeExporter.create() .nodeService( this.nodeService ) .nodeExportWriter( new FileExportWriter() ) diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/SingleRepoStorageSource.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/SingleRepoStorageSource.java index 58f633770d6..e5556af3e38 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/SingleRepoStorageSource.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/SingleRepoStorageSource.java @@ -1,27 +1,21 @@ package com.enonic.xp.repo.impl; +import com.enonic.xp.repo.impl.storage.StaticStorageType; import com.enonic.xp.repository.RepositoryId; public class SingleRepoStorageSource implements SearchSource { - public enum Type - { - BRANCH, - VERSION, - COMMIT - } - private final RepositoryId repositoryId; - private final Type type; + private final StaticStorageType type; - public static SingleRepoStorageSource create( final RepositoryId repositoryId, final Type type ) + public static SingleRepoStorageSource create( final RepositoryId repositoryId, final StaticStorageType type ) { return new SingleRepoStorageSource( repositoryId, type ); } - private SingleRepoStorageSource( final RepositoryId repositoryId, final Type type ) + private SingleRepoStorageSource( final RepositoryId repositoryId, final StaticStorageType type ) { this.repositoryId = repositoryId; this.type = type; @@ -32,7 +26,7 @@ public RepositoryId getRepositoryId() return repositoryId; } - public Type getType() + public StaticStorageType getType() { return type; } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchEntriesExecutorMethod.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchEntriesExecutorMethod.java deleted file mode 100644 index ca69066ca3c..00000000000 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchEntriesExecutorMethod.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.enonic.xp.repo.impl.branch.storage; - -import java.util.Collection; - -import com.enonic.xp.node.NodeBranchEntries; -import com.enonic.xp.node.NodeId; - -interface BranchEntriesExecutorMethod -{ - void execute( Collection nodeIds, NodeBranchEntries.Builder builder ); -} diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchServiceImpl.java index 81e9268f07e..9d3ceb027ec 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/BranchServiceImpl.java @@ -17,7 +17,6 @@ import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeIds; -import com.enonic.xp.node.NodeNotFoundException; import com.enonic.xp.node.NodePath; import com.enonic.xp.query.filter.ValueFilter; import com.enonic.xp.repo.impl.InternalContext; @@ -180,7 +179,8 @@ public NodeBranchEntries get( final NodeIds nodeIds, final InternalContext conte @Override public NodeBranchEntry get( final NodePath nodePath, final InternalContext context ) { - final BranchDocumentId branchDocumentId = this.pathCache.get( createPath( nodePath, context ) ); + final BranchPath path = createPath( nodePath, context ); + final BranchDocumentId branchDocumentId = this.pathCache.get( path ); if ( branchDocumentId != null ) { @@ -188,10 +188,12 @@ public NodeBranchEntry get( final NodePath nodePath, final InternalContext conte if ( nodeBranchEntry == null ) { - throw new NodeNotFoundException( "Node with path [" + nodePath + "] found in path-cache but not in storage" ); + pathCache.evict( path ); + } + else + { + return nodeBranchEntry; } - - return nodeBranchEntry; } final NodeBranchQuery query = NodeBranchQuery.create() @@ -206,9 +208,11 @@ public NodeBranchEntry get( final NodePath nodePath, final InternalContext conte .size( 1 ) .build(); + storageDao.refresh( StoreStorageName.from( context.getRepositoryId() ) ); + final SearchResult result = this.searchDao.search( SearchRequest.create() .searchSource( SingleRepoStorageSource.create( context.getRepositoryId(), - SingleRepoStorageSource.Type.BRANCH ) ) + StaticStorageType.BRANCH ) ) .returnFields( BRANCH_RETURN_FIELDS ) .query( query ) .searchPreference( context.getSearchPreference() ) diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/StorageException.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/StorageException.java deleted file mode 100644 index 709d8839662..00000000000 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/branch/storage/StorageException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.enonic.xp.repo.impl.branch.storage; - -class StorageException - extends RuntimeException -{ - StorageException( final String message ) - { - super( message ); - } -} diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/cluster/ClusterService.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/cluster/ClusterService.java deleted file mode 100644 index 30b8d046fa2..00000000000 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/cluster/ClusterService.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.enonic.xp.repo.impl.cluster; - -public interface ClusterService -{ - boolean isMaster(); -} diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/NodeStoreDocumentFactory.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/NodeStoreDocumentFactory.java index 7d762e4f57f..65dc01527fe 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/NodeStoreDocumentFactory.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/NodeStoreDocumentFactory.java @@ -1,8 +1,5 @@ package com.enonic.xp.repo.impl.elasticsearch; -import java.util.Collection; -import java.util.Collections; - import com.enonic.xp.branch.Branch; import com.enonic.xp.data.Property; import com.enonic.xp.data.PropertyVisitor; @@ -44,11 +41,11 @@ public static Builder createBuilder() return new Builder(); } - public Collection create() + public IndexDocument create() { this.node.validateForIndexing(); - return Collections.singleton( createDataDocument() ); + return createDataDocument(); } private IndexDocument createDataDocument() diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/document/DeleteDocument.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/document/DeleteDocument.java deleted file mode 100644 index 4754f6677ba..00000000000 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/document/DeleteDocument.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.enonic.xp.repo.impl.elasticsearch.document; - -public class DeleteDocument - extends AbstractIndexDocument -{ - private final String id; - - private DeleteDocument( final Builder builder ) - { - super( builder ); - id = builder.id; - } - - public static Builder create() - { - return new Builder(); - } - - public String getId() - { - return id; - } - - - public static class Builder - extends AbstractIndexDocument.Builder - { - private String id; - - private Builder() - { - } - - public Builder id( String id ) - { - this.id = id; - return this; - } - - public DeleteDocument build() - { - return new DeleteDocument( this ); - } - } -} diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/executor/StoreExecutor.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/executor/StoreExecutor.java deleted file mode 100644 index 970b148f4fa..00000000000 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/executor/StoreExecutor.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.enonic.xp.repo.impl.elasticsearch.executor; - -import java.util.Collection; - -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.client.Client; -import org.elasticsearch.client.Requests; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.enonic.xp.repo.impl.elasticsearch.document.IndexDocument; -import com.enonic.xp.repo.impl.elasticsearch.xcontent.StoreDocumentXContentBuilderFactory; -import com.enonic.xp.repository.IndexException; - -public class StoreExecutor - extends AbstractExecutor -{ - private static final String DEFAULT_STORE_TIMEOUT = "10s"; - - private static final Logger LOG = LoggerFactory.getLogger( StoreExecutor.class ); - - private StoreExecutor( final Builder builder ) - { - super( builder ); - } - - public static Builder create( final Client client ) - { - return new Builder( client ); - } - - public void execute( final Collection indexDocuments ) - { - for ( IndexDocument indexDocument : indexDocuments ) - { - final String id = indexDocument.getId(); - - final XContentBuilder xContentBuilder = StoreDocumentXContentBuilderFactory.create( indexDocument ); - - final IndexRequest req = Requests.indexRequest(). - id( id ). - index( indexDocument.getIndexName() ). - type( indexDocument.getIndexTypeName() ). - source( xContentBuilder ). - refresh( indexDocument.isRefreshAfterOperation() ); - - try - { - this.client.index( req ).actionGet( DEFAULT_STORE_TIMEOUT ); - } - catch ( Exception e ) - { - final String msg = "Failed to store document with id [" + id + "] in index [" + indexDocument.getIndexName() + "] branch " + - indexDocument.getIndexTypeName(); - - LOG.error( msg, e ); - - throw new IndexException( msg, e ); - } - } - } - - public static final class Builder - extends AbstractExecutor.Builder - { - private Builder( final Client client ) - { - super( client ); - } - - - public StoreExecutor build() - { - return new StoreExecutor( this ); - } - } -} - - - diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/query/source/SingleRepoStorageSourceAdaptor.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/query/source/SingleRepoStorageSourceAdaptor.java index 9bc88f143a4..05baa4b6d8f 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/query/source/SingleRepoStorageSourceAdaptor.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/query/source/SingleRepoStorageSourceAdaptor.java @@ -8,7 +8,7 @@ class SingleRepoStorageSourceAdaptor public static ESSource adapt( final SingleRepoStorageSource source ) { return ESSource.create(). - addIndexType( source.getType().name().toLowerCase() ). + addIndexType( source.getType().getName() ). addIndexName( createStorageIndexName( source.getRepositoryId() ) ). build(); } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/storage/StorageDaoImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/storage/StorageDaoImpl.java index f0c8d2dc63c..9c7b485c8e1 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/storage/StorageDaoImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/storage/StorageDaoImpl.java @@ -1,6 +1,5 @@ package com.enonic.xp.repo.impl.elasticsearch.storage; -import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -19,20 +18,21 @@ import org.elasticsearch.action.get.MultiGetRequestBuilder; import org.elasticsearch.action.get.MultiGetResponse; import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.Requests; import org.elasticsearch.cluster.block.ClusterBlockException; +import org.elasticsearch.common.xcontent.XContentBuilder; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import com.enonic.xp.node.NodeStorageException; import com.enonic.xp.repo.impl.SearchPreference; +import com.enonic.xp.repo.impl.StorageName; import com.enonic.xp.repo.impl.StorageSource; import com.enonic.xp.repo.impl.elasticsearch.document.IndexDocument; import com.enonic.xp.repo.impl.elasticsearch.executor.CopyExecutor; -import com.enonic.xp.repo.impl.elasticsearch.executor.StoreExecutor; import com.enonic.xp.repo.impl.elasticsearch.result.GetResultFactory; +import com.enonic.xp.repo.impl.elasticsearch.xcontent.StoreDocumentXContentBuilderFactory; import com.enonic.xp.repo.impl.storage.CopyRequest; import com.enonic.xp.repo.impl.storage.DeleteRequest; import com.enonic.xp.repo.impl.storage.DeleteRequests; @@ -41,11 +41,14 @@ import com.enonic.xp.repo.impl.storage.GetResult; import com.enonic.xp.repo.impl.storage.StorageDao; import com.enonic.xp.repo.impl.storage.StoreRequest; +import com.enonic.xp.repository.IndexException; @Component public class StorageDaoImpl implements StorageDao { + private static final long DEFAULT_STORE_TIMEOUT_SECONDS = 10; + private Client client; @Override @@ -54,10 +57,10 @@ public String store( final StoreRequest request ) final StorageSource settings = request.getSettings(); final IndexRequest indexRequest = Requests.indexRequest(). + id( request.getId() ). index( settings.getStorageName().getName() ). type( settings.getStorageType().getName() ). source( XContentBuilderFactory.create( request ) ). - id( request.getId() ). refresh( request.isForceRefresh() ); if ( request.getRouting() != null ) @@ -70,15 +73,46 @@ public String store( final StoreRequest request ) indexRequest.parent( request.getParent() ); } - return doStore( indexRequest, request.getTimeout() ); + final int timeout = request.getTimeout(); + try + { + return this.client.index( indexRequest ).actionGet( timeout, TimeUnit.SECONDS ).getId(); + } + catch ( ClusterBlockException e ) + { + throw new NodeStorageException( "Cannot store node " + indexRequest.id() + ", Repository in 'READ-ONLY mode'" ); + } + catch ( ElasticsearchException e ) + { + throw new NodeStorageException( "Cannot store node " + indexRequest.toString(), e ); + } } @Override - public void store( final Collection indexDocuments ) + public void store( final IndexDocument indexDocument ) { - StoreExecutor.create( this.client ). - build(). - execute( indexDocuments ); + final String id = indexDocument.getId(); + + final XContentBuilder xContentBuilder = StoreDocumentXContentBuilderFactory.create( indexDocument ); + + final IndexRequest req = Requests.indexRequest() + .id( id ) + .index( indexDocument.getIndexName() ) + .type( indexDocument.getIndexTypeName() ) + .source( xContentBuilder ) + .refresh( indexDocument.isRefreshAfterOperation() ); + + try + { + this.client.index( req ).actionGet( DEFAULT_STORE_TIMEOUT_SECONDS, TimeUnit.SECONDS ); + } + catch ( Exception e ) + { + final String msg = "Failed to store document with id [" + id + "] in index [" + indexDocument.getIndexName() + "] branch " + + indexDocument.getIndexTypeName(); + + throw new IndexException( msg, e ); + } } @Override @@ -142,26 +176,6 @@ public void delete( final DeleteRequests requests ) } } - private String doStore( final IndexRequest request, final int timeout ) - { - final IndexResponse indexResponse; - try - { - indexResponse = this.client.index( request ). - actionGet( timeout, TimeUnit.SECONDS ); - } - catch ( ClusterBlockException e ) - { - throw new NodeStorageException( "Cannot store node " + request.id() + ", Repository in 'READ-ONLY mode'" ); - } - catch ( ElasticsearchException e ) - { - throw new NodeStorageException( "Cannot store node " + request.toString(), e ); - } - - return indexResponse.getId(); - } - @Override public GetResult getById( final GetByIdRequest request ) { @@ -242,6 +256,12 @@ public void copy( final CopyRequest request ) execute(); } + @Override + public void refresh( final StorageName storageName ) + { + client.admin().indices().prepareRefresh( storageName.getName() ).execute().actionGet(); + } + @Reference public void setClient( final Client client ) { diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/index/GetBranchDataCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/index/GetBranchDataCommand.java index b6cd6ba509c..da074321393 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/index/GetBranchDataCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/index/GetBranchDataCommand.java @@ -8,7 +8,6 @@ import com.enonic.xp.query.expr.FieldExpr; import com.enonic.xp.query.expr.QueryExpr; import com.enonic.xp.query.expr.ValueExpr; -import com.enonic.xp.repo.impl.SingleRepoStorageSource; import com.enonic.xp.repo.impl.branch.search.NodeBranchQuery; import com.enonic.xp.repo.impl.branch.search.NodeBranchQueryResultFactory; import com.enonic.xp.repo.impl.branch.storage.BranchIndexPath; @@ -47,7 +46,7 @@ private SearchResult doExecute() return this.nodeSearchService.query( NodeBranchQuery.create(). query( QueryExpr.from( compareExpr ) ). size( NodeSearchService.GET_ALL_SIZE_FLAG ). - build(), SingleRepoStorageSource.create( this.repositoryId, SingleRepoStorageSource.Type.BRANCH ) ); + build(), this.repositoryId ); } public static Builder create() diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CheckNodeExistsCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CheckNodeExistsCommand.java index fdb0921fd27..c0d1a6aa6ba 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CheckNodeExistsCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CheckNodeExistsCommand.java @@ -6,7 +6,6 @@ import com.enonic.xp.node.NodeAlreadyExistAtPathException; import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodePath; -import com.enonic.xp.node.RefreshMode; import com.enonic.xp.repo.impl.InternalContext; import com.enonic.xp.repo.impl.SearchPreference; @@ -43,11 +42,6 @@ public boolean execute() .searchPreference( Mode.ACCURACY.equals( mode ) ? SearchPreference.PRIMARY : SearchPreference.LOCAL ) .build(); - if ( Mode.ACCURACY.equals( mode ) ) - { - refresh( RefreshMode.STORAGE ); - } - final NodeBranchEntry found = nodeStorageService.getBranchNodeVersion( nodePath, context ); if ( found != null && throwIfExists ) diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodeCommitsCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodeCommitsCommand.java index 43c05d672d1..e6175e168a4 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodeCommitsCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodeCommitsCommand.java @@ -5,7 +5,6 @@ import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.NodeCommitQuery; import com.enonic.xp.node.NodeCommitQueryResult; -import com.enonic.xp.repo.impl.SingleRepoStorageSource; import com.enonic.xp.repo.impl.commit.search.NodeCommitQueryResultFactory; import com.enonic.xp.repo.impl.search.NodeSearchService; import com.enonic.xp.repo.impl.search.result.SearchResult; @@ -24,8 +23,7 @@ private FindNodeCommitsCommand( Builder builder ) public NodeCommitQueryResult execute() { - final SearchResult result = this.nodeSearchService.query( query, SingleRepoStorageSource.create( - ContextAccessor.current().getRepositoryId(), SingleRepoStorageSource.Type.COMMIT ) ); + final SearchResult result = this.nodeSearchService.query( query, ContextAccessor.current().getRepositoryId() ); if ( result.isEmpty() ) { diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodeVersionsCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodeVersionsCommand.java index 8b04fa2891c..7959fd49080 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodeVersionsCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodeVersionsCommand.java @@ -5,7 +5,6 @@ import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.NodeVersionQuery; import com.enonic.xp.node.NodeVersionQueryResult; -import com.enonic.xp.repo.impl.SingleRepoStorageSource; import com.enonic.xp.repo.impl.search.NodeSearchService; import com.enonic.xp.repo.impl.search.result.SearchResult; import com.enonic.xp.repo.impl.version.search.NodeVersionQueryResultFactory; @@ -24,8 +23,7 @@ private FindNodeVersionsCommand( Builder builder ) public NodeVersionQueryResult execute() { - final SearchResult result = this.nodeSearchService.query( query, SingleRepoStorageSource.create( - ContextAccessor.current().getRepositoryId(), SingleRepoStorageSource.Type.VERSION ) ); + final SearchResult result = this.nodeSearchService.query( query, ContextAccessor.current().getRepositoryId() ); if ( result.isEmpty() ) { diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodesWithVersionDifferenceCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodesWithVersionDifferenceCommand.java index 44113c722e1..4a13d2b76ab 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodesWithVersionDifferenceCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/FindNodesWithVersionDifferenceCommand.java @@ -8,7 +8,6 @@ import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeVersionDiffResult; import com.enonic.xp.repo.impl.InternalContext; -import com.enonic.xp.repo.impl.SingleRepoStorageSource; import com.enonic.xp.repo.impl.search.NodeSearchService; import com.enonic.xp.repo.impl.search.result.SearchResult; import com.enonic.xp.repo.impl.storage.NodeStorageService; @@ -60,7 +59,7 @@ public NodeVersionDiffResult execute() .excludes( excludeEntries ) .size( NodeSearchService.GET_ALL_SIZE_FLAG ) .batchSize( BATCH_SIZE ). - build(), SingleRepoStorageSource.create( context.getRepositoryId(), SingleRepoStorageSource.Type.VERSION ) ); + build(), context.getRepositoryId() ); return NodeVersionDiffResultFactory.create( result ); } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/HasUnpublishedChildrenCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/HasUnpublishedChildrenCommand.java index e993502693c..850c6c25aaa 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/HasUnpublishedChildrenCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/HasUnpublishedChildrenCommand.java @@ -4,7 +4,6 @@ import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeId; -import com.enonic.xp.repo.impl.SingleRepoStorageSource; import com.enonic.xp.repo.impl.search.result.SearchResult; import com.enonic.xp.repo.impl.version.search.ExcludeEntries; import com.enonic.xp.repo.impl.version.search.ExcludeEntry; @@ -41,7 +40,7 @@ public boolean execute() excludes( ExcludeEntries.create(). add( new ExcludeEntry( parentNode.path(), false ) ). build() ). - build(), SingleRepoStorageSource.create( ContextAccessor.current().getRepositoryId(), SingleRepoStorageSource.Type.VERSION ) ); + build(), ContextAccessor.current().getRepositoryId() ); return result.getTotalHits() > 0; } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/MoveNodeCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/MoveNodeCommand.java index 97faaff8184..2d802eef8e3 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/MoveNodeCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/MoveNodeCommand.java @@ -170,8 +170,6 @@ private Node doMoveNode( final NodePath newParentPath, final NodeName newNodeNam .indexConfigDocument( persistedNode.getIndexConfigDocument() ) .timestamp( Instant.now( CLOCK ) ); - final Node movedNode; - final boolean isTheOriginalMovedNode = persistedNode.id().equals( this.nodeId ); if ( isTheOriginalMovedNode ) { @@ -183,7 +181,8 @@ private Node doMoveNode( final NodePath newParentPath, final NodeName newNodeNam } } - movedNode = doStore( nodeToMoveBuilder.build() ); + final Node movedNode = this.nodeStorageService.move( StoreMovedNodeParams.create().node( nodeToMoveBuilder.build() ).build(), + InternalContext.from( ContextAccessor.current() ) ); this.result.addMovedNode( MoveNodeResult.MovedNode.create().previousPath( persistedNode.path() ).node( movedNode ).build() ); @@ -227,12 +226,6 @@ private void updateStoredNodeProperties( final NodePath newParentPath, final Nod } } - private Node doStore( final Node movedNode ) - { - return this.nodeStorageService.move( StoreMovedNodeParams.create().node( movedNode ).build(), - InternalContext.from( ContextAccessor.current() ) ); - } - private void verifyNoExistingAtNewPath( final NodePath newParentPath, final NodeName newNodeName ) { final NodePath newNodePath = NodePath.create( newParentPath, newNodeName.toString() ).build(); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java index 74113a5945a..4f76f06f400 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java @@ -1116,8 +1116,6 @@ public NodeCommitEntry commit( final NodeCommitEntry nodeCommitEntry, final Node { verifyContext(); - refresh( RefreshMode.STORAGE ); - final InternalContext context = InternalContext.create( ContextAccessor.current() ).searchPreference( SearchPreference.PRIMARY ).build(); final RoutableNodeVersionIds.Builder routableNodeVersionIds = RoutableNodeVersionIds.create(); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/repository/RepositoryServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/repository/RepositoryServiceImpl.java index c4c3051d3ef..68356e67006 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/repository/RepositoryServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/repository/RepositoryServiceImpl.java @@ -373,11 +373,7 @@ private void createRootNode( final CreateRepositoryParams params ) .childOrder( params.getRootChildOrder() ) .build(), rootNodeInternalContext ); - rootNodeContext.runWith( () -> RefreshCommand.create() - .indexServiceInternal( this.indexServiceInternal ) - .refreshMode( RefreshMode.ALL ) - .build() - .execute() ); + doRefresh(); LOG.info( "Created root node with id [{}] in repository [{}]", rootNode.id(), params.getRepositoryId() ); } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/search/NodeSearchService.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/search/NodeSearchService.java index 708d410fe91..12195f209ec 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/search/NodeSearchService.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/search/NodeSearchService.java @@ -8,6 +8,7 @@ import com.enonic.xp.repo.impl.branch.search.NodeBranchQuery; import com.enonic.xp.repo.impl.search.result.SearchResult; import com.enonic.xp.repo.impl.version.search.NodeVersionDiffQuery; +import com.enonic.xp.repository.RepositoryId; public interface NodeSearchService { @@ -17,11 +18,11 @@ public interface NodeSearchService SearchResult query( NodeQuery query, ReturnFields returnFields, SearchSource source ); - SearchResult query( NodeVersionQuery query, SearchSource source ); + SearchResult query( NodeVersionQuery query, RepositoryId repositoryId ); - SearchResult query( NodeCommitQuery query, SearchSource source ); + SearchResult query( NodeCommitQuery query, RepositoryId repositoryId ); - SearchResult query( NodeBranchQuery nodeBranchQuery, SearchSource source ); + SearchResult query( NodeBranchQuery nodeBranchQuery, RepositoryId repositoryId ); - SearchResult query( NodeVersionDiffQuery query, SearchSource source ); + SearchResult query( NodeVersionDiffQuery query, RepositoryId repositoryId ); } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/search/NodeSearchServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/search/NodeSearchServiceImpl.java index fcb4d1d75ce..3c1e6580219 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/search/NodeSearchServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/search/NodeSearchServiceImpl.java @@ -9,12 +9,15 @@ import com.enonic.xp.node.NodeVersionQuery; import com.enonic.xp.repo.impl.ReturnFields; import com.enonic.xp.repo.impl.SearchSource; +import com.enonic.xp.repo.impl.SingleRepoStorageSource; import com.enonic.xp.repo.impl.branch.search.NodeBranchQuery; import com.enonic.xp.repo.impl.branch.storage.BranchIndexPath; import com.enonic.xp.repo.impl.commit.storage.CommitIndexPath; import com.enonic.xp.repo.impl.search.result.SearchResult; +import com.enonic.xp.repo.impl.storage.StaticStorageType; import com.enonic.xp.repo.impl.version.VersionIndexPath; import com.enonic.xp.repo.impl.version.search.NodeVersionDiffQuery; +import com.enonic.xp.repository.RepositoryId; @Component public class NodeSearchServiceImpl @@ -62,10 +65,10 @@ private SearchResult doQuery( final NodeQuery query, final ReturnFields returnFi } @Override - public SearchResult query( final NodeBranchQuery nodeBranchQuery, final SearchSource source ) + public SearchResult query( final NodeBranchQuery nodeBranchQuery, final RepositoryId repositoryId ) { final SearchRequest searchRequest = SearchRequest.create(). - searchSource( source ). + searchSource( SingleRepoStorageSource.create( repositoryId, StaticStorageType.BRANCH ) ). returnFields( BRANCH_RETURN_FIELDS ). query( nodeBranchQuery ). build(); @@ -74,34 +77,34 @@ public SearchResult query( final NodeBranchQuery nodeBranchQuery, final SearchSo } @Override - public SearchResult query( final NodeVersionQuery query, final SearchSource source ) + public SearchResult query( final NodeVersionQuery query, final RepositoryId repositoryId ) { - final SearchRequest searchRequest = SearchRequest.create(). - searchSource( source ). - returnFields( VERSION_RETURN_FIELDS ). - query( query ). - build(); + final SearchRequest searchRequest = SearchRequest.create() + .searchSource( SingleRepoStorageSource.create( repositoryId, StaticStorageType.VERSION ) ) + .returnFields( VERSION_RETURN_FIELDS ) + .query( query ) + .build(); return searchDao.search( searchRequest ); } @Override - public SearchResult query( final NodeCommitQuery query, final SearchSource source ) + public SearchResult query( final NodeCommitQuery query, final RepositoryId repositoryId ) { - final SearchRequest searchRequest = SearchRequest.create(). - searchSource( source ). - returnFields( COMMIT_RETURN_FIELDS ). - query( query ). - build(); + final SearchRequest searchRequest = SearchRequest.create() + .searchSource( SingleRepoStorageSource.create( repositoryId, StaticStorageType.COMMIT ) ) + .returnFields( COMMIT_RETURN_FIELDS ) + .query( query ) + .build(); return searchDao.search( searchRequest ); } @Override - public SearchResult query( final NodeVersionDiffQuery query, final SearchSource source ) + public SearchResult query( final NodeVersionDiffQuery query, final RepositoryId repositoryId ) { final SearchRequest searchRequest = SearchRequest.create(). - searchSource( source ). + searchSource( SingleRepoStorageSource.create( repositoryId, StaticStorageType.VERSION ) ). returnFields( VERSION_RETURN_FIELDS ). query( query ). build(); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexDataServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexDataServiceImpl.java index 3e29f57ee95..811dde3a0d1 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexDataServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexDataServiceImpl.java @@ -100,14 +100,14 @@ public void delete( final Collection nodeIds, final InternalContext cont @Override public void store( final Node node, final InternalContext context ) { - final Collection indexDocuments = NodeStoreDocumentFactory.createBuilder(). + final IndexDocument indexDocument = NodeStoreDocumentFactory.createBuilder(). node( node ). branch( context.getBranch() ). repositoryId( context.getRepositoryId() ). build(). create(); - this.storageDao.store( indexDocuments ); + this.storageDao.store( indexDocument ); } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java index 53d585a2908..cc036c7d361 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java @@ -73,7 +73,7 @@ public Node store( final StoreNodeParams params, final InternalContext context ) { final Node node = params.getNode(); - final NodeVersionId nodeVersionId = params.isOverrideVersion() ? node.getNodeVersionId() : new NodeVersionId(); + final NodeVersionId nodeVersionId = params.isNewVersion() ? new NodeVersionId() : node.getNodeVersionId(); final NodeVersionKey nodeVersionKey = nodeVersionService.store( NodeVersion.from( node ), context ); this.versionService.store( NodeVersionMetadata.create(). @@ -138,12 +138,12 @@ public Node move( final StoreMovedNodeParams params, final InternalContext conte final NodeVersionKey nodeVersionKey = nodeVersionService.store( NodeVersion.from( params.getNode() ), context ); - NodeVersionId nodeVersionId = params.getNodeVersionId(); + final Node node = params.getNode(); + NodeVersionId nodeVersionId = params.getNodeVersionId(); if ( nodeVersionId == null ) { nodeVersionId = new NodeVersionId(); - final Node node = params.getNode(); this.versionService.store( NodeVersionMetadata.create(). nodeId( node.id() ). nodeVersionId( nodeVersionId ). @@ -154,7 +154,19 @@ public Node move( final StoreMovedNodeParams params, final InternalContext conte build(), context ); } - return moveInBranchAndReIndex( params.getNode(), nodeVersionId, nodeVersionKey, nodeBranchEntry.getNodePath(), context ); + this.branchService.store( NodeBranchEntry.create(). + nodeVersionId( nodeVersionId ). + nodeVersionKey( nodeVersionKey ). + nodeId( node.id() ). + timestamp( node.getTimestamp() ). + nodePath( node.path() ). + build(), nodeBranchEntry.getNodePath(), context ); + + this.indexDataService.store( node, context ); + + return Node.create( node ). + nodeVersionId( nodeVersionId ). + build(); } @Override @@ -419,22 +431,6 @@ private Nodes doReturnNodes( final Stream nodeBranchEntries, fi return filteredNodes.build(); } - private Node moveInBranchAndReIndex( final Node node, final NodeVersionId nodeVersionId, final NodeVersionKey nodeVersionKey, - final NodePath previousPath, final InternalContext context ) - { - this.branchService.store( NodeBranchEntry.create(). - nodeVersionId( nodeVersionId ). - nodeVersionKey( nodeVersionKey ). - nodeId( node.id() ). - timestamp( node.getTimestamp() ). - nodePath( node.path() ). - build(), previousPath, context ); - - this.indexDataService.store( node, context ); - - return node; - } - private boolean canRead( final AccessControlList permissions ) { final AuthenticationInfo authInfo = ContextAccessor.current().getAuthInfo(); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StorageDao.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StorageDao.java index 8a764726aaa..86b8762a038 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StorageDao.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StorageDao.java @@ -1,15 +1,15 @@ package com.enonic.xp.repo.impl.storage; -import java.util.Collection; import java.util.List; +import com.enonic.xp.repo.impl.StorageName; import com.enonic.xp.repo.impl.elasticsearch.document.IndexDocument; public interface StorageDao { String store( StoreRequest request ); - void store( Collection indexDocuments ); + void store( IndexDocument indexDocument ); boolean delete( DeleteRequest request ); @@ -20,4 +20,6 @@ public interface StorageDao List getByIds( GetByIdsRequest requests ); void copy( CopyRequest request ); + + void refresh( StorageName storageName ); } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreNodeParams.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreNodeParams.java index ca38a2d91cd..b0b8c47a81f 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreNodeParams.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreNodeParams.java @@ -9,13 +9,13 @@ public class StoreNodeParams final NodeCommitId nodeCommitId; - final boolean overrideVersion; + final boolean newVersion; private StoreNodeParams( final Builder builder ) { node = builder.node; nodeCommitId = builder.nodeCommitId; - overrideVersion = builder.overrideVersion; + newVersion = builder.newVersion; } public Node getNode() @@ -28,9 +28,9 @@ public NodeCommitId getNodeCommitId() return nodeCommitId; } - public boolean isOverrideVersion() + public boolean isNewVersion() { - return overrideVersion; + return newVersion; } public static Builder create() @@ -45,7 +45,7 @@ public static final class Builder private NodeCommitId nodeCommitId; - private boolean overrideVersion; + private boolean newVersion = true; private Builder() { @@ -64,7 +64,7 @@ public Builder nodeCommitId( final NodeCommitId nodeCommitId ) } public Builder overrideVersion() { - this.overrideVersion = true; + this.newVersion = false; return this; } diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/elasticsearch/NodeIndexDocumentFactoryTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/elasticsearch/NodeIndexDocumentFactoryTest.java index c7104a9e85c..45c20f097bc 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/elasticsearch/NodeIndexDocumentFactoryTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/elasticsearch/NodeIndexDocumentFactoryTest.java @@ -1,7 +1,5 @@ package com.enonic.xp.repo.impl.elasticsearch; -import java.util.Collection; - import org.junit.jupiter.api.Test; import com.enonic.xp.index.IndexConfig; @@ -54,14 +52,14 @@ public void validate_given_id_then_ok() id( NodeId.from( "abc" ) ). build(); - final Collection indexDocuments = NodeStoreDocumentFactory.createBuilder(). + final IndexDocument indexDocument = NodeStoreDocumentFactory.createBuilder(). node( node ). branch( TEST_BRANCH ). repositoryId( TEST_REPOSITORY_ID ). build(). create(); - assertNotNull( indexDocuments ); + assertNotNull( indexDocument ); } @Test @@ -72,15 +70,15 @@ public void index_node_document_created() id( NodeId.from( "abc" ) ). build(); - final Collection indexDocuments = NodeStoreDocumentFactory.createBuilder(). + final IndexDocument indexDocument = NodeStoreDocumentFactory.createBuilder(). node( node ). branch( TEST_BRANCH ). repositoryId( TEST_REPOSITORY_ID ). build(). create(); - assertNotNull( indexDocuments ); - assertNotNull( getIndexDocumentOfType( indexDocuments, "test" ) ); + assertNotNull( indexDocument ); + assertEquals( "test", indexDocument.getIndexTypeName() ); } @Test @@ -97,15 +95,14 @@ public void set_analyzer() build() ). build(); - final Collection indexDocuments = NodeStoreDocumentFactory.createBuilder(). + final IndexDocument indexDocument = NodeStoreDocumentFactory.createBuilder(). node( node ). branch( TEST_BRANCH ). repositoryId( TEST_REPOSITORY_ID ). build(). create(); - final IndexDocument indexDocument = getIndexDocumentOfType( indexDocuments, "test" ); - + assertEquals( "test", indexDocument.getIndexTypeName() ); assertEquals( myAnalyzerName, indexDocument.getAnalyzer() ); } @@ -125,33 +122,15 @@ public void node_index_document_meta_data_values() build() ). build(); - final Collection indexDocuments = NodeStoreDocumentFactory.createBuilder(). + final IndexDocument indexDocument = NodeStoreDocumentFactory.createBuilder(). node( node ). branch( TEST_BRANCH ). repositoryId( TEST_REPOSITORY_ID ). build(). create(); - final IndexDocument indexDocument = getIndexDocumentOfType( indexDocuments, "test" ); - assertEquals( myAnalyzerName, indexDocument.getAnalyzer() ); assertEquals( IndexNameResolver.resolveSearchIndexName( TEST_REPOSITORY_ID ), indexDocument.getIndexName() ); assertEquals( "test", indexDocument.getIndexTypeName() ); } - - private IndexDocument getIndexDocumentOfType( final Collection indexDocuments, final String indexType ) - { - for ( IndexDocument indexDocument : indexDocuments ) - { - if ( indexType.equals( indexDocument.getIndexTypeName() ) ) - { - return indexDocument; - } - } - return null; - } - - - - } diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/elasticsearch/NodeStoreDocumentFactoryTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/elasticsearch/NodeStoreDocumentFactoryTest.java index 381e65f7996..fb8f0d1fed0 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/elasticsearch/NodeStoreDocumentFactoryTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/elasticsearch/NodeStoreDocumentFactoryTest.java @@ -36,15 +36,13 @@ public void references() data( data ). build(); - final Collection indexDocuments = NodeStoreDocumentFactory.createBuilder(). + final IndexDocument indexDocument = NodeStoreDocumentFactory.createBuilder(). node( node ). branch( Branch.from( "myBranch" ) ). repositoryId( RepositoryId.from( "my-repo" ) ). build(). create(); - assertEquals( 1, indexDocuments.size() ); - final IndexDocument indexDocument = indexDocuments.iterator().next(); final IndexItems indexItems = indexDocument.getIndexItems(); final Collection referenceValues = indexItems.get( NodeIndexPath.REFERENCE.getPath() ); assertEquals( 1, referenceValues.size() ); diff --git a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_find.java b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_find.java index 02426d16c04..825b4710fe7 100644 --- a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_find.java +++ b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ContentServiceImplTest_find.java @@ -19,7 +19,6 @@ import com.enonic.xp.data.PropertySet; import com.enonic.xp.data.PropertyTree; import com.enonic.xp.data.ValueFactory; -import com.enonic.xp.node.RefreshMode; import com.enonic.xp.query.aggregation.TermsAggregationQuery; import com.enonic.xp.query.expr.DslExpr; import com.enonic.xp.query.expr.DslOrderExpr; @@ -463,8 +462,6 @@ public void dsl_filter_range() final Content child2 = createContent( site.getPath(), "c", data2 ); createContent( site.getPath(), "d", data3 ); - nodeService.refresh( RefreshMode.ALL ); - final PropertyTree request = new PropertyTree(); final PropertySet booleanSet = request.addSet( "boolean" ); From be906a2ef250536d775fefebdb46b7682d396bf7 Mon Sep 17 00:00:00 2001 From: rymsha Date: Mon, 12 Dec 2022 16:42:45 +0100 Subject: [PATCH 03/11] save --- .../com/enonic/xp/node/PushNodeEntries.java | 1 + .../com/enonic/xp/node/PushNodesResult.java | 37 ++++++++-- .../impl/content/PublishContentCommand.java | 2 +- .../com/enonic/xp/repo/impl/NodeEvents.java | 21 +++--- .../impl/node/InternalPushNodesResult.java | 69 ------------------- .../xp/repo/impl/node/NodeServiceImpl.java | 6 +- .../xp/repo/impl/node/PushNodesCommand.java | 21 +++--- .../repo/impl/storage/NodeStorageService.java | 4 +- .../impl/storage/NodeStorageServiceImpl.java | 41 ++++++----- .../impl/storage/StoreMovedNodeParams.java | 14 ++-- .../enonic/xp/repo/impl/NodeEventsTest.java | 19 +++-- .../repo/impl/node/PushNodesCommandTest.java | 18 ++--- .../node/event/NodeEventListenerTest.java | 11 +-- .../node/mapper/PushNodesResultMapper.java | 5 +- .../xp/lib/node/PushNodeHandlerTest.java | 17 ++--- .../mapper/PushNodesResultMapperTest.java | 15 ++-- 16 files changed, 125 insertions(+), 176 deletions(-) delete mode 100644 modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/InternalPushNodesResult.java diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/PushNodeEntries.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/PushNodeEntries.java index e11159ecb3d..298555aa277 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/node/PushNodeEntries.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/PushNodeEntries.java @@ -11,6 +11,7 @@ import com.enonic.xp.repository.RepositoryId; import com.enonic.xp.support.AbstractImmutableEntitySet; +@Deprecated public class PushNodeEntries extends AbstractImmutableEntitySet { diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/PushNodesResult.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/PushNodesResult.java index d067e0f2a0b..8c6fabc21f8 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/node/PushNodesResult.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/PushNodesResult.java @@ -1,5 +1,8 @@ package com.enonic.xp.node; +import java.util.List; + +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.enonic.xp.annotation.PublicApi; @@ -7,9 +10,9 @@ @PublicApi public class PushNodesResult { - private final NodeBranchEntries successful; + private final ImmutableList successful; - private final ImmutableSet failed; + private final ImmutableList failed; protected PushNodesResult( Builder builder ) { @@ -18,15 +21,28 @@ protected PushNodesResult( Builder builder ) } public NodeBranchEntries getSuccessful() + { + final NodeBranchEntries.Builder builder = NodeBranchEntries.create(); + successful.stream().map( PushNodeEntry::getNodeBranchEntry ).forEach( builder::add ); + return builder.build(); + } + + public List getSuccessfulEntries() { return successful; } - public ImmutableSet getFailed() + public List getFailedEntries() { return failed; } + @Deprecated + public ImmutableSet getFailed() + { + return ImmutableSet.copyOf( failed ); + } + public static Builder create() { return new Builder(); @@ -34,17 +50,26 @@ public static Builder create() public static class Builder { - private final NodeBranchEntries.Builder successful = NodeBranchEntries.create(); + private final ImmutableList.Builder successful = ImmutableList.builder(); - private final ImmutableSet.Builder failed = ImmutableSet.builder(); + private final ImmutableList.Builder failed = ImmutableList.builder(); protected Builder() { } + public T addSuccess( final NodeBranchEntry nodeBranchEntry, NodePath currentTargetPath ) + { + successful.add( PushNodeEntry.create(). + nodeBranchEntry( nodeBranchEntry ). + currentTargetPath( currentTargetPath ). + build() ); + return (T) this; + } + + @Deprecated public T addSuccess( final NodeBranchEntry success ) { - this.successful.add( success ); return (T) this; } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java index d3ff5744b4e..3a7018e7e7d 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java @@ -142,7 +142,7 @@ private void doPushNodes( final NodeIds nodesToPush ) commitPushedNodes( pushNodesResult.getSuccessful() ); - this.resultBuilder.setFailed( ContentNodeHelper.toContentIds( pushNodesResult.getFailed() + this.resultBuilder.setFailed( ContentNodeHelper.toContentIds( pushNodesResult.getFailedEntries() .stream() .map( failed -> failed.getNodeBranchEntry().getNodeId() ) .collect( Collectors.toList() ) ) ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/NodeEvents.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/NodeEvents.java index 064eea7c85e..bc63b627c58 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/NodeEvents.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/NodeEvents.java @@ -1,5 +1,6 @@ package com.enonic.xp.repo.impl; +import java.util.Collection; import java.util.stream.Collectors; import com.google.common.collect.ImmutableList; @@ -14,9 +15,7 @@ import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodePath; import com.enonic.xp.node.Nodes; -import com.enonic.xp.node.PushNodeEntries; import com.enonic.xp.node.PushNodeEntry; -import com.enonic.xp.repository.RepositoryId; public class NodeEvents { @@ -48,9 +47,9 @@ public static Event created( final Node createdNode ) return event( NODE_CREATED_EVENT, createdNode ); } - public static Event pushed( final PushNodeEntries pushNodeEntries ) + public static Event pushed( final Collection pushNodeEntries, Branch targetBranch ) { - return event( NODE_PUSHED_EVENT, pushNodeEntries ).build(); + return event( NODE_PUSHED_EVENT, pushNodeEntries, targetBranch ).build(); } public static Event deleted( final NodeBranchEntries deletedNodes ) @@ -121,9 +120,9 @@ private static Event.Builder event( String type, NodeBranchEntries nodes ) return Event.create( type ).distributed( true ).value( "nodes", nodesToList( nodes ) ); } - private static Event.Builder event( String type, PushNodeEntries nodes ) + private static Event.Builder event( String type, Collection nodes, Branch targetBranch ) { - return Event.create( type ).distributed( true ).value( "nodes", nodesToList( nodes ) ); + return Event.create( type ).distributed( true ).value( "nodes", nodesToList( nodes, targetBranch ) ); } private static ImmutableList> nodesToList( final Nodes nodes ) @@ -136,10 +135,11 @@ private static ImmutableList> nodesToList( final No return nodes.stream().map( NodeEvents::nodeToMap ).collect( ImmutableList.toImmutableList() ); } - private static ImmutableList> nodesToList( final PushNodeEntries pushNodeEntries ) + private static ImmutableList> nodesToList( final Collection pushNodeEntries, + Branch targetBranch ) { return pushNodeEntries.stream() - .map( node -> NodeEvents.nodeToMap( node, pushNodeEntries.getTargetBranch(), pushNodeEntries.getTargetRepo() ) ) + .map( node -> NodeEvents.nodeToMap( node, targetBranch ) ) .collect( ImmutableList.toImmutableList() ); } @@ -163,14 +163,13 @@ private static ImmutableMap nodeToMap( final Node node ) .build(); } - private static ImmutableMap nodeToMap( final PushNodeEntry node, final Branch targetBranch, - final RepositoryId targetRepository ) + private static ImmutableMap nodeToMap( final PushNodeEntry node, final Branch targetBranch ) { final ImmutableMap.Builder nodeAsMap = ImmutableMap.builder() .put( "id", node.getNodeBranchEntry().getNodeId().toString() ) .put( "path", node.getNodeBranchEntry().getNodePath().toString() ) .put( "branch", targetBranch.getValue() ) - .put( "repo", targetRepository.toString() ); + .put( "repo", ContextAccessor.current().getRepositoryId().toString() ); if ( node.getCurrentTargetPath() != null ) { nodeAsMap.put( "currentTargetPath", node.getCurrentTargetPath().toString() ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/InternalPushNodesResult.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/InternalPushNodesResult.java deleted file mode 100644 index 748ef9627ea..00000000000 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/InternalPushNodesResult.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.enonic.xp.repo.impl.node; - -import com.enonic.xp.branch.Branch; -import com.enonic.xp.node.NodeBranchEntry; -import com.enonic.xp.node.NodePath; -import com.enonic.xp.node.PushNodeEntries; -import com.enonic.xp.node.PushNodeEntry; -import com.enonic.xp.node.PushNodesResult; -import com.enonic.xp.repository.RepositoryId; - -public class InternalPushNodesResult - extends PushNodesResult -{ - private final PushNodeEntries pushNodeEntries; - - protected InternalPushNodesResult( Builder builder ) - { - super( builder ); - pushNodeEntries = builder.pushNodeEntries.build(); - } - - public PushNodeEntries getPushNodeEntries() - { - return pushNodeEntries; - } - - public static Builder create() - { - return new Builder(); - } - - public static final class Builder - extends PushNodesResult.Builder - { - private final PushNodeEntries.Builder pushNodeEntries = PushNodeEntries.create(); - - private Builder() - { - } - - public Builder addSuccess( final NodeBranchEntry nodeBranchEntry, NodePath currentTargetPath ) - { - addSuccess( nodeBranchEntry ); - pushNodeEntries.add( PushNodeEntry.create(). - nodeBranchEntry( nodeBranchEntry ). - currentTargetPath( currentTargetPath ). - build() ); - return this; - } - - public Builder targetBranch( final Branch val ) - { - pushNodeEntries.targetBranch( val ); - return this; - } - - public Builder targetRepo( final RepositoryId val ) - { - pushNodeEntries.targetRepo(val); - return this; - } - - @Override - public InternalPushNodesResult build() - { - return new InternalPushNodesResult( this ); - } - } -} diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java index 4f76f06f400..ae011a8dc38 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java @@ -565,7 +565,7 @@ public PushNodesResult push( final NodeIds ids, final Branch target, final PushN verifyContext(); verifyBranchExists( target ); - final InternalPushNodesResult pushNodesResult = PushNodesCommand.create(). + final PushNodesResult pushNodesResult = PushNodesCommand.create(). indexServiceInternal( this.indexServiceInternal ). storageService( this.nodeStorageService ). searchService( this.nodeSearchService ). @@ -575,9 +575,9 @@ public PushNodesResult push( final NodeIds ids, final Branch target, final PushN build(). execute(); - if ( pushNodesResult.getPushNodeEntries().isNotEmpty() ) + if ( !pushNodesResult.getSuccessfulEntries().isEmpty() ) { - this.eventPublisher.publish( NodeEvents.pushed( pushNodesResult.getPushNodeEntries() ) ); + this.eventPublisher.publish( NodeEvents.pushed( pushNodesResult.getSuccessfulEntries(), target ) ); } return pushNodesResult; diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java index 5d26487199e..6d9fb075fd4 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java @@ -55,7 +55,7 @@ public static Builder create() return new Builder(); } - public InternalPushNodesResult execute() + public PushNodesResult execute() { final Context context = ContextAccessor.current(); @@ -65,8 +65,7 @@ public InternalPushNodesResult execute() final NodeComparisons comparisons = getNodeComparisons( ids ); - final InternalPushNodesResult.Builder builder = - InternalPushNodesResult.create().targetBranch( this.target ).targetRepo( context.getRepositoryId() ); + final PushNodesResult.Builder builder = PushNodesResult.create(); final List list = nodeBranchEntries.getSet().stream().sorted( Comparator.comparing( NodeBranchEntry::getNodePath ) ) @@ -94,7 +93,7 @@ public InternalPushNodesResult execute() if ( comparison.getCompareStatus() == CompareStatus.EQUAL ) { - builder.addSuccess( nodeBranchEntry ); + builder.addSuccess( nodeBranchEntry, comparison.getTargetPath() ); alreadyAdded.add( nodeBranchEntry.getNodePath() ); pushListener.nodesPushed( 1 ); continue; @@ -125,10 +124,10 @@ public InternalPushNodesResult execute() } } - final InternalPushNodesResult result = builder.build(); + final PushNodesResult result = builder.build(); final InternalContext pushContext = InternalContext.create( context ).skipConstraints( true ).build(); - this.nodeStorageService.push( result.getPushNodeEntries(), pushListener, pushContext ); + this.nodeStorageService.push( result.getSuccessfulEntries(), target, pushListener, pushContext ); refresh( RefreshMode.ALL ); @@ -145,7 +144,7 @@ private NodeComparisons getNodeComparisons( final NodeIds nodeIds ) execute(); } - private void updateTargetChildrenMetaData( final NodeBranchEntry nodeBranchEntry, final InternalPushNodesResult.Builder resultBuilder, + private void updateTargetChildrenMetaData( final NodeBranchEntry nodeBranchEntry, final PushNodesResult.Builder resultBuilder, final Set alreadyAdded ) { final Context context = ContextAccessor.current(); @@ -172,12 +171,10 @@ private void updateTargetChildrenMetaData( final NodeBranchEntry nodeBranchEntry { final Node childNode = doGetById( child.getNodeId() ); - this.nodeStorageService.move( StoreMovedNodeParams.create(). - nodeVersionId( child.getVersionId() ). - node( childNode ). - build(), InternalContext.from( targetContext ) ); + this.nodeStorageService.move( StoreMovedNodeParams.create().overrideVersion().node( childNode ).build(), + InternalContext.from( targetContext ) ); - resultBuilder.addSuccess( child ); + resultBuilder.addSuccess( child, targetNodeEntry.getNodePath() ); alreadyAdded.add( child.getNodePath() ); updateTargetChildrenMetaData( child, resultBuilder, alreadyAdded ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java index af2928967f4..ba9466d005e 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java @@ -18,7 +18,7 @@ import com.enonic.xp.node.NodeVersionId; import com.enonic.xp.node.NodeVersionMetadata; import com.enonic.xp.node.Nodes; -import com.enonic.xp.node.PushNodeEntries; +import com.enonic.xp.node.PushNodeEntry; import com.enonic.xp.node.PushNodesListener; import com.enonic.xp.node.RoutableNodeVersionIds; import com.enonic.xp.repo.impl.InternalContext; @@ -41,7 +41,7 @@ public interface NodeStorageService void push( Node node, Branch target, InternalContext context ); - void push( PushNodeEntries entries, PushNodesListener pushListener, InternalContext context ); + void push( Collection entries, Branch target, PushNodesListener pushListener, InternalContext context ); NodeCommitEntry commit( NodeCommitEntry entry, RoutableNodeVersionIds routableNodeVersionIds, InternalContext context ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java index cc036c7d361..2338da2844f 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java @@ -32,7 +32,6 @@ import com.enonic.xp.node.NodeVersionId; import com.enonic.xp.node.NodeVersionMetadata; import com.enonic.xp.node.Nodes; -import com.enonic.xp.node.PushNodeEntries; import com.enonic.xp.node.PushNodeEntry; import com.enonic.xp.node.PushNodesListener; import com.enonic.xp.node.RoutableNodeVersionId; @@ -134,24 +133,27 @@ public void storeCommit( final StoreNodeCommitParams params, final InternalConte @Override public Node move( final StoreMovedNodeParams params, final InternalContext context ) { - final NodeBranchEntry nodeBranchEntry = this.branchService.get( params.getNode().id(), context ); - - final NodeVersionKey nodeVersionKey = nodeVersionService.store( NodeVersion.from( params.getNode() ), context ); - final Node node = params.getNode(); + final NodeBranchEntry nodeBranchEntry = this.branchService.get( node.id(), context ); + + final NodeVersionKey nodeVersionKey = nodeVersionService.store( NodeVersion.from( node ), context ); - NodeVersionId nodeVersionId = params.getNodeVersionId(); - if ( nodeVersionId == null ) + final NodeVersionId nodeVersionId; + if ( params.isNewVersion() ) { nodeVersionId = new NodeVersionId(); - this.versionService.store( NodeVersionMetadata.create(). - nodeId( node.id() ). - nodeVersionId( nodeVersionId ). - nodeVersionKey( nodeVersionKey ). - binaryBlobKeys( getBinaryBlobKeys( node.getAttachedBinaries() ) ). - nodePath( node.path() ). - timestamp( node.getTimestamp() ). - build(), context ); + this.versionService.store( NodeVersionMetadata.create() + .nodeId( node.id() ) + .nodeVersionId( nodeVersionId ) + .nodeVersionKey( nodeVersionKey ) + .binaryBlobKeys( getBinaryBlobKeys( node.getAttachedBinaries() ) ) + .nodePath( node.path() ) + .timestamp( node.getTimestamp() ) + .build(), context ); + } + else + { + nodeVersionId = node.getNodeVersionId(); } this.branchService.store( NodeBranchEntry.create(). @@ -203,13 +205,14 @@ public void updateVersion( final Node node, final InternalContext context ) } @Override - public void push( final PushNodeEntries entries, final PushNodesListener pushListener, final InternalContext context ) + public void push( final Collection entries, final Branch target, final PushNodesListener pushListener, + final InternalContext context ) { for ( final PushNodeEntry entry : entries ) { final NodeBranchEntry nodeBranchEntry = entry.getNodeBranchEntry(); this.branchService.store( nodeBranchEntry, entry.getCurrentTargetPath(), - InternalContext.create( context ).branch( entries.getTargetBranch() ).build() ); + InternalContext.create( context ).branch( target ).build() ); pushListener.nodesPushed( 1 ); } @@ -218,8 +221,8 @@ public void push( final PushNodeEntries entries, final PushNodesListener pushLis this.indexDataService.push( IndexPushNodeParams.create() .nodeIds( nodeIds ) - .targetBranch( entries.getTargetBranch() ) - .targetRepo( entries.getTargetRepo() ) + .targetBranch( target ) + .targetRepo(context.getRepositoryId() ) .build(), context ); } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreMovedNodeParams.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreMovedNodeParams.java index 2f5abd14191..01a174d340a 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreMovedNodeParams.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/StoreMovedNodeParams.java @@ -7,12 +7,12 @@ public class StoreMovedNodeParams { private final Node node; - private final NodeVersionId nodeVersionId; + private final boolean newVersion; private StoreMovedNodeParams( Builder builder ) { node = builder.node; - nodeVersionId = builder.nodeVersionId; + newVersion = builder.newVersion; } public static Builder create() @@ -25,16 +25,16 @@ public Node getNode() return node; } - public NodeVersionId getNodeVersionId() + public boolean isNewVersion() { - return nodeVersionId; + return newVersion; } public static final class Builder { private Node node; - private NodeVersionId nodeVersionId; + private boolean newVersion = true; private Builder() { @@ -46,9 +46,9 @@ public Builder node( Node node ) return this; } - public Builder nodeVersionId( final NodeVersionId nodeVersionId ) + public Builder overrideVersion() { - this.nodeVersionId = nodeVersionId; + this.newVersion = false; return this; } diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/NodeEventsTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/NodeEventsTest.java index 1a19e1156c4..42d645f3429 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/NodeEventsTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/NodeEventsTest.java @@ -1,5 +1,7 @@ package com.enonic.xp.repo.impl; +import java.util.List; + import org.junit.jupiter.api.Test; import com.enonic.xp.content.ContentConstants; @@ -10,7 +12,6 @@ import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeName; import com.enonic.xp.node.NodePath; -import com.enonic.xp.node.PushNodeEntries; import com.enonic.xp.node.PushNodeEntry; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -57,16 +58,14 @@ public void testPushed() nodeVersionId( pushed3.getNodeVersionId() ). build(); - final PushNodeEntries pushNodeEntries = PushNodeEntries.create(). - targetRepo( ContentConstants.CONTENT_REPO_ID ). - targetBranch( ContentConstants.BRANCH_MASTER ). - add( PushNodeEntry.create().nodeBranchEntry( nodeBranchEntry ).build() ). - add( PushNodeEntry.create().nodeBranchEntry( nodeBranchEntry2 ).build() ). - add( PushNodeEntry.create().nodeBranchEntry( nodeBranchEntry3 ).currentTargetPath( - NodePath.create( "/mynode1/pushed3/pushed3" ).build() ).build() ). - build(); + final List pushNodeEntries = List.of( PushNodeEntry.create().nodeBranchEntry( nodeBranchEntry ).build(), + PushNodeEntry.create().nodeBranchEntry( nodeBranchEntry2 ).build(), + PushNodeEntry.create() + .nodeBranchEntry( nodeBranchEntry3 ) + .currentTargetPath( NodePath.create( "/mynode1/pushed3/pushed3" ).build() ) + .build() ); - Event event = NodeEvents.pushed( pushNodeEntries ); + Event event = NodeEvents.pushed( pushNodeEntries, ContentConstants.BRANCH_MASTER ); assertNotNull( event ); assertTrue( event.isDistributed() ); diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java index 58af87d945f..ad81b4d49bd 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java @@ -131,9 +131,9 @@ public void push_child_missing_permission() final PushNodesResult result = pushNodes( NodeIds.from( node.id(), child.id() ), WS_OTHER ); - assertEquals( 1, result.getSuccessful().getSize() ); - assertEquals( 1, result.getFailed().size() ); - assertEquals( PushNodesResult.Reason.ACCESS_DENIED, result.getFailed().iterator().next().getReason() ); + assertEquals( 1, result.getSuccessfulEntries().size() ); + assertEquals( 1, result.getFailedEntries().size() ); + assertEquals( PushNodesResult.Reason.ACCESS_DENIED, result.getFailedEntries().iterator().next().getReason() ); } @Test @@ -152,9 +152,9 @@ public void push_fail_if_node_already_exists() final PushNodesResult result = pushNodes( NodeIds.from( node.id() ), WS_OTHER ); - assertEquals( 1, result.getFailed().size() ); + assertEquals( 1, result.getFailedEntries().size() ); assertEquals( 0, result.getSuccessful().getSize() ); - assertEquals( PushNodesResult.Reason.ALREADY_EXIST, result.getFailed().iterator().next().getReason() ); + assertEquals( PushNodesResult.Reason.ALREADY_EXIST, result.getFailedEntries().iterator().next().getReason() ); } @@ -205,8 +205,8 @@ public void push_child_fail_if_parent_does_not_exists() final PushNodesResult result = pushNodes( NodeIds.from( child.id() ), WS_OTHER ); - assertEquals( 1, result.getFailed().size() ); - assertEquals( PushNodesResult.Reason.PARENT_NOT_FOUND, result.getFailed().iterator().next().getReason() ); + assertEquals( 1, result.getFailedEntries().size() ); + assertEquals( PushNodesResult.Reason.PARENT_NOT_FOUND, result.getFailedEntries().iterator().next().getReason() ); } @Test @@ -241,7 +241,7 @@ public void ensure_order_for_publish_with_children() final PushNodesResult result = pushNodes( NodeIds.from( child2_1.id(), child1_1.id(), child1.id(), child2.id(), node.id() ), WS_OTHER ); - assertTrue( result.getFailed().isEmpty() ); + assertTrue( result.getFailedEntries().isEmpty() ); ctxOther().runWith( () -> { assertNotNull( getNodeById( node.id() ) ); @@ -362,7 +362,7 @@ public void rename_to_name_already_there_but_renamed_in_same_push() final PushNodesResult result = pushNodes( NodeIds.from( b.id(), a.id() ), WS_OTHER ); - assertEquals( 0, result.getFailed().size() ); + assertEquals( 0, result.getFailedEntries().size() ); assertEquals( 2, result.getSuccessful().getSize() ); } diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/event/NodeEventListenerTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/event/NodeEventListenerTest.java index 9cef077b39e..3ddb1ce7709 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/event/NodeEventListenerTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/event/NodeEventListenerTest.java @@ -1,5 +1,7 @@ package com.enonic.xp.repo.impl.node.event; +import java.util.List; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -12,7 +14,6 @@ import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodePath; -import com.enonic.xp.node.PushNodeEntries; import com.enonic.xp.node.PushNodeEntry; import com.enonic.xp.repo.impl.InternalContext; import com.enonic.xp.repo.impl.NodeEvents; @@ -220,13 +221,7 @@ public void node_pushed_event() currentTargetPath( previousNodePath ). build(); - final PushNodeEntries pushNodeEntries = PushNodeEntries.create(). - targetRepo( ContentConstants.CONTENT_REPO_ID ). - targetBranch( ContentConstants.BRANCH_MASTER ). - add( pushNodeEntry ). - build(); - - final Event localEvent = NodeEvents.pushed( pushNodeEntries ); + final Event localEvent = NodeEvents.pushed( List.of( pushNodeEntry ), ContentConstants.BRANCH_MASTER ); nodeEventListener.onEvent( Event.create( localEvent ). localOrigin( false ). diff --git a/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java b/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java index b03e732a17b..9a2b580ab75 100644 --- a/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java +++ b/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java @@ -1,5 +1,6 @@ package com.enonic.xp.lib.node.mapper; +import java.util.List; import java.util.Set; import com.enonic.xp.node.NodeBranchEntry; @@ -36,9 +37,7 @@ private void addFailed( final MapGenerator gen ) { gen.array( "failed" ); - final Set failed = this.result.getFailed(); - - for ( final PushNodesResult.Failed entry : failed ) + for ( final PushNodesResult.Failed entry : this.result.getFailedEntries() ) { gen.map(); gen.value( "id", entry.getNodeBranchEntry().getNodeId() ); diff --git a/modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/PushNodeHandlerTest.java b/modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/PushNodeHandlerTest.java index 25d4b3172c4..7c96d46722e 100644 --- a/modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/PushNodeHandlerTest.java +++ b/modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/PushNodeHandlerTest.java @@ -8,6 +8,7 @@ import com.enonic.xp.node.NodeComparison; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeIds; +import com.enonic.xp.node.NodePath; import com.enonic.xp.node.PushNodesResult; import com.enonic.xp.node.ResolveSyncWorkResult; import com.enonic.xp.node.SyncWorkResolverParams; @@ -20,7 +21,7 @@ public void testExample1() { Mockito.when( nodeService.push( Mockito.eq( NodeIds.from( "a" ) ), Mockito.eq( Branch.from( "otherBranch" ) ) ) ). thenReturn( PushNodesResult.create(). - addSuccess( createEntry( "a" ) ). + addSuccess( createEntry( "a" ), NodePath.create("/a").build() ). build() ); runScript( "/lib/xp/examples/node/push-1.js" ); @@ -38,9 +39,9 @@ public void testExample2() Mockito.when( nodeService.push( Mockito.isA( NodeIds.class ), Mockito.eq( Branch.from( "otherBranch" ) ) ) ). thenReturn( PushNodesResult.create(). - addSuccess( createEntry( "a" ) ). - addSuccess( createEntry( "b" ) ). - addSuccess( createEntry( "c" ) ). + addSuccess( createEntry( "a" ), NodePath.create("/b").build() ). + addSuccess( createEntry( "b"), NodePath.create("/b").build() ). + addSuccess( createEntry( "c" ), NodePath.create("/c").build() ). addFailed( createEntry( "d" ), PushNodesResult.Reason.ACCESS_DENIED ). build() ); @@ -59,8 +60,8 @@ public void testExample3() Mockito.when( nodeService.push( Mockito.isA( NodeIds.class ), Mockito.eq( Branch.from( "otherBranch" ) ) ) ). thenReturn( PushNodesResult.create(). - addSuccess( createEntry( "a" ) ). - addSuccess( createEntry( "d" ) ). + addSuccess( createEntry( "a" ), NodePath.create("/a").build() ). + addSuccess( createEntry( "d" ), NodePath.create("/d").build() ). build() ); runScript( "/lib/xp/examples/node/push-3.js" ); @@ -82,8 +83,8 @@ public void testExampleWithChildren() add( NodeId.from( "c" ) ). build() ), Mockito.eq( Branch.from( "otherBranch" ) ) ) ). thenReturn( PushNodesResult.create(). - addSuccess( createEntry( "a" ) ). - addSuccess( createEntry( "b" ) ). + addSuccess( createEntry( "a" ), NodePath.create("/a").build() ). + addSuccess( createEntry( "b" ), NodePath.create("/b").build() ). addFailed( createEntry( "c" ), PushNodesResult.Reason.ACCESS_DENIED ). build() ); diff --git a/modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapperTest.java b/modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapperTest.java index 1708024e8dc..637546d52a3 100644 --- a/modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapperTest.java +++ b/modules/lib/lib-node/src/test/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapperTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.Test; +import com.enonic.xp.node.NodePath; import com.enonic.xp.node.PushNodesResult; import com.enonic.xp.script.serializer.JsonMapGenerator; @@ -12,9 +13,7 @@ public class PushNodesResultMapperTest public void single_successful() throws Exception { - final PushNodesResult result = PushNodesResult.create(). - addSuccess( createEntry( "a" ) ). - build(); + final PushNodesResult result = PushNodesResult.create().addSuccess( createEntry( "a" ), NodePath.create( "/a" ).build() ).build(); final JsonMapGenerator jsonGenerator = new JsonMapGenerator(); new PushNodesResultMapper( result ).serialize( jsonGenerator ); @@ -40,11 +39,11 @@ public void single_failed() public void complex() throws Exception { - final PushNodesResult result = PushNodesResult.create(). - addSuccess( createEntry( "a" ) ). - addSuccess( createEntry( "b" ) ). - addSuccess( createEntry( "c" ) ). - addFailed( createEntry( "d" ), PushNodesResult.Reason.ACCESS_DENIED ). + final PushNodesResult result = PushNodesResult.create() + .addSuccess( createEntry( "a" ), NodePath.create( "/a" ).build() ) + .addSuccess( createEntry( "b" ), NodePath.create( "/b" ).build() ) + .addSuccess( createEntry( "c" ), NodePath.create( "/c" ).build() ) + .addFailed( createEntry( "d" ), PushNodesResult.Reason.ACCESS_DENIED ). addFailed( createEntry( "e" ), PushNodesResult.Reason.PARENT_NOT_FOUND ). addFailed( createEntry( "f" ), PushNodesResult.Reason.PARENT_NOT_FOUND ). build(); From f531a348b84d9892d9dac40b6f38c304a9e3016b Mon Sep 17 00:00:00 2001 From: rymsha Date: Mon, 12 Dec 2022 19:31:10 +0100 Subject: [PATCH 04/11] save --- .../elasticsearch/executor/CopyExecutor.java | 11 +++++------ .../impl/storage/IndexDataServiceImpl.java | 19 +++++++++---------- .../impl/storage/IndexPushNodeParams.java | 17 ----------------- .../impl/storage/NodeStorageServiceImpl.java | 15 +++++++-------- 4 files changed, 21 insertions(+), 41 deletions(-) diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/executor/CopyExecutor.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/executor/CopyExecutor.java index 3935a832927..93d5c754974 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/executor/CopyExecutor.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/elasticsearch/executor/CopyExecutor.java @@ -106,12 +106,11 @@ private void doCopy( final SearchResponse scrollResp ) for ( final org.elasticsearch.search.SearchHit hit : hits ) { - bulkRequest.add( Requests.indexRequest(). - id( hit.id() ). - index( IndexNameResolver.resolveSearchIndexName( copyRequest.getTargetRepo() ) ). - type( SearchStorageType.from( copyRequest.getTargetBranch() ).getName() ). - source( hit.source() ). - refresh( false ) ); + bulkRequest.add( Requests.indexRequest() + .id( hit.id() ) + .index( IndexNameResolver.resolveSearchIndexName( copyRequest.getTargetRepo() ) ) + .type( SearchStorageType.from( copyRequest.getTargetBranch() ).getName() ) + .source( hit.source() ) ); } final Stopwatch timer = Stopwatch.createStarted(); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexDataServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexDataServiceImpl.java index 811dde3a0d1..4f20dc71d18 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexDataServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexDataServiceImpl.java @@ -110,19 +110,18 @@ public void store( final Node node, final InternalContext context ) this.storageDao.store( indexDocument ); } - @Override public void push( final IndexPushNodeParams pushNodeParams, final InternalContext context ) { - this.storageDao.copy( CopyRequest.create(). - storageSettings( StorageSource.create(). - storageName( SearchStorageName.from( context.getRepositoryId() ) ). - storageType( SearchStorageType.from( context.getBranch() ) ). - build() ). - nodeIds( pushNodeParams.getNodeIds() ). - targetBranch( pushNodeParams.getTargetBranch() ). - targetRepo( pushNodeParams.getTargetRepo() ). - build() ); + this.storageDao.copy( CopyRequest.create() + .storageSettings( StorageSource.create() + .storageName( SearchStorageName.from( context.getRepositoryId() ) ) + .storageType( SearchStorageType.from( context.getBranch() ) ) + .build() ) + .nodeIds( pushNodeParams.getNodeIds() ) + .targetBranch( pushNodeParams.getTargetBranch() ) + .targetRepo( context.getRepositoryId() ) + .build() ); } @Reference diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexPushNodeParams.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexPushNodeParams.java index 84f5e077cfc..372e29f2b47 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexPushNodeParams.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/IndexPushNodeParams.java @@ -2,7 +2,6 @@ import com.enonic.xp.branch.Branch; import com.enonic.xp.node.NodeIds; -import com.enonic.xp.repository.RepositoryId; public final class IndexPushNodeParams { @@ -10,13 +9,10 @@ public final class IndexPushNodeParams private final Branch targetBranch; - private final RepositoryId targetRepo; - private IndexPushNodeParams( Builder builder ) { nodeIds = builder.nodeIds; targetBranch = builder.targetBranch; - targetRepo = builder.targetRepo; } public NodeIds getNodeIds() @@ -29,11 +25,6 @@ public Branch getTargetBranch() return targetBranch; } - public RepositoryId getTargetRepo() - { - return targetRepo; - } - public static Builder create() { return new Builder(); @@ -45,8 +36,6 @@ public static final class Builder private Branch targetBranch; - private RepositoryId targetRepo; - private Builder() { } @@ -63,12 +52,6 @@ public Builder targetBranch( final Branch targetBranch ) return this; } - public Builder targetRepo( final RepositoryId targetRepo ) - { - this.targetRepo = targetRepo; - return this; - } - public IndexPushNodeParams build() { return new IndexPushNodeParams( this ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java index 2338da2844f..5823c8435bd 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java @@ -134,6 +134,7 @@ public void storeCommit( final StoreNodeCommitParams params, final InternalConte public Node move( final StoreMovedNodeParams params, final InternalContext context ) { final Node node = params.getNode(); + final NodeBranchEntry nodeBranchEntry = this.branchService.get( node.id(), context ); final NodeVersionKey nodeVersionKey = nodeVersionService.store( NodeVersion.from( node ), context ); @@ -156,12 +157,12 @@ public Node move( final StoreMovedNodeParams params, final InternalContext conte nodeVersionId = node.getNodeVersionId(); } - this.branchService.store( NodeBranchEntry.create(). - nodeVersionId( nodeVersionId ). - nodeVersionKey( nodeVersionKey ). - nodeId( node.id() ). - timestamp( node.getTimestamp() ). - nodePath( node.path() ). + this.branchService.store( NodeBranchEntry.create() + .nodeId( node.id() ) + .nodeVersionId( nodeVersionId ) + .nodeVersionKey( nodeVersionKey ) + .nodePath( node.path() ) + .timestamp( node.getTimestamp() ). build(), nodeBranchEntry.getNodePath(), context ); this.indexDataService.store( node, context ); @@ -222,7 +223,6 @@ public void push( final Collection entries, final Branch target, this.indexDataService.push( IndexPushNodeParams.create() .nodeIds( nodeIds ) .targetBranch( target ) - .targetRepo(context.getRepositoryId() ) .build(), context ); } @@ -238,7 +238,6 @@ public void push( final Node node, final Branch target, final InternalContext co this.indexDataService.push( IndexPushNodeParams.create(). nodeIds( NodeIds.from( node.id() ) ). targetBranch( target ). - targetRepo( context.getRepositoryId() ). build(), context ); } From aa794be92301b806c7f60a5541ed5f4948c9f940 Mon Sep 17 00:00:00 2001 From: rymsha Date: Tue, 13 Dec 2022 17:19:07 +0100 Subject: [PATCH 05/11] save --- .../java/com/enonic/xp/node/NodeType.java | 10 ++-- .../impl/content/AbstractContentCommand.java | 24 ++++---- ...tractCreatingOrUpdatingContentCommand.java | 11 +--- .../xp/core/impl/content/ContentEvents.java | 56 +++++++++++++++++++ .../core/impl/content/ContentPublisher.java | 53 ++++++++++++++++++ .../core/impl/content/ContentServiceImpl.java | 8 +++ .../impl/content/CreateContentCommand.java | 10 ---- .../core/impl/content/CreateMediaCommand.java | 28 ++++++---- .../core/impl/content/GetBinaryCommand.java | 12 ---- .../impl/content/GetContentByIdCommand.java | 11 ---- .../impl/content/GetContentByPathCommand.java | 13 ----- .../impl/content/GetNearestSiteCommand.java | 16 +++++- .../impl/content/PublishContentCommand.java | 45 ++++++++++++++- .../impl/content/RenameContentCommand.java | 7 ++- .../impl/content/ReprocessContentCommand.java | 31 ++++++---- .../impl/content/UpdateContentCommand.java | 10 ---- .../core/impl/content/UpdateMediaCommand.java | 18 ++---- .../AbstractElasticsearchIntegrationTest.java | 2 +- .../EmbeddedElasticsearchServer.java | 52 +++++++++-------- .../node/mapper/PushNodesResultMapper.java | 3 - 20 files changed, 273 insertions(+), 147 deletions(-) create mode 100644 modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEvents.java create mode 100644 modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentPublisher.java diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeType.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeType.java index 07b05766d97..4b5714b1b2c 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeType.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeType.java @@ -1,17 +1,19 @@ package com.enonic.xp.node; +import java.util.Objects; + import com.enonic.xp.annotation.PublicApi; @PublicApi public final class NodeType { - public static final NodeType DEFAULT_NODE_COLLECTION = NodeType.from( "default" ); + public static final NodeType DEFAULT_NODE_COLLECTION = new NodeType( "default" ); private final String name; private NodeType( final String name ) { - this.name = name; + this.name = Objects.requireNonNull( name ); } public static NodeType from( final String name ) @@ -38,13 +40,13 @@ public boolean equals( final Object o ) final NodeType that = (NodeType) o; - return name != null ? name.equals( that.name ) : that.name == null; + return name.equals( that.name ); } @Override public int hashCode() { - return name != null ? name.hashCode() : 0; + return name.hashCode(); } @Override diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractContentCommand.java index a6b704e8641..2edb8a07bbf 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractContentCommand.java @@ -68,7 +68,13 @@ private static Predicate allowContentTypeFilter( final Applicat Content getContent( final ContentId contentId ) { - final Content content = GetContentByIdCommand.create( contentId, this ).build().execute(); + final Content content = GetContentByIdCommand.create( contentId ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) + .build() + .execute(); if ( content == null ) { throw new ContentNotFoundException( contentId, ContextAccessor.current().getBranch() ); @@ -187,7 +193,13 @@ protected void validateParentChildRelations( final ContentPath parentPath, final } } - final Content parent = GetContentByPathCommand.create( parentPath, this ).build().execute(); + final Content parent = GetContentByPathCommand.create( parentPath ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) + .build() + .execute(); if (parent == null) { throw new IllegalStateException( String.format( "Cannot read parent type with path %s", parentPath ) ); @@ -239,14 +251,6 @@ public static class Builder> { } - Builder( final AbstractContentCommand source ) - { - this.nodeService = source.nodeService; - this.contentTypeService = source.contentTypeService; - this.eventPublisher = source.eventPublisher; - this.translator = source.translator; - } - @SuppressWarnings("unchecked") public B nodeService( final NodeService nodeService ) { 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..0a429d06dbf 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 @@ -8,8 +8,8 @@ import com.enonic.xp.attachment.CreateAttachment; import com.enonic.xp.attachment.CreateAttachments; -import com.enonic.xp.content.processor.ContentProcessor; import com.enonic.xp.content.ContentValidator; +import com.enonic.xp.content.processor.ContentProcessor; import com.enonic.xp.context.Context; import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.core.internal.FileNames; @@ -64,15 +64,6 @@ public static class Builder> { } - Builder( final AbstractCreatingOrUpdatingContentCommand source ) - { - super( source ); - this.xDataService = source.xDataService; - this.siteService = source.siteService; - this.contentProcessors = source.contentProcessors; - this.contentValidators = source.contentValidators; - } - @SuppressWarnings("unchecked") B xDataService( final XDataService xDataService ) { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEvents.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEvents.java new file mode 100644 index 00000000000..d3bd2b073f1 --- /dev/null +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEvents.java @@ -0,0 +1,56 @@ +package com.enonic.xp.core.impl.content; + +import java.util.Collection; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import com.enonic.xp.content.Content; +import com.enonic.xp.content.ContentPublishInfo; +import com.enonic.xp.context.ContextAccessor; +import com.enonic.xp.event.Event; + +public final class ContentEvents +{ + private ContentEvents() + { + } + + public static Event online( Collection contents ) + { + return Event.create( "content.online" ).distributed( true ).value( "contents", nodesToList( contents ) ).build(); + } + + public static Event offline( Collection contents ) + { + return Event.create( "content.offline" ).distributed( true ).value( "contents", nodesToList( contents ) ).build(); + } + + private static ImmutableList> nodesToList( final Collection contents ) + { + return contents.stream().map( ContentEvents::nodeToMap ).collect( ImmutableList.toImmutableList() ); + } + + private static ImmutableMap nodeToMap( final Content content ) + { + final ImmutableMap.Builder builder = ImmutableMap.builder() + .put( "id", content.getId().toString() ) + .put( "path", content.getPath().toString() ) + .put( "repo", ContextAccessor.current().getRepositoryId().toString() ); + + final ContentPublishInfo publishInfo = content.getPublishInfo(); + if ( publishInfo != null ) + { + if ( publishInfo.getFrom() != null ) + { + builder.put( "from", publishInfo.getFrom().toString() ); + } + if ( publishInfo.getTo() != null ) + { + builder.put( "to", publishInfo.getTo().toString() ); + } + } + + return builder.build(); + } +} diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentPublisher.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentPublisher.java new file mode 100644 index 00000000000..92f62e71055 --- /dev/null +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentPublisher.java @@ -0,0 +1,53 @@ +package com.enonic.xp.core.impl.content; + +import java.util.List; +import java.util.concurrent.Executors; + +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Deactivate; +import org.osgi.service.component.annotations.Reference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.enonic.xp.content.Content; +import com.enonic.xp.core.internal.concurrent.SimpleRecurringJobScheduler; +import com.enonic.xp.event.EventPublisher; + +@Component(service = ContentPublisher.class) +public class ContentPublisher +{ + private static final Logger LOG = LoggerFactory.getLogger( ContentPublisher.class ); + + private final EventPublisher eventPublisher; + + private final SimpleRecurringJobScheduler jobScheduler; + + + @Activate + public ContentPublisher( @Reference final EventPublisher eventPublisher ) + { + this.eventPublisher = eventPublisher; + this.jobScheduler = new SimpleRecurringJobScheduler( Executors::newSingleThreadScheduledExecutor, "content-publisher-thread" ); + } + + @Activate + public void activate() + { + //jobScheduler.scheduleWithFixedDelay( , Duration.ofSeconds( 1 ), Duration.ofSeconds( 1 ), + // e -> LOG.debug( "Error error while sending Content Events", e ), + // e -> LOG.error( "Error error while sending Content Events, no further attempts will be made", e ) ); + } + + @Deactivate + void deactivate() + { + jobScheduler.shutdownNow(); + } + + public void put( final List online, final List offline ) + { + this.eventPublisher.publish( ContentEvents.offline( offline ) ); + this.eventPublisher.publish( ContentEvents.online( online ) ); + } +} 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 56f9f301866..da6c2343db1 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 @@ -153,6 +153,8 @@ public class ContentServiceImpl private EventPublisher eventPublisher; + private ContentPublisher contentPublisher; + private MediaInfoService mediaInfoService; private XDataService xDataService; @@ -425,6 +427,7 @@ public PublishContentResult publish( final PushContentParams params ) contentTypeService( this.contentTypeService ). translator( this.translator ). eventPublisher( this.eventPublisher ). + contentPublisher( contentPublisher ). contentIds( params.getContentIds() ). excludedContentIds( params.getExcludedContentIds() ). contentPublishInfo( params.getContentPublishInfo() ). @@ -1404,6 +1407,11 @@ public void setContentAuditLogSupport( final ContentAuditLogSupport contentAudit this.contentAuditLogSupport = contentAuditLogSupport; } + @Reference + public void setContentPublisher( final ContentPublisher contentPublisher ) + { + this.contentPublisher = contentPublisher; + } @Reference public void setProjectService( final ProjectService projectService ) { 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 be0f28a5940..f5d738f29a4 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 @@ -82,11 +82,6 @@ static Builder create() return new Builder(); } - static Builder create( AbstractCreatingOrUpdatingContentCommand source ) - { - return new Builder( source ); - } - Content execute() { return doExecute(); @@ -339,11 +334,6 @@ private Builder() { } - private Builder( final AbstractCreatingOrUpdatingContentCommand source ) - { - super( source ); - } - Builder params( final CreateContentParams params ) { this.params = params; 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 ffd58470c09..3c6dfa07b25 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 @@ -105,18 +105,22 @@ private Content doExecute() inheritPermissions( true ). build(); - final CreateContentCommand createCommand = CreateContentCommand.create( this ). - mediaInfo( mediaInfo ). - params( createContentParams ). - siteService( this.siteService ). - xDataService( this.xDataService ). - formDefaultValuesProcessor( this.formDefaultValuesProcessor ). - pageDescriptorService( this.pageDescriptorService ). - partDescriptorService( this.partDescriptorService ). - layoutDescriptorService( this.layoutDescriptorService ). - contentDataSerializer( this.contentDataSerializer ). - allowUnsafeAttachmentNames( this.allowUnsafeAttachmentNames ). - build(); + final CreateContentCommand createCommand = CreateContentCommand.create() + .mediaInfo( mediaInfo ) + .params( createContentParams ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) + .siteService( this.siteService ) + .xDataService( this.xDataService ) + .formDefaultValuesProcessor( this.formDefaultValuesProcessor ) + .pageDescriptorService( this.pageDescriptorService ) + .partDescriptorService( this.partDescriptorService ) + .layoutDescriptorService( this.layoutDescriptorService ) + .contentDataSerializer( this.contentDataSerializer ) + .allowUnsafeAttachmentNames( this.allowUnsafeAttachmentNames ) + .build(); return createCommand.execute(); } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetBinaryCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetBinaryCommand.java index 09427b8e27b..2debeb3b0a8 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetBinaryCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetBinaryCommand.java @@ -45,11 +45,6 @@ public static Builder create( final ContentId contentId, final BinaryReference b return new Builder( contentId, binaryReference ); } - public static Builder create( final ContentId contentId, final BinaryReference binaryReference, final AbstractContentCommand source ) - { - return new Builder( contentId, binaryReference, source ); - } - public static class Builder extends AbstractContentCommand.Builder { @@ -63,13 +58,6 @@ public static class Builder this.binaryReference = binaryReference; } - Builder( final ContentId contentId, final BinaryReference binaryReference, AbstractContentCommand source ) - { - super( source ); - this.contentId = contentId; - this.binaryReference = binaryReference; - } - @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByIdCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByIdCommand.java index 800c6e6cadd..551bfdd9f43 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByIdCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByIdCommand.java @@ -41,11 +41,6 @@ Content execute() return content; } - public static Builder create( final ContentId contentId, final AbstractContentCommand source ) - { - return new Builder( contentId, source ); - } - public static Builder create( final ContentId contentId ) { return new Builder( contentId ); @@ -61,12 +56,6 @@ public static class Builder this.contentId = contentId; } - Builder( final ContentId contentId, AbstractContentCommand source ) - { - super( source ); - this.contentId = contentId; - } - @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByPathCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByPathCommand.java index a8d3df2973b..cfa21a3bb55 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByPathCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetContentByPathCommand.java @@ -3,9 +3,7 @@ import com.google.common.base.Preconditions; import com.enonic.xp.content.Content; -import com.enonic.xp.content.ContentNotFoundException; import com.enonic.xp.content.ContentPath; -import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.Node; import com.enonic.xp.node.NodePath; @@ -36,11 +34,6 @@ Content execute() return filter( content ); } - static Builder create( final ContentPath contentPath, final AbstractContentCommand source ) - { - return new Builder( contentPath, source ); - } - public static Builder create( final ContentPath contentPath ) { return new Builder( contentPath ); @@ -56,12 +49,6 @@ public static class Builder this.contentPath = contentPath; } - Builder( final ContentPath contentPath, AbstractContentCommand source ) - { - super( source ); - this.contentPath = contentPath; - } - @Override void validate() { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetNearestSiteCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetNearestSiteCommand.java index 77d463fb908..ff87bcbbd50 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetNearestSiteCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetNearestSiteCommand.java @@ -23,7 +23,13 @@ public static Builder create() public Site execute() { - final Content content = GetContentByIdCommand.create( contentId, this ).build().execute(); + final Content content = GetContentByIdCommand.create( contentId ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) + .build() + .execute(); if ( content == null ) { @@ -49,7 +55,13 @@ private Site returnIfSiteOrTryParent( final ContentPath contentPath ) return null; } - final Content content = GetContentByPathCommand.create( contentPath, this ).build().execute(); + final Content content = GetContentByPathCommand.create( contentPath ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) + .build() + .execute(); if ( content == null ) { diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java index 3a7018e7e7d..fa8c88f8f4a 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java @@ -1,11 +1,13 @@ package com.enonic.xp.core.impl.content; import java.time.Instant; +import java.util.List; import java.util.stream.Collectors; import com.google.common.base.Preconditions; import com.enonic.xp.content.CompareContentResults; +import com.enonic.xp.content.Content; import com.enonic.xp.content.ContentConstants; import com.enonic.xp.content.ContentIds; import com.enonic.xp.content.ContentPropertyNames; @@ -17,6 +19,7 @@ import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.context.ContextBuilder; import com.enonic.xp.data.PropertySet; +import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeBranchEntries; import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodeCommitEntry; @@ -46,6 +49,8 @@ public class PublishContentCommand private final PushContentListener publishContentListener; + private final ContentPublisher contentPublisher; + private final String message; private PublishContentCommand( final Builder builder ) @@ -59,6 +64,7 @@ private PublishContentCommand( final Builder builder ) this.resultBuilder = PublishContentResult.create(); this.publishContentListener = builder.publishContentListener; this.message = builder.message; + this.contentPublisher = builder.contentPublisher; } public static Builder create() @@ -140,13 +146,39 @@ private void doPushNodes( final NodeIds nodesToPush ) } } ); - commitPushedNodes( pushNodesResult.getSuccessful() ); + final NodeBranchEntries successful = pushNodesResult.getSuccessful(); + + commitPushedNodes( successful ); + + List contents = successful.stream() + .map( nodeBranchEntry -> translator.fromNode( + Node.create( nodeService.getByNodeVersionKey( nodeBranchEntry.getNodeVersionKey() ) ) + .nodeVersionId( nodeBranchEntry.getVersionId() ) + .timestamp( nodeBranchEntry.getTimestamp() ) + .parentPath( nodeBranchEntry.getNodePath().getParentPath() ) + .name( nodeBranchEntry.getNodePath().getName() ) + .build(), false ) ) + .collect( Collectors.toList() ); + + List contentsOffline = pushNodesResult.getSuccessfulEntries() + .stream() + .filter( e -> e.getCurrentTargetPath() != null && !e.getCurrentTargetPath().equals( e.getNodeBranchEntry().getNodePath() ) ) + .map( e -> translator.fromNode( + Node.create( nodeService.getByNodeVersionKey( e.getNodeBranchEntry().getNodeVersionKey() ) ) + .nodeVersionId( e.getNodeBranchEntry().getVersionId() ) + .timestamp( e.getNodeBranchEntry().getTimestamp() ) + .parentPath( e.getCurrentTargetPath().getParentPath() ) + .name( e.getCurrentTargetPath().getName() ) + .build(), false ) ) + .collect( Collectors.toList() ); + + this.contentPublisher.put( contents, contentsOffline ); this.resultBuilder.setFailed( ContentNodeHelper.toContentIds( pushNodesResult.getFailedEntries() .stream() .map( failed -> failed.getNodeBranchEntry().getNodeId() ) .collect( Collectors.toList() ) ) ); - this.resultBuilder.setPushed( ContentNodeHelper.toContentIds( pushNodesResult.getSuccessful().getKeys() ) ); + this.resultBuilder.setPushed( ContentNodeHelper.toContentIds( successful.getKeys() ) ); } private void setPublishInfo( final NodeIds nodesToPush ) @@ -244,6 +276,8 @@ public static class Builder private String message; + private ContentPublisher contentPublisher; + public Builder contentIds( final ContentIds contentIds ) { this.contentIds = contentIds; @@ -297,6 +331,13 @@ public Builder message( final String message ) return this; } + public Builder contentPublisher( final ContentPublisher contentPublisher ) + { + this.contentPublisher = contentPublisher; + return this; + } + + @Override void validate() { 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 73666acda69..838282a910b 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 @@ -113,8 +113,11 @@ private Content updateValidState( final Content content ) .stopInherit( false ) .editor( edit -> edit.valid = !content.isValid() ); - return UpdateContentCommand.create( this ) - .params( updateContentParams ) + return UpdateContentCommand.create( updateContentParams ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) .siteService( siteService ) .contentTypeService( contentTypeService ) .xDataService( this.xDataService ) 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 2f2e8bbe52b..38e688b67c8 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 @@ -70,22 +70,33 @@ private Content reprocessMedia( final Media media ) return media; } final ContentId id = media.getId(); - final ByteSource binary = GetBinaryCommand.create( id, source.getBinaryReference(), this ).build().execute(); + final ByteSource binary = GetBinaryCommand.create( id, source.getBinaryReference() ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) + .build() + .execute(); final UpdateMediaParams updateMediaParams = new UpdateMediaParams(). byteSource( binary ). mimeType( source.getMimeType() ). content( id ). name( source.getName() ); - return UpdateMediaCommand.create( updateMediaParams, this ). - mediaInfoService( mediaInfoService ). - siteService( this.siteService ). - contentTypeService( this.contentTypeService ). - pageDescriptorService( this.pageDescriptorService ). - partDescriptorService( this.partDescriptorService ). - layoutDescriptorService( this.layoutDescriptorService ). - contentDataSerializer( this.contentDataSerializer ). - build().execute(); + return UpdateMediaCommand.create( updateMediaParams ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) + .mediaInfoService( mediaInfoService ) + .siteService( this.siteService ) + .contentTypeService( this.contentTypeService ) + .pageDescriptorService( this.pageDescriptorService ) + .partDescriptorService( this.partDescriptorService ) + .layoutDescriptorService( this.layoutDescriptorService ) + .contentDataSerializer( this.contentDataSerializer ) + .build() + .execute(); } private Content revertModifiedTime( final Content content, final Instant modifiedTime ) 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 b5f073f2281..a5a50836b39 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 @@ -88,11 +88,6 @@ public static Builder create( final UpdateContentParams params ) return new Builder( params ); } - public static Builder create( final AbstractCreatingOrUpdatingContentCommand source ) - { - return new Builder( source ); - } - Content execute() { params.validate(); @@ -373,11 +368,6 @@ public static class Builder this.params = params; } - Builder( final AbstractCreatingOrUpdatingContentCommand source ) - { - super( source ); - } - Builder params( final UpdateContentParams value ) { this.params = value; 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 d2ec027e057..0bfd7095145 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 @@ -49,11 +49,6 @@ public static Builder create( final UpdateMediaParams params ) return new Builder( params ); } - public static Builder create( final UpdateMediaParams params, final AbstractCreatingOrUpdatingContentCommand source ) - { - return new Builder( params, source ); - } - Content execute() { params.validate(); @@ -107,8 +102,11 @@ private Content doExecute() editable.workflowInfo = params.getWorkflowInfo(); } ); - return UpdateContentCommand.create( this ) - .params( updateParams ) + return UpdateContentCommand.create( updateParams ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .eventPublisher( this.eventPublisher ) .mediaInfo( mediaInfo ) .contentTypeService( this.contentTypeService ) .siteService( this.siteService ) @@ -141,12 +139,6 @@ public static class Builder this.params = params; } - Builder( final UpdateMediaParams params, final AbstractCreatingOrUpdatingContentCommand source ) - { - super( source ); - this.params = params; - } - public Builder mediaInfoService( final MediaInfoService value ) { this.mediaInfoService = value; diff --git a/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/elasticsearch/AbstractElasticsearchIntegrationTest.java b/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/elasticsearch/AbstractElasticsearchIntegrationTest.java index 17196118f02..ad19ed3efc0 100644 --- a/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/elasticsearch/AbstractElasticsearchIntegrationTest.java +++ b/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/elasticsearch/AbstractElasticsearchIntegrationTest.java @@ -83,7 +83,7 @@ static class ElasticsearchFixture elasticsearchTemporaryFolder = Files.createTempDirectory( "elasticsearchFixture" ); - server = new EmbeddedElasticsearchServer( elasticsearchTemporaryFolder.toFile() ); + server = new EmbeddedElasticsearchServer( elasticsearchTemporaryFolder ); client = server.getClient(); } diff --git a/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/elasticsearch/EmbeddedElasticsearchServer.java b/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/elasticsearch/EmbeddedElasticsearchServer.java index 3b2645577fd..c8dd8933b08 100644 --- a/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/elasticsearch/EmbeddedElasticsearchServer.java +++ b/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/elasticsearch/EmbeddedElasticsearchServer.java @@ -1,7 +1,9 @@ package com.enonic.xp.repo.impl.elasticsearch; -import java.io.File; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; import java.nio.file.Path; import org.elasticsearch.client.Client; @@ -14,41 +16,47 @@ public class EmbeddedElasticsearchServer { - private static final String ROOT_DATA_DIRECTORY = "elasticsearch-data"; private final Node node; - private final String dataDirectory; - private static final Logger LOG = LoggerFactory.getLogger( AbstractElasticsearchIntegrationTest.class ); - private final long now = System.currentTimeMillis(); + private final Path snaphotsDir; - private final File snaphotsDir; - - public EmbeddedElasticsearchServer( final File rootDirectory ) + public EmbeddedElasticsearchServer( final Path rootDirectory ) { LOG.info( " --- Starting ES integration test server instance" ); System.setProperty( "mapper.allow_dots_in_name", "true" ); - this.dataDirectory = new File( rootDirectory, ROOT_DATA_DIRECTORY ).toString(); - - final File pathHome = new File( this.dataDirectory, "index" ); - pathHome.mkdir(); - final File pathData = new File( this.dataDirectory, "data" ); - pathData.mkdir(); - snaphotsDir = new File( this.dataDirectory, "repo" ); - snaphotsDir.mkdir(); + final Path pathHome; + final Path pathData; + try + { + Path dataDirectory = rootDirectory.resolve( ROOT_DATA_DIRECTORY ); + Files.createDirectory( dataDirectory ); + pathHome = dataDirectory.resolve( "index" ); + Files.createDirectory( pathHome ); + pathData = dataDirectory.resolve( "data" ); + Files.createDirectory( pathData ); + snaphotsDir = dataDirectory.resolve( "repo" ); + Files.createDirectory( snaphotsDir ); + } + catch ( IOException e ) + { + throw new UncheckedIOException( e ); + } + + long now = System.currentTimeMillis(); Settings.Builder testServerSetup = Settings.settingsBuilder() - .put( "name", "repo-node-" + this.now ) + .put( "name", "repo-node-" + now ) .put( "node.local", true ) .put( "action.auto_create_index", false ) - .put( "path.data", pathData.getPath() ) - .put( "path.home", pathHome.getPath() ) - .put( "path.repo", this.snaphotsDir.getPath() ) - .put( "cluster.name", "repo-test-cluster-" + this.now ) + .put( "path.data", pathData.toString() ) + .put( "path.home", pathHome.toString() ) + .put( "path.repo", this.snaphotsDir.toString() ) + .put( "cluster.name", "repo-test-cluster-" + now ) .put( "http.enabled", false ) .put( "index.translog.durability", "async" ) .put( "index.translog.sync_interval", "15m" ) @@ -73,6 +81,6 @@ public void shutdown() public Path getSnapshotsDir() { - return this.snaphotsDir.toPath(); + return this.snaphotsDir; } } diff --git a/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java b/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java index 9a2b580ab75..1ef5ae43509 100644 --- a/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java +++ b/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java @@ -1,8 +1,5 @@ package com.enonic.xp.lib.node.mapper; -import java.util.List; -import java.util.Set; - import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.PushNodesResult; import com.enonic.xp.script.serializer.MapGenerator; From 21a2994a91016b1692fbf93b8a4aefef9523fd8b Mon Sep 17 00:00:00 2001 From: rymsha Date: Wed, 14 Dec 2022 16:50:49 +0100 Subject: [PATCH 06/11] save --- .../com/enonic/xp/node/DeleteNodeParams.java | 79 +++++++++++++++++++ .../com/enonic/xp/node/DeleteNodeResult.java | 42 ++++++++++ .../com/enonic/xp/node/MoveNodeResult.java | 29 +------ .../java/com/enonic/xp/node/NodeService.java | 2 + ...blisher.java => ContentEventProducer.java} | 14 +++- .../core/impl/content/ContentServiceImpl.java | 8 +- .../impl/content/PublishContentCommand.java | 12 +-- .../impl/node/AbstractDeleteNodeCommand.java | 48 +++++++++-- .../repo/impl/node/DeleteNodeByIdCommand.java | 14 +--- .../impl/node/DeleteNodeByPathCommand.java | 2 +- .../xp/repo/impl/node/NodeServiceImpl.java | 17 +++- .../enonic/xp/repo/impl/NodeEventsTest.java | 1 - .../node/event/NodeEventListenerTest.java | 1 - 13 files changed, 203 insertions(+), 66 deletions(-) create mode 100644 modules/core/core-api/src/main/java/com/enonic/xp/node/DeleteNodeParams.java create mode 100644 modules/core/core-api/src/main/java/com/enonic/xp/node/DeleteNodeResult.java rename modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/{ContentPublisher.java => ContentEventProducer.java} (83%) diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/DeleteNodeParams.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/DeleteNodeParams.java new file mode 100644 index 00000000000..b6ebb881cad --- /dev/null +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/DeleteNodeParams.java @@ -0,0 +1,79 @@ +package com.enonic.xp.node; + +import com.google.common.base.Preconditions; + +import com.enonic.xp.annotation.PublicApi; + +@PublicApi +public final class DeleteNodeParams +{ + private final NodeId nodeId; + + private final RefreshMode refresh; + + private final DeleteNodeListener deleteNodeListener; + + private DeleteNodeParams( final Builder builder ) + { + this.nodeId = builder.nodeId; + this.refresh = builder.refresh; + this.deleteNodeListener = builder.deleteNodeListener; + } + + public NodeId getNodeId() + { + return nodeId; + } + + public RefreshMode getRefresh() + { + return refresh; + } + + public DeleteNodeListener getDeleteNodeListener() + { + return deleteNodeListener; + } + + public static Builder create() + { + return new DeleteNodeParams.Builder(); + } + + public static final class Builder + { + private NodeId nodeId; + + private RefreshMode refresh; + + private DeleteNodeListener deleteNodeListener; + + private Builder() + { + } + + public Builder nodeId( final NodeId nodeId ) + { + this.nodeId = nodeId; + return this; + } + + public Builder refresh( final RefreshMode refresh ) + { + this.refresh = refresh; + return this; + } + + public Builder deleteNodeListener( final DeleteNodeListener deleteNodeListener ) + { + this.deleteNodeListener = deleteNodeListener; + return this; + } + + public DeleteNodeParams build() + { + Preconditions.checkNotNull( this.nodeId, "id cannot be null" ); + return new DeleteNodeParams( this ); + } + } +} diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/DeleteNodeResult.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/DeleteNodeResult.java new file mode 100644 index 00000000000..f8d9dfc8e1d --- /dev/null +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/DeleteNodeResult.java @@ -0,0 +1,42 @@ +package com.enonic.xp.node; + +public final class DeleteNodeResult +{ + private final NodeBranchEntries nodeBranchEntries; + + private DeleteNodeResult( final Builder builder ) + { + this.nodeBranchEntries = builder.nodeBranchEntries; + } + + public NodeBranchEntries getNodeBranchEntries() + { + return nodeBranchEntries; + } + + public static Builder create() + { + return new DeleteNodeResult.Builder(); + } + + public static class Builder + { + + private NodeBranchEntries nodeBranchEntries; + + private Builder() + { + } + + public Builder nodeBranchEntries( final NodeBranchEntries nodeBranchEntries ) + { + this.nodeBranchEntries = nodeBranchEntries; + return this; + } + + public DeleteNodeResult build() + { + return new DeleteNodeResult( this ); + } + } +} diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/MoveNodeResult.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/MoveNodeResult.java index c5bb8833d6a..730134681e0 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/node/MoveNodeResult.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/MoveNodeResult.java @@ -9,21 +9,9 @@ public class MoveNodeResult { private final List movedNodes; - private final Node sourceNode; - - private MoveNodeResult( Builder builder ) + private MoveNodeResult( final Builder builder ) { - this.sourceNode = builder.sourceNode; - - final List movedNodes = builder.movedNodes.build(); - if ( builder.sourceNode != null && builder.targetNode != null && movedNodes.isEmpty() ) - { - this.movedNodes = List.of( MovedNode.create().node( builder.targetNode ).previousPath( builder.sourceNode.path() ).build() ); - } - else - { - this.movedNodes = builder.movedNodes.build(); - } + this.movedNodes = builder.movedNodes.build(); } public static Builder create() @@ -39,7 +27,7 @@ public List getMovedNodes() @Deprecated public Node getSourceNode() { - return sourceNode; + return null; } @Deprecated @@ -111,10 +99,6 @@ public static final class Builder { private final ImmutableList.Builder movedNodes = ImmutableList.builder(); - private Node sourceNode; - - private Node targetNode; - private Builder() { } @@ -128,24 +112,17 @@ public Builder addMovedNode( final MovedNode node ) @Deprecated public Builder sourceNode( final Node sourceNode ) { - this.sourceNode = sourceNode; return this; } @Deprecated public Builder targetNode( final Node targetNode ) { - this.targetNode = targetNode; return this; } - private void validate() - { - } - public MoveNodeResult build() { - this.validate(); return new MoveNodeResult( this ); } } diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java index 19fcbe4c81e..e25106e94fd 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java @@ -27,6 +27,8 @@ public interface NodeService NodeIds deleteByPath( NodePath path ); + DeleteNodeResult delete( final DeleteNodeParams deleteNodeParams ); + Node getById( NodeId id ); Node getByIdAndVersionId( NodeId id, NodeVersionId versionId ); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentPublisher.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEventProducer.java similarity index 83% rename from modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentPublisher.java rename to modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEventProducer.java index 92f62e71055..cf0a5183618 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentPublisher.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEventProducer.java @@ -14,10 +14,10 @@ import com.enonic.xp.core.internal.concurrent.SimpleRecurringJobScheduler; import com.enonic.xp.event.EventPublisher; -@Component(service = ContentPublisher.class) -public class ContentPublisher +@Component(service = ContentEventProducer.class) +public class ContentEventProducer { - private static final Logger LOG = LoggerFactory.getLogger( ContentPublisher.class ); + private static final Logger LOG = LoggerFactory.getLogger( ContentEventProducer.class ); private final EventPublisher eventPublisher; @@ -25,7 +25,7 @@ public class ContentPublisher @Activate - public ContentPublisher( @Reference final EventPublisher eventPublisher ) + public ContentEventProducer( @Reference final EventPublisher eventPublisher ) { this.eventPublisher = eventPublisher; this.jobScheduler = new SimpleRecurringJobScheduler( Executors::newSingleThreadScheduledExecutor, "content-publisher-thread" ); @@ -50,4 +50,10 @@ public void put( final List online, final List offline ) this.eventPublisher.publish( ContentEvents.offline( offline ) ); this.eventPublisher.publish( ContentEvents.online( online ) ); } + + public void put( final List offline ) + { + this.eventPublisher.publish( ContentEvents.offline( offline ) ); + } + } 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 da6c2343db1..b7629012e2a 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 @@ -153,7 +153,7 @@ public class ContentServiceImpl private EventPublisher eventPublisher; - private ContentPublisher contentPublisher; + private ContentEventProducer contentEventProducer; private MediaInfoService mediaInfoService; @@ -427,7 +427,7 @@ public PublishContentResult publish( final PushContentParams params ) contentTypeService( this.contentTypeService ). translator( this.translator ). eventPublisher( this.eventPublisher ). - contentPublisher( contentPublisher ). + contentPublisher( contentEventProducer ). contentIds( params.getContentIds() ). excludedContentIds( params.getExcludedContentIds() ). contentPublishInfo( params.getContentPublishInfo() ). @@ -1408,9 +1408,9 @@ public void setContentAuditLogSupport( final ContentAuditLogSupport contentAudit } @Reference - public void setContentPublisher( final ContentPublisher contentPublisher ) + public void setContentPublisher( final ContentEventProducer contentEventProducer ) { - this.contentPublisher = contentPublisher; + this.contentEventProducer = contentEventProducer; } @Reference public void setProjectService( final ProjectService projectService ) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java index fa8c88f8f4a..c218649c7b4 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java @@ -49,7 +49,7 @@ public class PublishContentCommand private final PushContentListener publishContentListener; - private final ContentPublisher contentPublisher; + private final ContentEventProducer contentEventProducer; private final String message; @@ -64,7 +64,7 @@ private PublishContentCommand( final Builder builder ) this.resultBuilder = PublishContentResult.create(); this.publishContentListener = builder.publishContentListener; this.message = builder.message; - this.contentPublisher = builder.contentPublisher; + this.contentEventProducer = builder.contentEventProducer; } public static Builder create() @@ -172,7 +172,7 @@ private void doPushNodes( final NodeIds nodesToPush ) .build(), false ) ) .collect( Collectors.toList() ); - this.contentPublisher.put( contents, contentsOffline ); + this.contentEventProducer.put( contents, contentsOffline ); this.resultBuilder.setFailed( ContentNodeHelper.toContentIds( pushNodesResult.getFailedEntries() .stream() @@ -276,7 +276,7 @@ public static class Builder private String message; - private ContentPublisher contentPublisher; + private ContentEventProducer contentEventProducer; public Builder contentIds( final ContentIds contentIds ) { @@ -331,9 +331,9 @@ public Builder message( final String message ) return this; } - public Builder contentPublisher( final ContentPublisher contentPublisher ) + public Builder contentPublisher( final ContentEventProducer contentEventProducer ) { - this.contentPublisher = contentPublisher; + this.contentEventProducer = contentEventProducer; return this; } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/AbstractDeleteNodeCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/AbstractDeleteNodeCommand.java index a0619200c71..5992aa0218c 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/AbstractDeleteNodeCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/AbstractDeleteNodeCommand.java @@ -2,6 +2,7 @@ import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import com.google.common.collect.Iterables; @@ -36,12 +37,17 @@ abstract class AbstractDeleteNodeCommand { private static final int BATCH_SIZE = 20; - AbstractDeleteNodeCommand( final Builder builder ) + private final DeleteNodeListener deleteNodeListener; + private final RefreshMode refresh; + + AbstractDeleteNodeCommand( final Builder builder ) { super( builder ); + this.deleteNodeListener = Objects.requireNonNullElseGet( builder.deleteNodeListener, EmptyDeleteNodeListener::new ); + this.refresh = builder.refresh; } - NodeBranchEntries deleteNodeWithChildren( final Node node, final DeleteNodeListener deleteNodeListener ) + NodeBranchEntries deleteNodeWithChildren( final Node node ) { if ( node.isRoot() ) { @@ -86,13 +92,10 @@ NodeBranchEntries deleteNodeWithChildren( final Node node, final DeleteNodeListe { this.nodeStorageService.delete( batch, InternalContext.from( context ) ); - if ( deleteNodeListener != null ) - { - deleteNodeListener.nodesDeleted( batch.size() ); - } + deleteNodeListener.nodesDeleted( batch.size() ); } - refresh( RefreshMode.ALL ); + refresh( refresh ); return NodeBranchEntries.from( list ); } @@ -100,6 +103,10 @@ NodeBranchEntries deleteNodeWithChildren( final Node node, final DeleteNodeListe public static class Builder extends AbstractNodeCommand.Builder { + private DeleteNodeListener deleteNodeListener; + + private RefreshMode refresh; + Builder() { super(); @@ -109,5 +116,32 @@ public static class Builder { super( source ); } + + public Builder deleteNodeListener( final DeleteNodeListener deleteNodeListener ) + { + this.deleteNodeListener = deleteNodeListener; + return this; + } + + public Builder refresh( final RefreshMode refresh ) + { + this.refresh = refresh; + return this; + } + + } + + private static class EmptyDeleteNodeListener + implements DeleteNodeListener + { + @Override + public void nodesDeleted( final int count ) + { + } + + @Override + public void totalToDelete( final int count ) + { + } } } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/DeleteNodeByIdCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/DeleteNodeByIdCommand.java index c5f523cd1ea..38d2901161f 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/DeleteNodeByIdCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/DeleteNodeByIdCommand.java @@ -2,7 +2,6 @@ import com.google.common.base.Preconditions; -import com.enonic.xp.node.DeleteNodeListener; import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeBranchEntries; import com.enonic.xp.node.NodeId; @@ -12,20 +11,17 @@ public final class DeleteNodeByIdCommand { private final NodeId nodeId; - private final DeleteNodeListener deleteNodeListener; - private DeleteNodeByIdCommand( final Builder builder ) { super( builder ); this.nodeId = builder.nodeId; - this.deleteNodeListener = builder.deleteNodeListener; } public NodeBranchEntries execute() { final Node node = doGetById( nodeId ); - return node != null ? deleteNodeWithChildren( node, deleteNodeListener ) : NodeBranchEntries.empty(); + return node != null ? deleteNodeWithChildren( node ) : NodeBranchEntries.empty(); } public static Builder create() @@ -43,8 +39,6 @@ public static class Builder { private NodeId nodeId; - private DeleteNodeListener deleteNodeListener; - Builder() { super(); @@ -62,12 +56,6 @@ public Builder nodeId( final NodeId nodeId ) return this; } - public Builder deleteNodeListener( final DeleteNodeListener deleteNodeListener ) - { - this.deleteNodeListener = deleteNodeListener; - return this; - } - @Override void validate() { diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/DeleteNodeByPathCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/DeleteNodeByPathCommand.java index ecda4c53876..c67a1b7ab89 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/DeleteNodeByPathCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/DeleteNodeByPathCommand.java @@ -21,7 +21,7 @@ NodeBranchEntries execute() { final Node node = doGetByPath( nodePath ); - return node != null ? deleteNodeWithChildren( node, null ) : NodeBranchEntries.empty(); + return node != null ? deleteNodeWithChildren( node ) : NodeBranchEntries.empty(); } static Builder create() diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java index ae011a8dc38..5d3145a2f69 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java @@ -18,6 +18,8 @@ import com.enonic.xp.node.CreateNodeParams; import com.enonic.xp.node.CreateRootNodeParams; import com.enonic.xp.node.DeleteNodeListener; +import com.enonic.xp.node.DeleteNodeParams; +import com.enonic.xp.node.DeleteNodeResult; import com.enonic.xp.node.DuplicateNodeParams; import com.enonic.xp.node.FindNodePathsByQueryResult; import com.enonic.xp.node.FindNodesByMultiRepoQueryResult; @@ -515,14 +517,23 @@ public NodeIds deleteById( final NodeId id ) @Override public NodeIds deleteById( final NodeId id, final DeleteNodeListener deleteNodeListener ) + { + final DeleteNodeResult result = + delete( DeleteNodeParams.create().nodeId( id ).refresh( RefreshMode.ALL ).deleteNodeListener( deleteNodeListener ).build() ); + return NodeIds.from( result.getNodeBranchEntries().getKeys() ); + } + + @Override + public DeleteNodeResult delete( final DeleteNodeParams deleteNodeParams ) { verifyContext(); final NodeBranchEntries deletedNodes = DeleteNodeByIdCommand.create(). - nodeId( id ). + nodeId( deleteNodeParams.getNodeId() ). + deleteNodeListener( deleteNodeParams.getDeleteNodeListener() ). + refresh( deleteNodeParams.getRefresh() ). indexServiceInternal( this.indexServiceInternal ). storageService( this.nodeStorageService ). searchService( this.nodeSearchService ). - deleteNodeListener( deleteNodeListener ). build(). execute(); @@ -531,7 +542,7 @@ public NodeIds deleteById( final NodeId id, final DeleteNodeListener deleteNodeL this.eventPublisher.publish( NodeEvents.deleted( deletedNodes ) ); } - return NodeIds.from( deletedNodes.getKeys() ); + return DeleteNodeResult.create().nodeBranchEntries( deletedNodes ).build(); } @Override diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/NodeEventsTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/NodeEventsTest.java index 42d645f3429..62176ab0ed9 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/NodeEventsTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/NodeEventsTest.java @@ -129,7 +129,6 @@ public void testMoved() .node( targetNode ) .previousPath( sourceNode.path() ) .build() ) - .sourceNode( sourceNode ) .build() ); assertNotNull( event ); diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/event/NodeEventListenerTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/event/NodeEventListenerTest.java index 3ddb1ce7709..98be8f5ca5b 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/event/NodeEventListenerTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/event/NodeEventListenerTest.java @@ -137,7 +137,6 @@ public void node_moved_event() .node( movedNode ) .previousPath( sourceNode.path() ) .build() ) - .sourceNode( sourceNode ) .build() ); nodeEventListener.onEvent( Event.create( localEvent ).localOrigin( false ).build() ); From e724d0e68eaf129d51aed3fde293d8024d9c62eb Mon Sep 17 00:00:00 2001 From: rymsha Date: Fri, 16 Dec 2022 14:47:23 +0100 Subject: [PATCH 07/11] save --- .../java/com/enonic/xp/node/NodeService.java | 2 +- .../xp/security/acl/AccessControlEntry.java | 5 +++ .../xp/security/acl/AccessControlList.java | 39 ++++++++++------- .../acl/IdProviderAccessControlList.java | 3 +- .../xp/security/auth/AuthenticationInfo.java | 6 ++- .../repo/impl/node/CompareNodesCommand.java | 17 ++++---- .../repo/impl/node/CompareStatusResolver.java | 5 --- .../xp/repo/impl/node/CreateNodeCommand.java | 3 +- .../impl/node/NodePermissionsResolver.java | 41 ++---------------- .../xp/repo/impl/node/PushNodesCommand.java | 42 +++++++++---------- .../impl/storage/NodeStorageServiceImpl.java | 13 +----- .../repo/impl/node/PushNodesCommandTest.java | 8 ++-- 12 files changed, 78 insertions(+), 106 deletions(-) diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java b/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java index e25106e94fd..83e45288148 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java @@ -27,7 +27,7 @@ public interface NodeService NodeIds deleteByPath( NodePath path ); - DeleteNodeResult delete( final DeleteNodeParams deleteNodeParams ); + DeleteNodeResult delete( DeleteNodeParams deleteNodeParams ); Node getById( NodeId id ); diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/AccessControlEntry.java b/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/AccessControlEntry.java index f361ccf453a..e723c5c05bc 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/AccessControlEntry.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/AccessControlEntry.java @@ -43,6 +43,11 @@ public Iterable getDeniedPermissions() return deniedPermissions; } + public boolean isAllowed( final Permission permission ) + { + return this.allowedPermissions.contains( permission ); + } + public boolean isAllowed( final Permission... permissions ) { return this.allowedPermissions.containsAll( Arrays.asList( permissions ) ); diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/AccessControlList.java b/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/AccessControlList.java index d88b72c7512..c9214a8de70 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/AccessControlList.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/AccessControlList.java @@ -18,13 +18,13 @@ public final class AccessControlList implements Iterable { - private static final AccessControlList EMPTY = AccessControlList.create().build(); + private static final AccessControlList EMPTY = new AccessControlList( ImmutableMap.of() ); private final ImmutableMap entries; - private AccessControlList( final Builder builder ) + private AccessControlList( final ImmutableMap entries ) { - this.entries = ImmutableMap.copyOf( builder.entries ); + this.entries = entries; } public static AccessControlList empty() @@ -49,14 +49,21 @@ public static Builder create( final AccessControlList acl ) public boolean isAllowedFor( final PrincipalKey principal, final Permission... permissions ) { - return doIsAllowedFor( principal, permissions ); + final AccessControlEntry entry = this.entries.get( principal ); + return entry != null && entry.isAllowed( permissions ); + } + + public boolean isAllowedFor( final PrincipalKey principal, final Permission permission ) + { + final AccessControlEntry entry = this.entries.get( principal ); + return entry != null && entry.isAllowed( permission ); } public boolean isAllowedFor( final PrincipalKeys principals, final Permission... permissions ) { for ( final PrincipalKey principal : principals ) { - if ( doIsAllowedFor( principal, permissions ) ) + if ( isAllowedFor( principal, permissions ) ) { return true; } @@ -65,17 +72,22 @@ public boolean isAllowedFor( final PrincipalKeys principals, final Permission... return false; } - private boolean doIsAllowedFor( final PrincipalKey principal, final Permission[] permissions ) + public boolean isAllowedFor( final PrincipalKeys principals, final Permission permission ) { - final AccessControlEntry entry = this.entries.get( principal ); - return entry != null && entry.isAllowed( permissions ); + for ( final PrincipalKey principal : principals ) + { + if ( isAllowedFor( principal, permission ) ) + { + return true; + } + } + + return false; } public PrincipalKeys getAllPrincipals() { - final Set principals = this.entries.values().stream(). - map( AccessControlEntry::getPrincipal ). - collect( toSet() ); + final Set principals = this.entries.values().stream().map( AccessControlEntry::getPrincipal ).collect( toSet() ); return PrincipalKeys.from( principals ); } @@ -153,8 +165,7 @@ private Builder() private Builder( final AccessControlList acl ) { - this.entries = new HashMap<>(); - this.entries.putAll( acl.entries ); + this.entries = new HashMap<>( acl.entries ); } public Builder add( final AccessControlEntry entry ) @@ -189,7 +200,7 @@ public Builder remove( final PrincipalKey principal ) public AccessControlList build() { - return new AccessControlList( this ); + return new AccessControlList( ImmutableMap.copyOf( entries ) ); } } diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/IdProviderAccessControlList.java b/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/IdProviderAccessControlList.java index 922bc4bda76..a29e76f5176 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/IdProviderAccessControlList.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/security/acl/IdProviderAccessControlList.java @@ -114,8 +114,7 @@ private Builder() private Builder( final IdProviderAccessControlList acl ) { - this.entries = new HashMap<>(); - this.entries.putAll( acl.entries ); + this.entries = new HashMap<>( acl.entries ); } public Builder add( final IdProviderAccessControlEntry entry ) diff --git a/modules/core/core-api/src/main/java/com/enonic/xp/security/auth/AuthenticationInfo.java b/modules/core/core-api/src/main/java/com/enonic/xp/security/auth/AuthenticationInfo.java index c87dbf2c0f2..130b43b2b75 100644 --- a/modules/core/core-api/src/main/java/com/enonic/xp/security/auth/AuthenticationInfo.java +++ b/modules/core/core-api/src/main/java/com/enonic/xp/security/auth/AuthenticationInfo.java @@ -68,7 +68,11 @@ public boolean hasRole( final String role ) public boolean hasRole( final PrincipalKey role ) { - return principals.stream().anyMatch( principal -> principal.isRole() && principal.equals( role ) ); + if ( !role.isRole() ) + { + return false; + } + return principals.contains( role ); } public static Builder create() diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareNodesCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareNodesCommand.java index 81ddefa1309..c49c560720c 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareNodesCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareNodesCommand.java @@ -7,6 +7,7 @@ import com.enonic.xp.context.Context; import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.NodeBranchEntries; +import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodeComparison; import com.enonic.xp.node.NodeComparisons; import com.enonic.xp.node.NodeId; @@ -44,14 +45,16 @@ public NodeComparisons execute() for ( final NodeId id : Sets.union( sourceVersions.getKeys(), targetVersions.getKeys() ) ) { - final CompareStatus compareStatus = CompareStatusResolver.create(). - source( sourceVersions.get( id ) ). - target( targetVersions.get( id ) ). - storageService( this.nodeStorageService ). - build(). - resolve(); + final NodeBranchEntry sourceVersion = sourceVersions.get( id ); + final NodeBranchEntry targetVersion = targetVersions.get( id ); + final CompareStatus compareStatus = CompareStatusResolver.create() + .source( sourceVersion ) + .target( targetVersion ) + .storageService( this.nodeStorageService ) + .build() + .resolve(); - builder.add( new NodeComparison( sourceVersions.get( id ), targetVersions.get( id ), compareStatus ) ); + builder.add( new NodeComparison( sourceVersion, targetVersion, compareStatus ) ); } return builder.build(); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareStatusResolver.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareStatusResolver.java index 6863239028a..0c252762429 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareStatusResolver.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CompareStatusResolver.java @@ -80,11 +80,6 @@ private CompareStatus resolveFromVersion() private NodeVersionMetadata getVersion( final NodeBranchEntry nodeBranchEntry ) { - if ( nodeBranchEntry == null ) - { - throw new IllegalArgumentException( "Expected branchNodeVersion to be != null when trying to fetch NodeVersion" ); - } - final NodeVersionMetadata version = nodeStorageService.getVersion( nodeBranchEntry.getNodeId(), nodeBranchEntry.getVersionId(), InternalContext.from( ContextAccessor.current() ) ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CreateNodeCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CreateNodeCommand.java index 5128d96baf7..8c712c8cb76 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CreateNodeCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/CreateNodeCommand.java @@ -31,7 +31,6 @@ import com.enonic.xp.security.acl.Permission; import static com.enonic.xp.repo.impl.node.NodeConstants.CLOCK; -import static com.enonic.xp.repo.impl.node.NodePermissionsResolver.requireContextUserPermission; public final class CreateNodeCommand extends AbstractNodeCommand @@ -71,7 +70,7 @@ public Node execute() } final Node parentNode = NodeHelper.runAsAdmin( this::getParentNode ); - requireContextUserPermission( Permission.CREATE, parentNode ); + NodePermissionsResolver.requireContextUserPermissionOrAdmin( Permission.CREATE, parentNode ); final PrincipalKey user = getCurrentPrincipalKey(); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodePermissionsResolver.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodePermissionsResolver.java index c5a90f80ae8..fcbd90b8ae6 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodePermissionsResolver.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodePermissionsResolver.java @@ -3,37 +3,18 @@ import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeAccessException; -import com.enonic.xp.security.PrincipalKeys; import com.enonic.xp.security.RoleKeys; import com.enonic.xp.security.acl.AccessControlList; import com.enonic.xp.security.acl.Permission; import com.enonic.xp.security.auth.AuthenticationInfo; -final class NodePermissionsResolver +public final class NodePermissionsResolver { - public static void requireContextUserPermission( final Permission permission, final Node node ) - throws NodeAccessException - { - final AuthenticationInfo authInfo = ContextAccessor.current().getAuthInfo(); - doRequireContextUserPermission( authInfo, permission, node ); - } - public static void requireContextUserPermissionOrAdmin( final Permission permission, final Node node ) throws NodeAccessException { final AuthenticationInfo authInfo = ContextAccessor.current().getAuthInfo(); - doRequireContextUserPermission( authInfo, permission, node ); - } - - public static void requireContextUserPermission( final AuthenticationInfo authInfo, final Permission permission, final Node node ) - throws NodeAccessException - { - doRequireContextUserPermission( authInfo, permission, node ); - } - - private static void doRequireContextUserPermission( final AuthenticationInfo authInfo, final Permission permission, final Node node ) - { - final boolean hasPermission = doUserHasPermission( authInfo, permission, node.getPermissions() ); + final boolean hasPermission = userHasPermission( authInfo, permission, node.getPermissions() ); if ( !hasPermission ) { throw new NodeAccessException( authInfo.getUser(), node.path(), permission ); @@ -42,31 +23,17 @@ private static void doRequireContextUserPermission( final AuthenticationInfo aut public static boolean contextUserHasPermissionOrAdmin( final Permission permission, final AccessControlList nodePermissions ) { - final AuthenticationInfo authInfo = ContextAccessor.current().getAuthInfo(); - if ( authInfo.getPrincipals().contains( RoleKeys.ADMIN ) ) - { - return true; - } - return doUserHasPermission( authInfo, permission, nodePermissions ); + return userHasPermission( ContextAccessor.current().getAuthInfo(), permission, nodePermissions ); } public static boolean userHasPermission( final AuthenticationInfo authInfo, final Permission permission, final AccessControlList nodePermissions ) - { - return doUserHasPermission( authInfo, permission, nodePermissions ); - } - - private static boolean doUserHasPermission( final AuthenticationInfo authInfo, final Permission permission, - final AccessControlList nodePermissions ) { if ( authInfo.hasRole( RoleKeys.ADMIN ) ) { return true; } - final PrincipalKeys authInfoPrincipals = authInfo.getPrincipals(); - final PrincipalKeys principalsAllowed = nodePermissions.getPrincipalsWithPermission( permission ); - - return principalsAllowed.stream().anyMatch( authInfoPrincipals::contains ); + return nodePermissions.isAllowedFor( authInfo.getPrincipals(), permission ); } } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java index 6d9fb075fd4..25e48f7b8b3 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java @@ -30,6 +30,7 @@ import com.enonic.xp.repo.impl.SingleRepoSearchSource; import com.enonic.xp.repo.impl.search.NodeSearchService; import com.enonic.xp.repo.impl.storage.StoreMovedNodeParams; +import com.enonic.xp.security.acl.AccessControlList; import com.enonic.xp.security.acl.Permission; public class PushNodesCommand @@ -61,14 +62,16 @@ public PushNodesResult execute() refresh( RefreshMode.ALL ); - final NodeBranchEntries nodeBranchEntries = this.nodeStorageService.getBranchNodeVersions( ids, InternalContext.from( context ) ); + final InternalContext internalContext = InternalContext.from( context ); + final NodeBranchEntries nodeBranchEntries = this.nodeStorageService.getBranchNodeVersions( ids, internalContext ); final NodeComparisons comparisons = getNodeComparisons( ids ); final PushNodesResult.Builder builder = PushNodesResult.create(); - final List list = - nodeBranchEntries.getSet().stream().sorted( Comparator.comparing( NodeBranchEntry::getNodePath ) ) + final List list = nodeBranchEntries.getSet() + .stream() + .sorted( Comparator.comparing( NodeBranchEntry::getNodePath ) ) .collect( Collectors.toList() ); final Set alreadyAdded = new HashSet<>(); @@ -76,51 +79,46 @@ public PushNodesResult execute() { final NodeComparison comparison = comparisons.get( branchEntry.getNodeId() ); - final NodeBranchEntry nodeBranchEntry = nodeBranchEntries.get( comparison.getNodeId() ); + final AccessControlList nodePermissions = + this.nodeStorageService.getNodeVersion( branchEntry.getNodeVersionKey(), internalContext ).getPermissions(); - final boolean hasPublishPermission = NodesHasPermissionResolver.create( this ). - nodeIds( NodeIds.from( nodeBranchEntry.getNodeId() ) ). - permission( Permission.PUBLISH ). - build(). - execute(); - - if ( !hasPublishPermission ) + if ( !NodePermissionsResolver.contextUserHasPermissionOrAdmin( Permission.PUBLISH, nodePermissions ) ) { - builder.addFailed( nodeBranchEntry, PushNodesResult.Reason.ACCESS_DENIED ); + builder.addFailed( branchEntry, PushNodesResult.Reason.ACCESS_DENIED ); pushListener.nodesPushed( 1 ); continue; } if ( comparison.getCompareStatus() == CompareStatus.EQUAL ) { - builder.addSuccess( nodeBranchEntry, comparison.getTargetPath() ); - alreadyAdded.add( nodeBranchEntry.getNodePath() ); + builder.addSuccess( branchEntry, comparison.getTargetPath() ); + alreadyAdded.add( branchEntry.getNodePath() ); pushListener.nodesPushed( 1 ); continue; } if ( ( CompareStatus.NEW == comparison.getCompareStatus() || CompareStatus.MOVED == comparison.getCompareStatus() ) && - targetAlreadyExists( nodeBranchEntry.getNodePath(), comparisons, context ) ) + targetAlreadyExists( branchEntry.getNodePath(), comparisons, context ) ) { - builder.addFailed( nodeBranchEntry, PushNodesResult.Reason.ALREADY_EXIST ); + builder.addFailed( branchEntry, PushNodesResult.Reason.ALREADY_EXIST ); pushListener.nodesPushed( 1 ); continue; } - if ( !alreadyAdded.contains( nodeBranchEntry.getNodePath().getParentPath() ) && - !targetParentExists( nodeBranchEntry.getNodePath(), context ) ) + if ( !alreadyAdded.contains( branchEntry.getNodePath().getParentPath() ) && + !targetParentExists( branchEntry.getNodePath(), context ) ) { - builder.addFailed( nodeBranchEntry, PushNodesResult.Reason.PARENT_NOT_FOUND ); + builder.addFailed( branchEntry, PushNodesResult.Reason.PARENT_NOT_FOUND ); pushListener.nodesPushed( 1 ); continue; } - builder.addSuccess( nodeBranchEntry, comparison.getTargetPath() ); - alreadyAdded.add( nodeBranchEntry.getNodePath() ); + builder.addSuccess( branchEntry, comparison.getTargetPath() ); + alreadyAdded.add( branchEntry.getNodePath() ); if ( comparison.getCompareStatus() == CompareStatus.MOVED ) { - updateTargetChildrenMetaData( nodeBranchEntry, builder, alreadyAdded ); + updateTargetChildrenMetaData( branchEntry, builder, alreadyAdded ); } } diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java index 5823c8435bd..cb60e57c403 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java @@ -15,7 +15,6 @@ import com.enonic.xp.blob.BlobKeys; import com.enonic.xp.blob.NodeVersionKey; import com.enonic.xp.branch.Branch; -import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.node.AttachedBinaries; import com.enonic.xp.node.AttachedBinary; import com.enonic.xp.node.Node; @@ -40,12 +39,11 @@ import com.enonic.xp.repo.impl.branch.BranchService; import com.enonic.xp.repo.impl.branch.storage.NodeFactory; import com.enonic.xp.repo.impl.commit.CommitService; +import com.enonic.xp.repo.impl.node.NodePermissionsResolver; import com.enonic.xp.repo.impl.node.dao.NodeVersionService; import com.enonic.xp.repo.impl.version.VersionService; -import com.enonic.xp.security.RoleKeys; import com.enonic.xp.security.acl.AccessControlList; import com.enonic.xp.security.acl.Permission; -import com.enonic.xp.security.auth.AuthenticationInfo; @Component public class NodeStorageServiceImpl @@ -435,14 +433,7 @@ private Nodes doReturnNodes( final Stream nodeBranchEntries, fi private boolean canRead( final AccessControlList permissions ) { - final AuthenticationInfo authInfo = ContextAccessor.current().getAuthInfo(); - - if ( authInfo.getPrincipals().contains( RoleKeys.ADMIN ) ) - { - return true; - } - - return permissions.isAllowedFor( authInfo.getPrincipals(), Permission.READ ); + return NodePermissionsResolver.contextUserHasPermissionOrAdmin( Permission.READ, permissions ); } @Reference diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java index ad81b4d49bd..440df1e248e 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java @@ -45,13 +45,13 @@ public void push_single() Node testWsNode = ctxOther().callWith( () -> getNodeById( node.id() ) ); - assertTrue( testWsNode == null ); + assertNull( testWsNode ); pushNodes( NodeIds.from( node.id() ), WS_OTHER ); testWsNode = ctxOther().callWith( () -> getNodeById( node.id() ) ); - assertTrue( testWsNode != null ); + assertNotNull( testWsNode ); } @Test @@ -73,7 +73,7 @@ public void push_child() final Node prodNode = ctxOther().callWith( () -> getNodeById( child.id() ) ); - assertTrue( prodNode != null ); + assertNotNull( prodNode ); } @Test @@ -473,7 +473,7 @@ public void push_with_capital_node_id() final Node prodNode = ctxOther().callWith( () -> getNodeById( child.id() ) ); - assertTrue( prodNode != null ); + assertNotNull( prodNode ); } private void renameNode( final Node node, final String newName ) From 1ca6a32fb78ec76548df390cd3486f525a286bbb Mon Sep 17 00:00:00 2001 From: rymsha Date: Fri, 16 Dec 2022 17:39:30 +0100 Subject: [PATCH 08/11] save --- .../impl/content/AbstractContentCommand.java | 17 +- .../impl/content/ArchiveContentCommand.java | 2 +- .../content/CheckContentValidityCommand.java | 4 +- .../core/impl/content/ContentServiceImpl.java | 373 +++++++++--------- .../core/impl/content/CreateMediaCommand.java | 2 +- .../impl/content/DeleteContentCommand.java | 2 +- .../impl/content/GetNearestSiteCommand.java | 4 +- .../impl/content/PublishContentCommand.java | 15 +- .../impl/content/RenameContentCommand.java | 3 +- .../impl/content/ReprocessContentCommand.java | 4 +- .../impl/content/SyncContentServiceImpl.java | 21 +- .../impl/content/UnpublishContentCommand.java | 42 +- .../core/impl/content/UpdateMediaCommand.java | 2 +- .../content/CreateContentCommandTest.java | 2 +- .../FindContentIdsByQueryCommandTest.java | 12 +- ...GetContentByIdAndVersionIdCommandTest.java | 16 +- ...tContentByPathAndVersionIdCommandTest.java | 14 +- .../content/GetNearestSiteCommandTest.java | 14 +- .../impl/content/MoveContentCommandTest.java | 36 +- .../content/RenameContentCommandTest.java | 2 +- .../content/UpdateContentCommandTest.java | 24 +- .../ParentContentSynchronizerTest.java | 5 +- .../content/SyncContentServiceImplTest.java | 5 +- 23 files changed, 314 insertions(+), 307 deletions(-) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractContentCommand.java index 2edb8a07bbf..09c8a6ba9dd 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/AbstractContentCommand.java @@ -28,7 +28,6 @@ import com.enonic.xp.data.PropertyPath; import com.enonic.xp.data.PropertyTree; import com.enonic.xp.data.ValueFactory; -import com.enonic.xp.event.EventPublisher; import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeService; import com.enonic.xp.query.filter.BooleanFilter; @@ -47,7 +46,7 @@ abstract class AbstractContentCommand final ContentTypeService contentTypeService; - final EventPublisher eventPublisher; + final ContentEventProducer contentEventProducer; final ContentNodeTranslator translator; @@ -55,7 +54,7 @@ abstract class AbstractContentCommand { this.contentTypeService = builder.contentTypeService; this.nodeService = builder.nodeService; - this.eventPublisher = builder.eventPublisher; + this.contentEventProducer = builder.contentEventProducer; this.translator = builder.translator; } @@ -72,7 +71,7 @@ Content getContent( final ContentId contentId ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute(); if ( content == null ) @@ -197,7 +196,7 @@ protected void validateParentChildRelations( final ContentPath parentPath, final .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute(); if (parent == null) @@ -243,7 +242,7 @@ public static class Builder> private ContentTypeService contentTypeService; - private EventPublisher eventPublisher; + private ContentEventProducer contentEventProducer; private ContentNodeTranslator translator; @@ -273,9 +272,9 @@ public B contentTypeService( final ContentTypeService contentTypeService ) } @SuppressWarnings("unchecked") - public B eventPublisher( final EventPublisher eventPublisher ) + public B contentEventProducer( final ContentEventProducer contentEventProducer ) { - this.eventPublisher = eventPublisher; + this.contentEventProducer = contentEventProducer; return (B) this; } @@ -283,7 +282,7 @@ void validate() { Preconditions.checkNotNull( nodeService, "nodeService cannot be null" ); Preconditions.checkNotNull( contentTypeService, "contentTypesService cannot be null" ); - Preconditions.checkNotNull( eventPublisher, "eventPublisher cannot be null" ); + Preconditions.checkNotNull( contentEventProducer, "contentEventProducer cannot be null" ); Preconditions.checkNotNull( translator, "translator cannot be null" ); } } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ArchiveContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ArchiveContentCommand.java index 9bedcfa3305..f44e4e20353 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ArchiveContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ArchiveContentCommand.java @@ -132,7 +132,7 @@ private ContentIds unpublish( final ContentId contentId, final ContentIds descen .nodeService( nodeService ) .contentTypeService( contentTypeService ) .translator( translator ) - .eventPublisher( eventPublisher ) + .contentEventProducer( contentEventProducer ) .params( UnpublishContentParams.create() .contentIds( ContentIds.create() .addAll( descendants ) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CheckContentValidityCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CheckContentValidityCommand.java index fb50105e024..0621a0ac404 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CheckContentValidityCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/CheckContentValidityCommand.java @@ -55,7 +55,7 @@ public ContentValidityResult execute() .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute() .getContentIds(); @@ -69,7 +69,7 @@ public ContentValidityResult execute() .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute() .getContentIds(); 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 b7629012e2a..56f8b86fc79 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 @@ -226,12 +226,12 @@ public Site create( final CreateSiteParams params ) requireValid( params.isRequireValid() ). build(); - final Site site = (Site) CreateContentCommand.create(). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - siteService( this.siteService ). + final Site site = (Site) CreateContentCommand.create() + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( this.contentEventProducer ) + .siteService( this.siteService ). xDataService( this.xDataService ). contentProcessors( this.contentProcessors ). contentValidators( this.contentValidators ). @@ -266,12 +266,12 @@ public Content create( final CreateContentParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final Content content = CreateContentCommand.create(). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - siteService( this.siteService ). + final Content content = CreateContentCommand.create() + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( this.contentEventProducer ) + .siteService( this.siteService ). xDataService( this.xDataService ). contentProcessors( this.contentProcessors ). contentValidators( this.contentValidators ). @@ -311,13 +311,13 @@ public Content create( final CreateMediaParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final Content content = CreateMediaCommand.create(). - params( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - mediaInfoService( this.mediaInfoService ). + final Content content = CreateMediaCommand.create() + .params( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .mediaInfoService( this.mediaInfoService ). siteService( this.siteService ). xDataService( this.xDataService ). contentProcessors( this.contentProcessors ). @@ -341,12 +341,12 @@ public Content update( final UpdateContentParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final Content content = UpdateContentCommand.create( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - siteService( this.siteService ). + final Content content = UpdateContentCommand.create( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .siteService( this.siteService ). xDataService( this.xDataService ). contentProcessors( this.contentProcessors ). contentValidators( this.contentValidators ). @@ -368,12 +368,12 @@ public Content update( final UpdateMediaParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final Content content = UpdateMediaCommand.create( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - mediaInfoService( this.mediaInfoService ). + final Content content = UpdateMediaCommand.create( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .mediaInfoService( this.mediaInfoService ). pageDescriptorService( this.pageDescriptorService ). partDescriptorService( this.partDescriptorService ). layoutDescriptorService( this.layoutDescriptorService ). @@ -396,12 +396,12 @@ public DeleteContentsResult deleteWithoutFetch( final DeleteContentParams params { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final DeleteContentsResult result = DeleteContentCommand.create(). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - params( params ). + final DeleteContentsResult result = DeleteContentCommand.create() + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .params( params ). build(). execute(); @@ -422,13 +422,12 @@ public PublishContentResult publish( final PushContentParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final PublishContentResult result = PublishContentCommand.create(). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - contentPublisher( contentEventProducer ). - contentIds( params.getContentIds() ). + final PublishContentResult result = PublishContentCommand.create() + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .contentIds( params.getContentIds() ). excludedContentIds( params.getExcludedContentIds() ). contentPublishInfo( params.getContentPublishInfo() ). excludeChildrenIds( params.getExcludeChildrenIds() ). @@ -446,12 +445,12 @@ public PublishContentResult publish( final PushContentParams params ) @Override public CompareContentResults resolvePublishDependencies( ResolvePublishDependenciesParams params ) { - return ResolveContentsToBePublishedCommand.create(). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - contentIds( params.getContentIds() ). + return ResolveContentsToBePublishedCommand.create() + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .contentIds( params.getContentIds() ). excludedContentIds( params.getExcludedContentIds() ). excludeChildrenIds( params.getExcludeChildrenIds() ). build(). @@ -461,12 +460,12 @@ public CompareContentResults resolvePublishDependencies( ResolvePublishDependenc @Override public ContentIds resolveRequiredDependencies( ResolveRequiredDependenciesParams params ) { - return ResolveRequiredDependenciesCommand.create(). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - contentIds( params.getContentIds() ). + return ResolveRequiredDependenciesCommand.create() + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .contentIds( params.getContentIds() ). build(). execute(); } @@ -488,11 +487,11 @@ public ContentIds getInvalidContent( ContentIds contentIds ) @Override public ContentValidityResult getContentValidity( final ContentValidityParams params ) { - return CheckContentValidityCommand.create(). - translator( this.translator ). - nodeService( this.nodeService ). - eventPublisher( this.eventPublisher ). - contentTypeService( this.contentTypeService ). + return CheckContentValidityCommand.create() + .translator( this.translator ) + .nodeService( this.nodeService ) + .contentEventProducer( contentEventProducer ) + .contentTypeService( this.contentTypeService ). contentIds( params.getContentIds() ). build(). execute(); @@ -501,13 +500,13 @@ public ContentValidityResult getContentValidity( final ContentValidityParams par @Override public UnpublishContentsResult unpublishContent( final UnpublishContentParams params ) { - final UnpublishContentsResult result = UnpublishContentCommand.create(). - params( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + final UnpublishContentsResult result = UnpublishContentCommand.create() + .params( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); contentAuditLogSupport.unpublishContent( params, result ); @@ -548,7 +547,7 @@ private Content executeGetById( final ContentId contentId ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute(); } @@ -561,7 +560,7 @@ public Site getNearestSite( final ContentId contentId ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build(); final Trace trace = Tracer.newTrace( "content.getNearestSite" ); @@ -638,7 +637,7 @@ public Contents getByIds( final GetContentByIdsParams params ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build(); final Trace trace = Tracer.newTrace( "content.getByIds" ); @@ -686,7 +685,7 @@ private Content executeGetByPath( final ContentPath path ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute(); } @@ -709,7 +708,7 @@ public Contents getByPaths( final ContentPaths paths ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build(); final Trace trace = Tracer.newTrace( "content.getByPaths" ); @@ -731,7 +730,7 @@ public FindContentByParentResult findByParent( final FindContentByParentParams p .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build(); final Trace trace = Tracer.newTrace( "content.findByParent" ); @@ -753,12 +752,12 @@ public FindContentByParentResult findByParent( final FindContentByParentParams p @Override public FindContentIdsByParentResult findIdsByParent( final FindContentByParentParams params ) { - return FindContentIdsByParentCommand.create( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return FindContentIdsByParentCommand.create( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); } @@ -767,12 +766,12 @@ public DuplicateContentsResult duplicate( final DuplicateContentParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final DuplicateContentsResult result = DuplicateContentCommand.create( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - duplicateListener( params.getDuplicateContentListener() ). + final DuplicateContentsResult result = DuplicateContentCommand.create( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .duplicateListener( params.getDuplicateContentListener() ). build(). execute(); @@ -786,12 +785,12 @@ public MoveContentsResult move( final MoveContentParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final MoveContentsResult result = MoveContentCommand.create( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - moveListener( params.getMoveContentListener() ). + final MoveContentsResult result = MoveContentCommand.create( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .moveListener( params.getMoveContentListener() ). build(). execute(); @@ -808,7 +807,7 @@ public ArchiveContentsResult archive( final ArchiveContentParams params ) final ArchiveContentsResult result = ArchiveContentCommand.create( params ) .nodeService( nodeService ) .translator( translator ) - .eventPublisher( eventPublisher ) + .contentEventProducer( contentEventProducer ) .contentTypeService( contentTypeService ) .archiveListener( params.getArchiveContentListener() ) .build() @@ -827,7 +826,7 @@ public RestoreContentsResult restore( final RestoreContentParams params ) final RestoreContentsResult result = RestoreContentCommand.create( params ) .nodeService( nodeService ) .translator( translator ) - .eventPublisher( eventPublisher ) + .contentEventProducer( contentEventProducer ) .contentTypeService( contentTypeService ) .restoreListener( params.getRestoreContentListener() ) .build() @@ -843,14 +842,14 @@ public Content rename( final RenameContentParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final Content content = RenameContentCommand.create( params ). - nodeService( this.nodeService ). - xDataService( this.xDataService ). - siteService( this.siteService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - contentProcessors( this.contentProcessors ). + final Content content = RenameContentCommand.create( params ) + .nodeService( this.nodeService ) + .xDataService( this.xDataService ) + .siteService( this.siteService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .contentProcessors( this.contentProcessors ). contentValidators( this.contentValidators ). pageDescriptorService( this.pageDescriptorService ). partDescriptorService( this.partDescriptorService ). @@ -868,13 +867,13 @@ public Content rename( final RenameContentParams params ) @Deprecated public FindContentByQueryResult find( final FindContentByQueryParams params ) { - return FindContentByQueryCommand.create(). - params( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return FindContentByQueryCommand.create() + .params( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); } @@ -886,7 +885,7 @@ public FindContentIdsByQueryResult find( final ContentQuery query ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build(); final Trace trace = Tracer.newTrace( "content.find" ); @@ -923,13 +922,13 @@ public Contents findByApplicationKey( final ApplicationKey key ) @Deprecated public ContentPaths findContentPaths( ContentQuery query ) { - return FindContentPathsByQueryCommand.create(). - params( new FindContentPathsByQueryParams( query ) ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return FindContentPathsByQueryCommand.create() + .params( new FindContentPathsByQueryParams( query ) ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(). getContentPaths(); } @@ -937,13 +936,13 @@ public ContentPaths findContentPaths( ContentQuery query ) @Override public FindContentPathsByQueryResult findPaths( ContentQuery query ) { - return FindContentPathsByQueryCommand.create(). - params( new FindContentPathsByQueryParams( query ) ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return FindContentPathsByQueryCommand.create() + .params( new FindContentPathsByQueryParams( query ) ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); } @@ -1011,12 +1010,12 @@ public GetPublishStatusesResult getPublishStatuses( final GetPublishStatusesPara @Override public FindContentVersionsResult getVersions( final FindContentVersionsParams params ) { - return FindContentVersionsCommand.create(). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - contentId( params.getContentId() ). + return FindContentVersionsCommand.create() + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .contentId( params.getContentId() ). from( params.getFrom() ). size( params.getSize() ). build(). @@ -1026,12 +1025,12 @@ public FindContentVersionsResult getVersions( final FindContentVersionsParams pa @Override public GetActiveContentVersionsResult getActiveVersions( final GetActiveContentVersionsParams params ) { - return GetActiveContentVersionsCommand.create(). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - contentId( params.getContentId() ). + return GetActiveContentVersionsCommand.create() + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .contentId( params.getContentId() ). branches( params.getBranches() ). build(). execute(); @@ -1127,12 +1126,12 @@ public ApplyContentPermissionsResult applyPermissions( final ApplyContentPermiss { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final ApplyContentPermissionsResult result = ApplyContentPermissionsCommand.create( params ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + final ApplyContentPermissionsResult result = ApplyContentPermissionsCommand.create( params ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); contentAuditLogSupport.applyPermissions( params, result ); @@ -1164,60 +1163,60 @@ public ContentIds getOutboundDependencies( final ContentId id ) @Override public boolean contentExists( final ContentId contentId ) { - return ContentExistsCommand.create( contentId ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return ContentExistsCommand.create( contentId ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); } @Override public boolean contentExists( final ContentPath contentPath ) { - return ContentExistsCommand.create( contentPath ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return ContentExistsCommand.create( contentPath ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); } @Override public ByteSource getBinary( final ContentId contentId, final BinaryReference binaryReference ) { - return GetBinaryCommand.create( contentId, binaryReference ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return GetBinaryCommand.create( contentId, binaryReference ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); } @Override public ByteSource getBinary( final ContentId contentId, final ContentVersionId contentVersionId, final BinaryReference binaryReference ) { - return GetBinaryByVersionCommand.create( contentId, contentVersionId, binaryReference ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return GetBinaryByVersionCommand.create( contentId, contentVersionId, binaryReference ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); } @Override public String getBinaryKey( final ContentId contentId, final BinaryReference binaryReference ) { - return GetBinaryKeyCommand.create( contentId, binaryReference ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(). + return GetBinaryKeyCommand.create( contentId, binaryReference ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .build(). execute(); } @@ -1226,12 +1225,12 @@ public Content reprocess( final ContentId contentId ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - final Content content = ReprocessContentCommand.create( ReprocessContentParams.create().contentId( contentId ).build() ). - nodeService( this.nodeService ). - contentTypeService( this.contentTypeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - mediaInfoService( this.mediaInfoService ). + final Content content = ReprocessContentCommand.create( ReprocessContentParams.create().contentId( contentId ).build() ) + .nodeService( this.nodeService ) + .contentTypeService( this.contentTypeService ) + .translator( this.translator ) + .contentEventProducer( contentEventProducer ) + .mediaInfoService( this.mediaInfoService ). pageDescriptorService( this.pageDescriptorService ). partDescriptorService( this.partDescriptorService ). layoutDescriptorService( this.layoutDescriptorService ). @@ -1257,7 +1256,7 @@ public Content getByIdAndVersionId( final ContentId contentId, final ContentVers .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build(); final Trace trace = Tracer.newTrace( "content.getByIdAndVersionId" ); @@ -1284,7 +1283,7 @@ public Content getByPathAndVersionId( final ContentPath contentPath, final Conte .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build(); final Trace trace = Tracer.newTrace( "content.getByPathAndVersionId" ); @@ -1307,13 +1306,13 @@ public ImportContentResult importContent( final ImportContentParams params ) { verifyContextBranch( ContentConstants.BRANCH_DRAFT ); - return ImportContentCommand.create(). - params( params ). - nodeService( nodeService ). - contentTypeService( contentTypeService ). - contentDataSerializer( contentDataSerializer ). - eventPublisher( eventPublisher ). - translator( translator ). + return ImportContentCommand.create() + .params( params ) + .nodeService( nodeService ) + .contentTypeService( contentTypeService ) + .contentDataSerializer( contentDataSerializer ) + .contentEventProducer( contentEventProducer ) + .translator( translator ). build(). execute(); } 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 3c6dfa07b25..db0e964c2ab 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 @@ -111,7 +111,7 @@ private Content doExecute() .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .siteService( this.siteService ) .xDataService( this.xDataService ) .formDefaultValuesProcessor( this.formDefaultValuesProcessor ) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/DeleteContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/DeleteContentCommand.java index 857b77302c9..8dd393bf3a1 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/DeleteContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/DeleteContentCommand.java @@ -106,7 +106,7 @@ private ContentIds unpublish( final ContentId contentId, final ContentIds descen .nodeService( nodeService ) .contentTypeService( contentTypeService ) .translator( translator ) - .eventPublisher( eventPublisher ) + .contentEventProducer( contentEventProducer ) .params( UnpublishContentParams.create() .contentIds( ContentIds.create() .addAll( descendants ) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetNearestSiteCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetNearestSiteCommand.java index ff87bcbbd50..2633c8ec1e9 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetNearestSiteCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/GetNearestSiteCommand.java @@ -27,7 +27,7 @@ public Site execute() .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute(); @@ -59,7 +59,7 @@ private Site returnIfSiteOrTryParent( final ContentPath contentPath ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute(); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java index c218649c7b4..849ed65e25e 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java @@ -49,8 +49,6 @@ public class PublishContentCommand private final PushContentListener publishContentListener; - private final ContentEventProducer contentEventProducer; - private final String message; private PublishContentCommand( final Builder builder ) @@ -64,7 +62,6 @@ private PublishContentCommand( final Builder builder ) this.resultBuilder = PublishContentResult.create(); this.publishContentListener = builder.publishContentListener; this.message = builder.message; - this.contentEventProducer = builder.contentEventProducer; } public static Builder create() @@ -115,7 +112,7 @@ private CompareContentResults getSyncWork() .excludeChildrenIds( this.excludeChildrenIds ) .includeDependencies( this.includeDependencies ) .contentTypeService( this.contentTypeService ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .translator( this.translator ) .nodeService( this.nodeService ) .build()::execute ); @@ -126,7 +123,7 @@ private boolean checkIfAllContentsValid( final ContentIds pushContentsIds ) final ContentValidityResult result = CheckContentValidityCommand.create() .translator( this.translator ) .nodeService( this.nodeService ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .contentTypeService( this.contentTypeService ) .contentIds( pushContentsIds ) .build() @@ -276,8 +273,6 @@ public static class Builder private String message; - private ContentEventProducer contentEventProducer; - public Builder contentIds( final ContentIds contentIds ) { this.contentIds = contentIds; @@ -331,12 +326,6 @@ public Builder message( final String message ) return this; } - public Builder contentPublisher( final ContentEventProducer contentEventProducer ) - { - this.contentEventProducer = contentEventProducer; - return this; - } - @Override void validate() 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 838282a910b..5855bd047ed 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 @@ -109,7 +109,6 @@ private Content updateValidState( final Content content ) { final UpdateContentParams updateContentParams = new UpdateContentParams().requireValid( false ) .contentId( content.getId() ) - .modifier( content.getModifier() ) .stopInherit( false ) .editor( edit -> edit.valid = !content.isValid() ); @@ -117,7 +116,7 @@ private Content updateValidState( final Content content ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .siteService( siteService ) .contentTypeService( contentTypeService ) .xDataService( this.xDataService ) 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 38e688b67c8..ca687f9effd 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 @@ -74,7 +74,7 @@ private Content reprocessMedia( final Media media ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .build() .execute(); final UpdateMediaParams updateMediaParams = new UpdateMediaParams(). @@ -87,7 +87,7 @@ private Content reprocessMedia( final Media media ) .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .mediaInfoService( mediaInfoService ) .siteService( this.siteService ) .contentTypeService( this.contentTypeService ) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/SyncContentServiceImpl.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/SyncContentServiceImpl.java index fe3e47845f9..3f10c7011c9 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/SyncContentServiceImpl.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/SyncContentServiceImpl.java @@ -9,7 +9,6 @@ import com.enonic.xp.content.ResetContentInheritParams; import com.enonic.xp.content.SyncContentService; import com.enonic.xp.core.impl.content.serializer.ContentDataSerializer; -import com.enonic.xp.event.EventPublisher; import com.enonic.xp.node.NodeService; import com.enonic.xp.page.PageDescriptorService; import com.enonic.xp.project.ProjectService; @@ -27,7 +26,7 @@ public class SyncContentServiceImpl private final NodeService nodeService; - private final EventPublisher eventPublisher; + private final ContentEventProducer contentEventProducer; private final ContentNodeTranslator translator; @@ -37,7 +36,7 @@ public class SyncContentServiceImpl @Activate public SyncContentServiceImpl( @Reference final ContentTypeService contentTypeService, @Reference final NodeService nodeService, - @Reference final EventPublisher eventPublisher, + @Reference final ContentEventProducer contentEventProducer, @Reference final PageDescriptorService pageDescriptorService, @Reference final PartDescriptorService partDescriptorService, @Reference final LayoutDescriptorService layoutDescriptorService, @@ -46,7 +45,7 @@ public SyncContentServiceImpl( @Reference final ContentTypeService contentTypeSe { this.contentTypeService = contentTypeService; this.nodeService = nodeService; - this.eventPublisher = eventPublisher; + this.contentEventProducer = contentEventProducer; this.projectService = projectService; this.contentService = contentService; this.contentSynchronizer = contentSynchronizer; @@ -63,13 +62,13 @@ public SyncContentServiceImpl( @Reference final ContentTypeService contentTypeSe @Override public void resetInheritance( final ResetContentInheritParams params ) { - ResetContentInheritanceCommand.create( params ). - contentService( contentService ). - projectService( projectService ). - nodeService( nodeService ). - contentTypeService( contentTypeService ). - eventPublisher( eventPublisher ). - translator( translator ). + ResetContentInheritanceCommand.create( params ) + .contentService( contentService ) + .projectService( projectService ) + .nodeService( nodeService ) + .contentTypeService( contentTypeService ) + .contentEventProducer( contentEventProducer ) + .translator( translator ). contentSynchronizer( contentSynchronizer ). build(). execute(); diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UnpublishContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UnpublishContentCommand.java index f001a0d20e8..f057c06ab09 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UnpublishContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UnpublishContentCommand.java @@ -1,6 +1,7 @@ package com.enonic.xp.core.impl.content; import java.time.Instant; +import java.util.Objects; import com.google.common.base.Preconditions; @@ -8,6 +9,7 @@ import com.enonic.xp.content.ContentId; import com.enonic.xp.content.ContentIds; import com.enonic.xp.content.ContentPropertyNames; +import com.enonic.xp.content.PushContentListener; import com.enonic.xp.content.UnpublishContentParams; import com.enonic.xp.content.UnpublishContentsResult; import com.enonic.xp.context.Context; @@ -15,10 +17,11 @@ import com.enonic.xp.context.ContextBuilder; import com.enonic.xp.data.PropertyPath; import com.enonic.xp.data.PropertySet; +import com.enonic.xp.node.DeleteNodeParams; import com.enonic.xp.node.Node; +import com.enonic.xp.node.NodeBranchEntries; import com.enonic.xp.node.NodeCommitEntry; import com.enonic.xp.node.NodeId; -import com.enonic.xp.node.NodeIds; import com.enonic.xp.node.RefreshMode; import com.enonic.xp.node.RoutableNodeVersionId; import com.enonic.xp.node.RoutableNodeVersionIds; @@ -27,13 +30,17 @@ public class UnpublishContentCommand extends AbstractContentCommand { - private final UnpublishContentParams params; + private final ContentIds contentIds; + + private final PushContentListener publishContentListener; private UnpublishContentCommand( final Builder builder ) { super( builder ); - this.params = builder.params; + this.contentIds = builder.params.getContentIds(); + this.publishContentListener = + Objects.requireNonNullElseGet( builder.params.getPublishContentListener(), EmptyPushContentListener::new ); } public static Builder create() @@ -65,17 +72,15 @@ private ContentIds delete() { final ContentIds.Builder contentBuilder = ContentIds.create(); - for ( final ContentId contentId : this.params.getContentIds() ) + for ( final ContentId contentId : contentIds ) { - final NodeIds nodeIds = this.nodeService.deleteById( NodeId.from( contentId ) ); + final NodeBranchEntries nodeBranchEntries = + this.nodeService.delete( DeleteNodeParams.create().nodeId( NodeId.from( contentId ) ).build() ).getNodeBranchEntries(); - if ( nodeIds.isNotEmpty() ) + if ( nodeBranchEntries.isNotEmpty() ) { - if ( params.getPublishContentListener() != null ) - { - params.getPublishContentListener().contentPushed( nodeIds.getSize() ); - } - contentBuilder.addAll( ContentNodeHelper.toContentIds( nodeIds ) ); + publishContentListener.contentPushed( nodeBranchEntries.getSize() ); + contentBuilder.addAll( ContentNodeHelper.toContentIds( nodeBranchEntries.getKeys() ) ); } } return contentBuilder.build(); @@ -134,5 +139,20 @@ public UnpublishContentCommand build() } } + private static class EmptyPushContentListener + implements PushContentListener + { + @Override + public void contentPushed( final int count ) + { + + } + + @Override + public void contentResolved( final int count ) + { + + } + } } 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 0bfd7095145..c4fcc0249e1 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 @@ -106,7 +106,7 @@ private Content doExecute() .nodeService( this.nodeService ) .contentTypeService( this.contentTypeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( contentEventProducer ) .mediaInfo( mediaInfo ) .contentTypeService( this.contentTypeService ) .siteService( this.siteService ) diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/CreateContentCommandTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/CreateContentCommandTest.java index b60fac5cf5a..e411521a519 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/CreateContentCommandTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/CreateContentCommandTest.java @@ -595,7 +595,7 @@ private CreateContentCommand createContentCommand( CreateContentParams params ) .contentTypeService( this.contentTypeService ) .nodeService( this.nodeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) .mediaInfo( mediaInfo ) .xDataService( this.xDataService ) .siteService( this.siteService ) diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/FindContentIdsByQueryCommandTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/FindContentIdsByQueryCommandTest.java index 27576da7928..132b3620a9a 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/FindContentIdsByQueryCommandTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/FindContentIdsByQueryCommandTest.java @@ -65,12 +65,12 @@ public void test() Mockito.when( nodeService.findByQuery( Mockito.any( NodeQuery.class ) ) ).thenReturn( nodesByQueryResult ); - FindContentIdsByQueryCommand command = FindContentIdsByQueryCommand.create(). - translator( translator ). - nodeService( nodeService ). - contentTypeService( contentTypeService ). - eventPublisher( eventPublisher ). - query( ContentQuery.create(). + FindContentIdsByQueryCommand command = FindContentIdsByQueryCommand.create() + .translator( translator ) + .nodeService( nodeService ) + .contentTypeService( contentTypeService ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .query( ContentQuery.create(). queryExpr( QueryExpr.from( null, new DynamicOrderExpr( FunctionExpr.from( "geoDistance", ValueExpr.string( "my-value" ), ValueExpr.geoPoint( "83,80" ), ValueExpr.string( "km" ) ), OrderExpr.Direction.ASC ) ) ). diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetContentByIdAndVersionIdCommandTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetContentByIdAndVersionIdCommandTest.java index d52b42cf09e..76eb9acdb33 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetContentByIdAndVersionIdCommandTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetContentByIdAndVersionIdCommandTest.java @@ -106,14 +106,14 @@ public void testExecute_ContentNotFound() private GetContentByIdAndVersionIdCommand createInstance() { - return GetContentByIdAndVersionIdCommand.create(). - contentId( contentId ). - versionId( versionId ). - nodeService( nodeService ). - translator( translator ). - eventPublisher( eventPublisher ). - contentTypeService( contentTypeService ). - build(); + return GetContentByIdAndVersionIdCommand.create() + .contentId( contentId ) + .versionId( versionId ) + .nodeService( nodeService ) + .translator( translator ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .contentTypeService( contentTypeService ) + .build(); } } diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetContentByPathAndVersionIdCommandTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetContentByPathAndVersionIdCommandTest.java index 7d7b6a2acd2..61110ad695b 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetContentByPathAndVersionIdCommandTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetContentByPathAndVersionIdCommandTest.java @@ -109,13 +109,13 @@ public void testExecute_ContentNotFound() private GetContentByPathAndVersionIdCommand createInstance() { - return GetContentByPathAndVersionIdCommand.create(). - contentPath( contentPath ). - versionId( versionId ). - nodeService( nodeService ). - translator( translator ). - eventPublisher( eventPublisher ). - contentTypeService( contentTypeService ). + return GetContentByPathAndVersionIdCommand.create() + .contentPath( contentPath ) + .versionId( versionId ) + .nodeService( nodeService ) + .translator( translator ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .contentTypeService( contentTypeService ). build(); } } diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetNearestSiteCommandTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetNearestSiteCommandTest.java index b8dc93ee05f..df09770097e 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetNearestSiteCommandTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/GetNearestSiteCommandTest.java @@ -150,12 +150,12 @@ public void get_nearest_site_no_nearest_site() private GetNearestSiteCommand createCommand( final ContentId contentId ) { - return GetNearestSiteCommand.create(). - contentId( contentId ). - contentTypeService( this.contentTypeService ). - nodeService( this.nodeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(); + return GetNearestSiteCommand.create() + .contentId( contentId ) + .contentTypeService( this.contentTypeService ) + .nodeService( this.nodeService ) + .translator( this.translator ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .build(); } } diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/MoveContentCommandTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/MoveContentCommandTest.java index f57c03d37e2..24b5aba59f2 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/MoveContentCommandTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/MoveContentCommandTest.java @@ -50,12 +50,12 @@ public void move_non_existing_content() parentContentPath( ContentPath.ROOT ). build(); - MoveContentCommand command = MoveContentCommand.create( params ). - contentTypeService( this.contentTypeService ). - nodeService( this.nodeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(); + MoveContentCommand command = MoveContentCommand.create( params ) + .contentTypeService( this.contentTypeService ) + .nodeService( this.nodeService ) + .translator( this.translator ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .build(); Mockito.when( nodeService.getById( Mockito.isA( NodeId.class ) ) ).thenThrow( new NodeNotFoundException( "Node not found" ) ); @@ -79,12 +79,12 @@ public void move_fragment_to_the_same_site() parentContentPath( existingFolder.getPath() ). build(); - final MoveContentCommand command = MoveContentCommand.create( params ). - contentTypeService( this.contentTypeService ). - nodeService( this.nodeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(); + final MoveContentCommand command = MoveContentCommand.create( params ) + .contentTypeService( this.contentTypeService ) + .nodeService( this.nodeService ) + .translator( this.translator ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .build(); final Node mockNode = Node.create().parentPath( NodePath.ROOT ).build(); @@ -128,12 +128,12 @@ public void move_to_the_same_parent() parentContentPath( ContentPath.ROOT ). build(); - final MoveContentCommand command = MoveContentCommand.create( params ). - contentTypeService( this.contentTypeService ). - nodeService( this.nodeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - build(); + final MoveContentCommand command = MoveContentCommand.create( params ) + .contentTypeService( this.contentTypeService ) + .nodeService( this.nodeService ) + .translator( this.translator ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .build(); final Node mockNode = Node.create().name( existingContent.getName().toString() ).parentPath( ContentNodeHelper.translateContentParentToNodeParentPath( existingContent.getParentPath() ) ).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 bc9faeb5045..6253d02138a 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 @@ -198,7 +198,7 @@ private RenameContentCommand createCommand( final RenameContentParams params ) .contentTypeService( this.contentTypeService ) .nodeService( this.nodeService ) .translator( this.translator ) - .eventPublisher( this.eventPublisher ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) .xDataService( this.xDataService ) .pageDescriptorService( this.pageDescriptorService ) .partDescriptorService( this.partDescriptorService ) diff --git a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/UpdateContentCommandTest.java b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/UpdateContentCommandTest.java index c288aae4771..7a8e3d1358c 100644 --- a/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/UpdateContentCommandTest.java +++ b/modules/core/core-content/src/test/java/com/enonic/xp/core/impl/content/UpdateContentCommandTest.java @@ -60,12 +60,12 @@ public void given_content_not_found_when_handle_then_NOT_FOUND_is_returned() editor( edit -> { } ); - UpdateContentCommand command = UpdateContentCommand.create( params ). - contentTypeService( this.contentTypeService ). - nodeService( this.nodeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - mediaInfo( this.mediaInfo ). + UpdateContentCommand command = UpdateContentCommand.create( params ) + .contentTypeService( this.contentTypeService ) + .nodeService( this.nodeService ) + .translator( this.translator ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .mediaInfo( this.mediaInfo ). xDataService( this.xDataService ). siteService( this.siteService ). build(); @@ -92,12 +92,12 @@ public void contentDao_update_not_invoked_when_nothing_is_changed() editor( edit -> { } ); - UpdateContentCommand command = UpdateContentCommand.create( params ). - contentTypeService( this.contentTypeService ). - nodeService( this.nodeService ). - translator( this.translator ). - eventPublisher( this.eventPublisher ). - mediaInfo( this.mediaInfo ). + UpdateContentCommand command = UpdateContentCommand.create( params ) + .contentTypeService( this.contentTypeService ) + .nodeService( this.nodeService ) + .translator( this.translator ) + .contentEventProducer( new ContentEventProducer( eventPublisher ) ) + .mediaInfo( this.mediaInfo ). xDataService( this.xDataService ). siteService( this.siteService ). build(); diff --git a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ParentContentSynchronizerTest.java b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ParentContentSynchronizerTest.java index e10f3e72e98..4127d92052c 100644 --- a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ParentContentSynchronizerTest.java +++ b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/ParentContentSynchronizerTest.java @@ -29,6 +29,7 @@ import com.enonic.xp.content.SetContentChildOrderParams; import com.enonic.xp.content.UpdateContentParams; import com.enonic.xp.content.UpdateMediaParams; +import com.enonic.xp.core.impl.content.ContentEventProducer; import com.enonic.xp.core.impl.content.ContentEventsSyncParams; import com.enonic.xp.core.impl.content.ContentSyncEventType; import com.enonic.xp.core.impl.content.ContentSyncParams; @@ -65,8 +66,8 @@ protected void setUpNode() synchronizer = new ParentContentSynchronizer( this.contentService ); syncContentService = - new SyncContentServiceImpl( contentTypeService, nodeService, eventPublisher, pageDescriptorService, partDescriptorService, - layoutDescriptorService, projectService, contentService, synchronizer ); + new SyncContentServiceImpl( contentTypeService, nodeService, new ContentEventProducer( eventPublisher ), pageDescriptorService, + partDescriptorService, layoutDescriptorService, projectService, contentService, synchronizer ); } private Content syncCreated( final ContentId contentId ) diff --git a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/SyncContentServiceImplTest.java b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/SyncContentServiceImplTest.java index a6aa0af894f..77f95e57ec9 100644 --- a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/SyncContentServiceImplTest.java +++ b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/content/SyncContentServiceImplTest.java @@ -15,6 +15,7 @@ import com.enonic.xp.content.SetContentChildOrderParams; import com.enonic.xp.content.UpdateContentParams; import com.enonic.xp.content.WorkflowInfo; +import com.enonic.xp.core.impl.content.ContentEventProducer; import com.enonic.xp.core.impl.content.ContentEventsSyncParams; import com.enonic.xp.core.impl.content.ContentSyncEventType; import com.enonic.xp.core.impl.content.ParentContentSynchronizer; @@ -44,8 +45,8 @@ public void setUpNode() synchronizer = new ParentContentSynchronizer( contentService ); syncContentService = - new SyncContentServiceImpl( contentTypeService, nodeService, eventPublisher, pageDescriptorService, partDescriptorService, - layoutDescriptorService, projectService, contentService, synchronizer ); + new SyncContentServiceImpl( contentTypeService, nodeService, new ContentEventProducer( eventPublisher ), pageDescriptorService, + partDescriptorService, layoutDescriptorService, projectService, contentService, synchronizer ); } @Test From b956982018653d878001c122c59c30f057363887 Mon Sep 17 00:00:00 2001 From: rymsha Date: Fri, 16 Dec 2022 19:07:07 +0100 Subject: [PATCH 09/11] save --- .../impl/content/ContentEventProducer.java | 19 +++++-- .../impl/content/PublishContentCommand.java | 57 +++++++++++-------- .../impl/content/UnpublishContentCommand.java | 23 +++++++- 3 files changed, 66 insertions(+), 33 deletions(-) diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEventProducer.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEventProducer.java index cf0a5183618..9231e405dc4 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEventProducer.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/ContentEventProducer.java @@ -45,15 +45,24 @@ void deactivate() jobScheduler.shutdownNow(); } - public void put( final List online, final List offline ) + public void putOnlineOffline( final List online, final List offline ) { - this.eventPublisher.publish( ContentEvents.offline( offline ) ); - this.eventPublisher.publish( ContentEvents.online( online ) ); + if ( !offline.isEmpty() ) + { + this.eventPublisher.publish( ContentEvents.offline( offline ) ); + } + if ( !online.isEmpty() ) + { + this.eventPublisher.publish( ContentEvents.online( online ) ); + } } - public void put( final List offline ) + public void putOffline( final List offline ) { - this.eventPublisher.publish( ContentEvents.offline( offline ) ); + if ( !offline.isEmpty() ) + { + this.eventPublisher.publish( ContentEvents.offline( offline ) ); + } } } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java index 849ed65e25e..446f0edc8db 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java @@ -2,6 +2,7 @@ import java.time.Instant; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import com.google.common.base.Preconditions; @@ -60,7 +61,7 @@ private PublishContentCommand( final Builder builder ) this.includeDependencies = builder.includeDependencies; this.excludeChildrenIds = builder.excludeChildrenIds; this.resultBuilder = PublishContentResult.create(); - this.publishContentListener = builder.publishContentListener; + this.publishContentListener = Objects.requireNonNullElseGet( builder.publishContentListener, EmptyPushContentListener::new ); this.message = builder.message; } @@ -73,10 +74,7 @@ PublishContentResult execute() { final CompareContentResults results = getSyncWork(); - if ( publishContentListener != null ) - { - publishContentListener.contentResolved( results.size() ); - } + publishContentListener.contentResolved( results.size() ); doPush( results.contentIds() ); @@ -136,18 +134,14 @@ private void doPushNodes( final NodeIds nodesToPush ) { setPublishInfo( nodesToPush ); - final PushNodesResult pushNodesResult = nodeService.push( nodesToPush, ContentConstants.BRANCH_MASTER, count -> { - if ( publishContentListener != null ) - { - publishContentListener.contentPushed( count ); - } - } ); + final PushNodesResult pushNodesResult = + nodeService.push( nodesToPush, ContentConstants.BRANCH_MASTER, publishContentListener::contentPushed ); final NodeBranchEntries successful = pushNodesResult.getSuccessful(); commitPushedNodes( successful ); - List contents = successful.stream() + final List contents = successful.stream() .map( nodeBranchEntry -> translator.fromNode( Node.create( nodeService.getByNodeVersionKey( nodeBranchEntry.getNodeVersionKey() ) ) .nodeVersionId( nodeBranchEntry.getVersionId() ) @@ -157,19 +151,18 @@ private void doPushNodes( final NodeIds nodesToPush ) .build(), false ) ) .collect( Collectors.toList() ); - List contentsOffline = pushNodesResult.getSuccessfulEntries() + final List contentsOffline = pushNodesResult.getSuccessfulEntries() .stream() .filter( e -> e.getCurrentTargetPath() != null && !e.getCurrentTargetPath().equals( e.getNodeBranchEntry().getNodePath() ) ) - .map( e -> translator.fromNode( - Node.create( nodeService.getByNodeVersionKey( e.getNodeBranchEntry().getNodeVersionKey() ) ) - .nodeVersionId( e.getNodeBranchEntry().getVersionId() ) - .timestamp( e.getNodeBranchEntry().getTimestamp() ) - .parentPath( e.getCurrentTargetPath().getParentPath() ) - .name( e.getCurrentTargetPath().getName() ) - .build(), false ) ) + .map( e -> translator.fromNode( Node.create( nodeService.getByNodeVersionKey( e.getNodeBranchEntry().getNodeVersionKey() ) ) + .nodeVersionId( e.getNodeBranchEntry().getVersionId() ) + .timestamp( e.getNodeBranchEntry().getTimestamp() ) + .parentPath( e.getCurrentTargetPath().getParentPath() ) + .name( e.getCurrentTargetPath().getName() ) + .build(), false ) ) .collect( Collectors.toList() ); - this.contentEventProducer.put( contents, contentsOffline ); + this.contentEventProducer.putOnlineOffline( contents, contentsOffline ); this.resultBuilder.setFailed( ContentNodeHelper.toContentIds( pushNodesResult.getFailedEntries() .stream() @@ -232,10 +225,8 @@ private void setPublishInfo( final NodeIds nodesToPush ) } } ).id( id ).build() ); - if ( publishContentListener != null ) - { - publishContentListener.contentPushed( 1 ); - } + + publishContentListener.contentPushed( 1 ); } } @@ -342,4 +333,20 @@ public PublishContentCommand build() } } + + private static class EmptyPushContentListener + implements PushContentListener + { + @Override + public void contentPushed( final int count ) + { + + } + + @Override + public void contentResolved( final int count ) + { + + } + } } diff --git a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UnpublishContentCommand.java b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UnpublishContentCommand.java index f057c06ab09..271b7143e7c 100644 --- a/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UnpublishContentCommand.java +++ b/modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/UnpublishContentCommand.java @@ -1,10 +1,13 @@ package com.enonic.xp.core.impl.content; import java.time.Instant; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import com.google.common.base.Preconditions; +import com.enonic.xp.content.Content; import com.enonic.xp.content.ContentConstants; import com.enonic.xp.content.ContentId; import com.enonic.xp.content.ContentIds; @@ -70,7 +73,7 @@ public UnpublishContentsResult execute() private ContentIds delete() { - final ContentIds.Builder contentBuilder = ContentIds.create(); + final NodeBranchEntries.Builder contentBuilder = NodeBranchEntries.create(); for ( final ContentId contentId : contentIds ) { @@ -80,10 +83,24 @@ private ContentIds delete() if ( nodeBranchEntries.isNotEmpty() ) { publishContentListener.contentPushed( nodeBranchEntries.getSize() ); - contentBuilder.addAll( ContentNodeHelper.toContentIds( nodeBranchEntries.getKeys() ) ); + contentBuilder.addAll( nodeBranchEntries ); } } - return contentBuilder.build(); + + final NodeBranchEntries allDeleted = contentBuilder.build(); + final List contents = allDeleted.stream() + .map( nodeBranchEntry -> translator.fromNode( + Node.create( nodeService.getByNodeVersionKey( nodeBranchEntry.getNodeVersionKey() ) ) + .nodeVersionId( nodeBranchEntry.getVersionId() ) + .timestamp( nodeBranchEntry.getTimestamp() ) + .parentPath( nodeBranchEntry.getNodePath().getParentPath() ) + .name( nodeBranchEntry.getNodePath().getName() ) + .build(), false ) ) + .collect( Collectors.toList() ); + + contentEventProducer.putOffline( contents ); + + return ContentNodeHelper.toContentIds( allDeleted.getKeys() ); } private void removePublishInfoAndCommit( final ContentIds contentIds ) From dc35f55f6474dca6c94a852a8331e246e15f5bcd Mon Sep 17 00:00:00 2001 From: rymsha Date: Tue, 20 Dec 2022 11:05:59 +0100 Subject: [PATCH 10/11] save --- .../core/impl/content/ContentServiceImpl.java | 7 +- .../xp/repo/impl/node/NodeServiceImpl.java | 2 + .../xp/repo/impl/node/PushNodesCommand.java | 144 ++++++-------- .../impl/storage/NodeStorageServiceImpl.java | 50 ++--- .../repo/impl/dump/DumpServiceImplTest.java | 11 +- .../impl/node/CompareNodeCommandTest.java | 9 +- .../impl/node/CompareNodesCommandTest.java | 2 +- .../node/FindNodeIdsByParentCommandTest.java | 9 +- ...NodesWithVersionDifferenceCommandTest.java | 16 +- .../GetActiveNodeVersionsCommandTest.java | 3 +- .../node/PushNodesCommandPerformanceTest.java | 2 +- .../repo/impl/node/PushNodesCommandTest.java | 184 +++++++++--------- .../impl/node/ResolveSyncWorkCommandTest.java | 20 +- .../node/SetActiveVersionCommandTest.java | 10 +- .../xp/repo/impl/node/AbstractNodeTest.java | 79 ++++++-- .../content/AbstractContentServiceTest.java | 3 +- .../AbstractContentSynchronizerTest.java | 3 +- .../VersionTableVacuumTaskTest.java | 5 +- .../node/mapper/PushNodesResultMapper.java | 6 +- 19 files changed, 267 insertions(+), 298 deletions(-) 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 56f8b86fc79..3686097f5f8 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 @@ -102,7 +102,6 @@ import com.enonic.xp.context.ContextBuilder; import com.enonic.xp.core.impl.content.serializer.ContentDataSerializer; import com.enonic.xp.data.PropertyTree; -import com.enonic.xp.event.EventPublisher; import com.enonic.xp.form.FormDefaultValuesProcessor; import com.enonic.xp.media.MediaInfoService; import com.enonic.xp.node.Node; @@ -151,8 +150,6 @@ public class ContentServiceImpl private final NodeService nodeService; - private EventPublisher eventPublisher; - private ContentEventProducer contentEventProducer; private MediaInfoService mediaInfoService; @@ -1348,9 +1345,9 @@ public void setContentTypeService( final ContentTypeService contentTypeService ) } @Reference - public void setEventPublisher( final EventPublisher eventPublisher ) + public void setContentEventProducer( final ContentEventProducer contentEventProducer ) { - this.eventPublisher = eventPublisher; + this.contentEventProducer = contentEventProducer; } @Reference diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java index 5d3145a2f69..5f9506e759c 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java @@ -557,6 +557,8 @@ public NodeIds deleteByPath( final NodePath path ) build(). execute(); + refresh( RefreshMode.ALL ); + if ( deletedNodes.isNotEmpty() ) { this.eventPublisher.publish( NodeEvents.deleted( deletedNodes ) ); diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java index 25e48f7b8b3..c25e5f2ebd3 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java @@ -14,24 +14,29 @@ import com.enonic.xp.context.Context; import com.enonic.xp.context.ContextAccessor; import com.enonic.xp.context.ContextBuilder; -import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeBranchEntries; import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodeComparison; import com.enonic.xp.node.NodeComparisons; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeIds; +import com.enonic.xp.node.NodeIndexPath; import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeQuery; import com.enonic.xp.node.PushNodesListener; import com.enonic.xp.node.PushNodesResult; import com.enonic.xp.node.RefreshMode; +import com.enonic.xp.query.expr.CompareExpr; +import com.enonic.xp.query.expr.FieldExpr; +import com.enonic.xp.query.expr.QueryExpr; +import com.enonic.xp.query.expr.ValueExpr; import com.enonic.xp.repo.impl.InternalContext; import com.enonic.xp.repo.impl.SingleRepoSearchSource; import com.enonic.xp.repo.impl.search.NodeSearchService; -import com.enonic.xp.repo.impl.storage.StoreMovedNodeParams; +import com.enonic.xp.security.RoleKeys; import com.enonic.xp.security.acl.AccessControlList; import com.enonic.xp.security.acl.Permission; +import com.enonic.xp.security.auth.AuthenticationInfo; public class PushNodesCommand extends AbstractNodeCommand @@ -58,15 +63,39 @@ public static Builder create() public PushNodesResult execute() { - final Context context = ContextAccessor.current(); - refresh( RefreshMode.ALL ); - final InternalContext internalContext = InternalContext.from( context ); - final NodeBranchEntries nodeBranchEntries = this.nodeStorageService.getBranchNodeVersions( ids, internalContext ); + final InternalContext internalContext = InternalContext.from( ContextAccessor.current() ); + + final Context context = ContextAccessor.current(); + + NodeIds.Builder allIdsBuilder = NodeIds.create().addAll( ids ); final NodeComparisons comparisons = getNodeComparisons( ids ); + for ( NodeComparison comparison : comparisons ) + { + if ( comparison.getCompareStatus() == CompareStatus.MOVED ) + { + final NodeIds childrenIds = NodeIds.from( this.nodeSearchService.query( NodeQuery.create() + .query( QueryExpr.from( CompareExpr.like( + FieldExpr.from( NodeIndexPath.PATH ), + ValueExpr.string( + comparison.getTargetPath() + + "/*" ) ) ) ) + .size( NodeSearchService.GET_ALL_SIZE_FLAG ) + .build(), + SingleRepoSearchSource.from( targetContext() ) ) + .getIds() ); + allIdsBuilder.addAll( childrenIds ); + } + } + + final NodeIds allIds = allIdsBuilder.build(); + final NodeComparisons allComparisons = getNodeComparisons( allIds ); + + final NodeBranchEntries nodeBranchEntries = this.nodeStorageService.getBranchNodeVersions( allIds, internalContext ); + final PushNodesResult.Builder builder = PushNodesResult.create(); final List list = nodeBranchEntries.getSet() @@ -77,7 +106,7 @@ public PushNodesResult execute() final Set alreadyAdded = new HashSet<>(); for ( final NodeBranchEntry branchEntry : list ) { - final NodeComparison comparison = comparisons.get( branchEntry.getNodeId() ); + final NodeComparison comparison = allComparisons.get( branchEntry.getNodeId() ); final AccessControlList nodePermissions = this.nodeStorageService.getNodeVersion( branchEntry.getNodeVersionKey(), internalContext ).getPermissions(); @@ -89,7 +118,9 @@ public PushNodesResult execute() continue; } - if ( comparison.getCompareStatus() == CompareStatus.EQUAL ) + final CompareStatus compareStatus = comparison.getCompareStatus(); + + if ( compareStatus == CompareStatus.EQUAL ) { builder.addSuccess( branchEntry, comparison.getTargetPath() ); alreadyAdded.add( branchEntry.getNodePath() ); @@ -97,16 +128,15 @@ public PushNodesResult execute() continue; } - if ( ( CompareStatus.NEW == comparison.getCompareStatus() || CompareStatus.MOVED == comparison.getCompareStatus() ) && - targetAlreadyExists( branchEntry.getNodePath(), comparisons, context ) ) + if ( ( CompareStatus.NEW == compareStatus || CompareStatus.MOVED == compareStatus ) && + targetAlreadyExists( branchEntry.getNodePath(), comparisons ) ) { builder.addFailed( branchEntry, PushNodesResult.Reason.ALREADY_EXIST ); pushListener.nodesPushed( 1 ); continue; } - if ( !alreadyAdded.contains( branchEntry.getNodePath().getParentPath() ) && - !targetParentExists( branchEntry.getNodePath(), context ) ) + if ( !alreadyAdded.contains( branchEntry.getNodePath().getParentPath() ) && !targetParentExists( branchEntry.getNodePath() ) ) { builder.addFailed( branchEntry, PushNodesResult.Reason.PARENT_NOT_FOUND ); pushListener.nodesPushed( 1 ); @@ -115,17 +145,11 @@ public PushNodesResult execute() builder.addSuccess( branchEntry, comparison.getTargetPath() ); alreadyAdded.add( branchEntry.getNodePath() ); - - if ( comparison.getCompareStatus() == CompareStatus.MOVED ) - { - updateTargetChildrenMetaData( branchEntry, builder, alreadyAdded ); - } } final PushNodesResult result = builder.build(); - final InternalContext pushContext = InternalContext.create( context ).skipConstraints( true ).build(); - this.nodeStorageService.push( result.getSuccessfulEntries(), target, pushListener, pushContext ); + this.nodeStorageService.push( result.getSuccessfulEntries(), target, pushListener, InternalContext.create( context ).build() ); refresh( RefreshMode.ALL ); @@ -134,60 +158,19 @@ public PushNodesResult execute() private NodeComparisons getNodeComparisons( final NodeIds nodeIds ) { - return CompareNodesCommand.create(). - nodeIds( nodeIds ). - storageService( this.nodeStorageService ). - target( this.target ). - build(). - execute(); - } - - private void updateTargetChildrenMetaData( final NodeBranchEntry nodeBranchEntry, final PushNodesResult.Builder resultBuilder, - final Set alreadyAdded ) - { - final Context context = ContextAccessor.current(); - - final Context targetContext = ContextBuilder.create(). - authInfo( context.getAuthInfo() ). - branch( this.target ). - repositoryId( context.getRepositoryId() ). - build(); - - final NodeIds childrenIds = NodeIds.from( this.nodeSearchService.query( - NodeQuery.create().size( NodeSearchService.GET_ALL_SIZE_FLAG ).parent( nodeBranchEntry.getNodePath() ).build(), - SingleRepoSearchSource.from( ContextAccessor.current() ) ).getIds() ); - - final NodeBranchEntries childEntries = - this.nodeStorageService.getBranchNodeVersions( childrenIds, InternalContext.from( ContextAccessor.current() ) ); - - for ( final NodeBranchEntry child : childEntries ) - { - final NodeBranchEntry targetNodeEntry = - this.nodeStorageService.getBranchNodeVersion( child.getNodeId(), InternalContext.from( targetContext ) ); - - if ( targetNodeEntry != null ) - { - final Node childNode = doGetById( child.getNodeId() ); - - this.nodeStorageService.move( StoreMovedNodeParams.create().overrideVersion().node( childNode ).build(), - InternalContext.from( targetContext ) ); - - resultBuilder.addSuccess( child, targetNodeEntry.getNodePath() ); - alreadyAdded.add( child.getNodePath() ); - - updateTargetChildrenMetaData( child, resultBuilder, alreadyAdded ); - } - } + return CompareNodesCommand.create() + .nodeIds( nodeIds ) + .storageService( this.nodeStorageService ) + .target( this.target ) + .build() + .execute(); } - private boolean targetAlreadyExists( final NodePath nodePath, final NodeComparisons comparisons, final Context currentContext ) + private boolean targetAlreadyExists( final NodePath nodePath, final NodeComparisons comparisons ) { //Checks if a node exist - final Context targetContext = createTargetContext( currentContext ); - final NodeId nodeId = targetContext.callWith( () -> GetNodeIdByPathCommand.create( this ). - nodePath( nodePath ). - build(). - execute() ); + final NodeId nodeId = + targetContext().callWith( () -> GetNodeIdByPathCommand.create( this ).nodePath( nodePath ).build().execute() ); //If the node does not exist, returns false if ( nodeId == null ) @@ -200,30 +183,23 @@ private boolean targetAlreadyExists( final NodePath nodePath, final NodeComparis return nodeComparison == null || CompareStatus.MOVED != nodeComparison.getCompareStatus(); } - private boolean targetParentExists( final NodePath nodePath, final Context currentContext ) + private boolean targetParentExists( final NodePath nodePath ) { if ( nodePath.isRoot() || nodePath.getParentPath().equals( NodePath.ROOT ) ) { return true; } - final Context targetContext = createTargetContext( currentContext ); - - return targetContext.callWith( CheckNodeExistsCommand.create( this ).nodePath( nodePath.getParentPath() ).build()::execute ); + return targetContext().callWith( CheckNodeExistsCommand.create( this ).nodePath( nodePath.getParentPath() ).build()::execute ); } - private Context createTargetContext( final Context currentContext ) + private Context targetContext() { - final ContextBuilder targetContext = ContextBuilder.create(). - repositoryId( currentContext.getRepositoryId() ). - branch( target ); - - if ( currentContext.getAuthInfo() != null ) - { - targetContext.authInfo( currentContext.getAuthInfo() ); - } - - return targetContext.build(); + final Context context = ContextAccessor.current(); + return ContextBuilder.from( context ) + .branch( target ) + .authInfo( AuthenticationInfo.copyOf( context.getAuthInfo() ).principals( RoleKeys.ADMIN ).build() ) + .build(); } public static class Builder diff --git a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java index cb60e57c403..55e2b51be7f 100644 --- a/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java +++ b/modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java @@ -91,13 +91,11 @@ public Node store( final StoreNodeParams params, final InternalContext context ) timestamp( node.getTimestamp() ). build(), context ); - this.indexDataService.store( Node.create( node ). - nodeVersionId( nodeVersionId ). - build(), context ); + final Node newNode = Node.create( node ).nodeVersionId( nodeVersionId ).build(); - return Node.create( node ). - nodeVersionId( nodeVersionId ). - build(); + this.indexDataService.store( newNode, context ); + + return newNode; } @Override @@ -135,39 +133,31 @@ public Node move( final StoreMovedNodeParams params, final InternalContext conte final NodeBranchEntry nodeBranchEntry = this.branchService.get( node.id(), context ); + final NodeVersionId nodeVersionId = new NodeVersionId(); final NodeVersionKey nodeVersionKey = nodeVersionService.store( NodeVersion.from( node ), context ); - final NodeVersionId nodeVersionId; - if ( params.isNewVersion() ) - { - nodeVersionId = new NodeVersionId(); - this.versionService.store( NodeVersionMetadata.create() - .nodeId( node.id() ) - .nodeVersionId( nodeVersionId ) - .nodeVersionKey( nodeVersionKey ) - .binaryBlobKeys( getBinaryBlobKeys( node.getAttachedBinaries() ) ) - .nodePath( node.path() ) - .timestamp( node.getTimestamp() ) - .build(), context ); - } - else - { - nodeVersionId = node.getNodeVersionId(); - } + this.versionService.store( NodeVersionMetadata.create() + .nodeId( node.id() ) + .nodeVersionId( nodeVersionId ) + .nodeVersionKey( nodeVersionKey ) + .binaryBlobKeys( getBinaryBlobKeys( node.getAttachedBinaries() ) ) + .nodePath( node.path() ) + .timestamp( node.getTimestamp() ) + .build(), context ); this.branchService.store( NodeBranchEntry.create() .nodeId( node.id() ) .nodeVersionId( nodeVersionId ) .nodeVersionKey( nodeVersionKey ) .nodePath( node.path() ) - .timestamp( node.getTimestamp() ). - build(), nodeBranchEntry.getNodePath(), context ); + .timestamp( node.getTimestamp() ) + .build(), nodeBranchEntry.getNodePath(), context ); - this.indexDataService.store( node, context ); + final Node newNode = Node.create( node ).nodeVersionId( nodeVersionId ).build(); - return Node.create( node ). - nodeVersionId( nodeVersionId ). - build(); + this.indexDataService.store( newNode, context ); + + return newNode; } @Override @@ -211,7 +201,7 @@ public void push( final Collection entries, final Branch target, { final NodeBranchEntry nodeBranchEntry = entry.getNodeBranchEntry(); this.branchService.store( nodeBranchEntry, entry.getCurrentTargetPath(), - InternalContext.create( context ).branch( target ).build() ); + InternalContext.create( context ).skipConstraints( true ).branch( target ).build() ); pushListener.nodesPushed( 1 ); } diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/dump/DumpServiceImplTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/dump/DumpServiceImplTest.java index a008eb8bb29..8a9aa0118af 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/dump/DumpServiceImplTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/dump/DumpServiceImplTest.java @@ -54,7 +54,6 @@ import com.enonic.xp.node.NodeCommitQueryResult; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeIds; -import com.enonic.xp.node.NodeName; import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeVersion; import com.enonic.xp.node.NodeVersionId; @@ -69,7 +68,6 @@ import com.enonic.xp.repo.impl.dump.reader.FileDumpReader; import com.enonic.xp.repo.impl.dump.upgrade.obsoletemodel.pre5.Pre5ContentConstants; import com.enonic.xp.repo.impl.node.AbstractNodeTest; -import com.enonic.xp.repo.impl.node.MoveNodeCommand; import com.enonic.xp.repo.impl.node.NodeHelper; import com.enonic.xp.repo.impl.repository.UpdateRepositoryEntryParams; import com.enonic.xp.repository.CreateRepositoryParams; @@ -503,14 +501,7 @@ public void version_ids_should_stay_the_same_if_no_changes() { final Node node = createNode( NodePath.ROOT, "myNode" ); - MoveNodeCommand.create() - .searchService( this.searchService ) - .storageService( this.storageService ) - .indexServiceInternal( this.indexServiceInternal ) - .id( node.id() ) - .newNodeName( NodeName.from( "renamed" ) ) - .build() - .execute(); + renameNode( node.id(), "renamed" ); this.nodeService.push( NodeIds.from( node.id() ), WS_OTHER ); updateNode( node ); diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/CompareNodeCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/CompareNodeCommandTest.java index 4b768d38a5e..2e1d7bcda6e 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/CompareNodeCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/CompareNodeCommandTest.java @@ -181,14 +181,7 @@ public void status_moved_source() ctxDefault().runWith( () -> doPushNode( WS_OTHER, createdNode ) ); refresh(); - ctxDefault().runWith( () -> MoveNodeCommand.create(). - id( createdNode.id() ). - newParent( mySecondNode.path() ). - indexServiceInternal( this.indexServiceInternal ). - storageService( this.storageService ). - searchService( this.searchService ). - build(). - execute() ); + ctxDefault().runWith( () -> moveNode( createdNode.id(), mySecondNode.path() ) ); final NodeComparison comparison = ctxDefault().callWith( () -> doCompare( WS_OTHER, createdNode ) ); diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/CompareNodesCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/CompareNodesCommandTest.java index 7fc07d0b763..efb1752044a 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/CompareNodesCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/CompareNodesCommandTest.java @@ -41,7 +41,7 @@ public void compare_nodes() parent( NodePath.ROOT ). build() ); - pushNodes( NodeIds.from( node.id(), node2.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node.id(), node2.id() ); doDeleteNode( node2.id() ); diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/FindNodeIdsByParentCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/FindNodeIdsByParentCommandTest.java index 7b5bdd7e4c8..e27624f0f35 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/FindNodeIdsByParentCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/FindNodeIdsByParentCommandTest.java @@ -103,14 +103,7 @@ public void find_after_move_to_folder_with_same_name() nodeService.refresh( RefreshMode.ALL ); - MoveNodeCommand.create(). - newParent( node2.path() ). - id( node1_1.id() ). - indexServiceInternal( indexServiceInternal ). - searchService( searchService ). - storageService( storageService ). - build(). - execute(); + moveNode( node1_1.id(), node2.path() ); final FindNodesByParentResult children = FindNodeIdsByParentCommand.create(). parentPath( node.path() ). diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/FindNodesWithVersionDifferenceCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/FindNodesWithVersionDifferenceCommandTest.java index cdd202c388a..d46d25b7a60 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/FindNodesWithVersionDifferenceCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/FindNodesWithVersionDifferenceCommandTest.java @@ -156,7 +156,7 @@ public void moved_in_source() assertEquals( 0, getDiff( WS_DEFAULT, WS_OTHER ).getNodesWithDifferences().getSize() ); - doMoveNode( node, node2 ); + moveNode( node.id(), node2.path() ); assertEquals( 1, getDiff( WS_DEFAULT, WS_OTHER ).getNodesWithDifferences().getSize() ); assertEquals( 1, getDiff( WS_OTHER, WS_DEFAULT ).getNodesWithDifferences().getSize() ); @@ -182,7 +182,7 @@ public void moved_in_target() assertEquals( 0, getDiff( WS_DEFAULT, WS_OTHER ).getNodesWithDifferences().getSize() ); - ctxOther().runWith( () -> doMoveNode( node, node2 ) ); + ctxOther().runWith( () -> moveNode( node.id(), node2.path() ) ); assertEquals( 1, getDiff( WS_DEFAULT, WS_OTHER ).getNodesWithDifferences().getSize() ); assertEquals( 1, getDiff( WS_OTHER, WS_DEFAULT ).getNodesWithDifferences().getSize() ); @@ -308,18 +308,6 @@ public void deleted_in_target() assertEquals( 1, getDiff( WS_OTHER, WS_DEFAULT ).getNodesWithDifferences().getSize() ); } - private void doMoveNode( final Node node, final Node newParent ) - { - MoveNodeCommand.create(). - newParent( newParent.path() ). - id( node.id() ). - indexServiceInternal( this.indexServiceInternal ). - storageService( this.storageService ). - searchService( this.searchService ). - build(). - execute(); - } - private NodeVersionDiffResult getDiff( final Branch source, final Branch target ) { return getDiff( source, target, null ); diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/GetActiveNodeVersionsCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/GetActiveNodeVersionsCommandTest.java index ecd672bbf7d..682edf748a1 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/GetActiveNodeVersionsCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/GetActiveNodeVersionsCommandTest.java @@ -9,7 +9,6 @@ import com.enonic.xp.node.CreateNodeParams; import com.enonic.xp.node.GetActiveNodeVersionsResult; import com.enonic.xp.node.Node; -import com.enonic.xp.node.NodeIds; import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeVersionMetadata; import com.enonic.xp.node.UpdateNodeParams; @@ -42,7 +41,7 @@ public void get_active_versions() data( data ). build() ); - pushNodes( NodeIds.from( node.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node.id() ); final GetActiveNodeVersionsResult result = GetActiveNodeVersionsCommand.create(). storageService( this.storageService ). diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandPerformanceTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandPerformanceTest.java index 89e8feac3db..78b6bb0edfb 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandPerformanceTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandPerformanceTest.java @@ -57,7 +57,7 @@ void testReferencePerformance() started.stop(); final long elapsed = started.elapsed( TimeUnit.SECONDS ); - final int number = result.getSuccessful().getSize(); + final int number = result.getSuccessfulEntries().size(); System.out.println( "Pushed : " + number + " in " + started + ", " + ( elapsed == 0 ? "n/a" : ( number / elapsed ) + "/s" ) ); } diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java index 440df1e248e..9677bd2ebe1 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/PushNodesCommandTest.java @@ -8,9 +8,9 @@ import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeIds; -import com.enonic.xp.node.NodeName; import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeQuery; +import com.enonic.xp.node.PushNodeEntry; import com.enonic.xp.node.PushNodesResult; import com.enonic.xp.node.RefreshMode; import com.enonic.xp.node.UpdateNodeParams; @@ -18,6 +18,8 @@ import com.enonic.xp.security.acl.AccessControlList; import com.enonic.xp.security.acl.Permission; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -27,16 +29,14 @@ public class PushNodesCommandTest extends AbstractNodeTest { @BeforeEach - public void setUp() - throws Exception + void setUp() { this.createDefaultRootNode(); ctxOther().callWith( this::createDefaultRootNode ); } @Test - public void push_single() - throws Exception + void push_single() { final Node node = createNode( CreateNodeParams.create(). parent( NodePath.ROOT ). @@ -47,16 +47,15 @@ public void push_single() assertNull( testWsNode ); - pushNodes( NodeIds.from( node.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node.id() ); testWsNode = ctxOther().callWith( () -> getNodeById( node.id() ) ); - assertNotNull( testWsNode ); + assertThat( testWsNode ).extracting( Node::id ).isEqualTo( node.id() ); } @Test - public void push_child() - throws Exception + void push_child() { final Node node = createNode( CreateNodeParams.create(). parent( NodePath.ROOT ). @@ -68,17 +67,16 @@ public void push_child() name( "my-child" ). build() ); - pushNodes( NodeIds.from( node.id() ), WS_OTHER ); - pushNodes( NodeIds.from( child.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node.id() ); + pushNodes( WS_OTHER, child.id() ); final Node prodNode = ctxOther().callWith( () -> getNodeById( child.id() ) ); - assertNotNull( prodNode ); + assertThat( prodNode ).extracting( Node::id ).isEqualTo( child.id() ); } @Test - public void only_selected_node_pushed() - throws Exception + void only_selected_node_pushed() { final Node node = createNode( CreateNodeParams.create(). parent( NodePath.ROOT ). @@ -95,18 +93,18 @@ public void only_selected_node_pushed() name( "my-child2" ). build() ); - final PushNodesResult result = pushNodes( NodeIds.from( node.id() ), WS_OTHER ); - assertEquals( 1, result.getSuccessful().getSize() ); + final PushNodesResult result = pushNodes( WS_OTHER, node.id() ); + assertThat( result.getSuccessfulEntries() ).extracting( p -> p.getNodeBranchEntry().getNodeId() ).containsExactly( node.id() ); final FindNodesByQueryResult allNodesInOther = ctxOther().callWith( () -> FindNodesByQueryCommand.create(). - query( NodeQuery.create().build() ). + query( NodeQuery.create().parent( NodePath.ROOT ).build() ). indexServiceInternal( this.indexServiceInternal ). searchService( this.searchService ). storageService( this.storageService ). build(). execute() ); - assertEquals( 2L, allNodesInOther.getTotalHits() ); + assertThat( allNodesInOther.getNodeHits().getNodeIds() ).containsExactly( node.id() ); } @Test @@ -129,7 +127,7 @@ public void push_child_missing_permission() build() ).build() ). build() ); - final PushNodesResult result = pushNodes( NodeIds.from( node.id(), child.id() ), WS_OTHER ); + final PushNodesResult result = pushNodes( WS_OTHER, node.id(), child.id() ); assertEquals( 1, result.getSuccessfulEntries().size() ); assertEquals( 1, result.getFailedEntries().size() ); @@ -150,10 +148,10 @@ public void push_fail_if_node_already_exists() name( "my-node" ). build() ) ); - final PushNodesResult result = pushNodes( NodeIds.from( node.id() ), WS_OTHER ); + final PushNodesResult result = pushNodes( WS_OTHER, node.id() ); assertEquals( 1, result.getFailedEntries().size() ); - assertEquals( 0, result.getSuccessful().getSize() ); + assertEquals( 0, result.getSuccessfulEntries().size() ); assertEquals( PushNodesResult.Reason.ALREADY_EXIST, result.getFailedEntries().iterator().next().getReason() ); } @@ -169,13 +167,13 @@ public void push_rename_push_test() parent( NodePath.ROOT ). name( "my-node" ). build() ); - result = pushNodes( NodeIds.from( node.id() ), WS_OTHER ); - assertEquals( 1, result.getSuccessful().getSize() ); + result = pushNodes( WS_OTHER, node.id() ); + assertEquals( 1, result.getSuccessfulEntries().size() ); assertNotNull( getNodeByPath( NodePath.create( "/my-node" ).build() ) ); assertNotNull( getNodeByPathInOther( NodePath.create( "/my-node" ).build() ) ); //Renames the content - renameNode( node, "my-node-renamed" ); + renameNode( node.id(), "my-node-renamed" ); nodeService.refresh( RefreshMode.ALL ); assertNull( getNodeByPath( NodePath.create( "/my-node" ).build() ) ); @@ -183,8 +181,9 @@ public void push_rename_push_test() assertNotNull( getNodeByPathInOther( NodePath.create( "/my-node" ).build() ) ); //Pushed the renames content - result = pushNodes( NodeIds.from( node.id() ), WS_OTHER ); - assertEquals( 1, result.getSuccessful().getSize() ); + + result = pushNodes( WS_OTHER, node.id() ); + assertEquals( 1, result.getSuccessfulEntries().size() ); assertNull( getNodeByPathInOther( NodePath.create( "/my-node" ).build() ) ); assertNotNull( getNodeByPathInOther( NodePath.create( "/my-node-renamed" ).build() ) ); } @@ -203,7 +202,7 @@ public void push_child_fail_if_parent_does_not_exists() name( "my-child" ). build() ); - final PushNodesResult result = pushNodes( NodeIds.from( child.id() ), WS_OTHER ); + final PushNodesResult result = pushNodes( WS_OTHER, child.id() ); assertEquals( 1, result.getFailedEntries().size() ); assertEquals( PushNodesResult.Reason.PARENT_NOT_FOUND, result.getFailedEntries().iterator().next().getReason() ); @@ -238,8 +237,7 @@ public void ensure_order_for_publish_with_children() name( "my-child2_1" ). build() ); - final PushNodesResult result = - pushNodes( NodeIds.from( child2_1.id(), child1_1.id(), child1.id(), child2.id(), node.id() ), WS_OTHER ); + final PushNodesResult result = pushNodes( WS_OTHER, child2_1.id(), child1_1.id(), child1.id(), child2.id(), node.id() ); assertTrue( result.getFailedEntries().isEmpty() ); @@ -278,24 +276,13 @@ public void moved_nodes_yields_reindex_of_children() CreateNodeParams.create().parent( child2.path() ).name( "child2_1" ).setNodeId( NodeId.from( "child2_1" ) ).build() ); final PushNodesResult result = - pushNodes( NodeIds.from( node1.id(), node2.id(), child1.id(), child1_1.id(), child1_1_1.id(), child2.id(), child2_1.id() ), - WS_OTHER ); + pushNodes( WS_OTHER, node1.id(), node2.id(), child1.id(), child1_1.id(), child1_1_1.id(), child2.id(), child2_1.id() ); assertNotNull( getNodeByPathInOther( NodePath.create( node1.path(), child1.name().toString() ).build() ) ); - final Node movedNode = MoveNodeCommand.create() - .id( node1.id() ) - .newParent( node2.path() ) - .indexServiceInternal( this.indexServiceInternal ) - .storageService( this.storageService ) - .searchService( this.searchService ) - .build() - .execute() - .getMovedNodes() - .get( 0 ) - .getNode(); + final Node movedNode = moveNode( node1.id(), node2.path() ); - pushNodes( NodeIds.from( node1.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node1.id() ); assertNotNull( getNodeByPathInOther( NodePath.create( movedNode.path(), child1.name().toString() ).build() ) ); @@ -327,17 +314,57 @@ public void push_rename_push() setNodeId( NodeId.from( "child1_1" ) ). build() ); - pushNodes( NodeIds.from( parent.id(), child1.id() ), WS_OTHER ); + pushNodes( WS_OTHER, parent.id(), child1.id() ); - renameNode( parent, "parent-renamed" ); - renameNode( child1, "child1-renamed" ); - renameNode( child1_1, "child1_1-renamed" ); + renameNode( parent.id(), "parent-renamed" ); + renameNode( child1.id(), "child1-renamed" ); + renameNode( child1_1.id(), "child1_1-renamed" ); - final PushNodesResult result = pushNodes( NodeIds.from( parent.id(), child1.id() ), WS_OTHER ); + final PushNodesResult result = pushNodes( WS_OTHER, parent.id(), child1.id() ); - assertEquals( 2, result.getSuccessful().getSize() ); + assertEquals( 2, result.getSuccessfulEntries().size() ); } + @Test + void push_moved() + { + final Node a = createNode( CreateNodeParams.create(). + parent( NodePath.ROOT ). + name( "a" ). + setNodeId( NodeId.from( "a-id" ) ). + build() ); + + final Node b = createNode( CreateNodeParams.create(). + parent( NodePath.ROOT ). + name( "b" ). + setNodeId( NodeId.from( "b-id" ) ). + build() ); + + final Node c = createNode( CreateNodeParams.create(). + parent( b.path() ). + name( "c" ). + setNodeId( NodeId.from( "c-id" ) ). + build() ); + + final Node d = createNode( CreateNodeParams.create(). + parent( c.path() ). + name( "d" ). + setNodeId( NodeId.from( "d-id" ) ). + build() ); + + final NodeIds nodeIds1 = NodeIds.from( a.id(), b.id(), c.id(), d.id() ); + pushNodes( WS_OTHER, nodeIds1.stream().toArray( NodeId[]::new ) ); + + moveNode( b.id(), a.path() ); + + final PushNodesResult result = pushNodes( WS_OTHER, b.id() ); + + assertThat( result.getSuccessfulEntries() ).extracting( p -> p.getNodeBranchEntry().getNodeId(), p -> p.getNodeBranchEntry().getNodePath(), + PushNodeEntry::getCurrentTargetPath ) + .containsExactly( tuple( b.id(), new NodePath( "/a/b" ), new NodePath( "/b" )), + tuple( c.id(), new NodePath( "/a/b/c" ), new NodePath( "/b/c" ) ), + tuple( d.id(), new NodePath( "/a/b/c/d" ), new NodePath( "/b/c/d" ) ) ); + } @Test public void rename_to_name_already_there_but_renamed_in_same_push() @@ -355,15 +382,15 @@ public void rename_to_name_already_there_but_renamed_in_same_push() setNodeId( NodeId.from( "b" ) ). build() ); - pushNodes( NodeIds.from( a.id() ), WS_OTHER ); + pushNodes( WS_OTHER, a.id() ); renameNode( a.id(), "a_old" ); renameNode( b.id(), "a" ); - final PushNodesResult result = pushNodes( NodeIds.from( b.id(), a.id() ), WS_OTHER ); + final PushNodesResult result = pushNodes( WS_OTHER, b.id(), a.id() ); assertEquals( 0, result.getFailedEntries().size() ); - assertEquals( 2, result.getSuccessful().getSize() ); + assertEquals( 2, result.getSuccessfulEntries().size() ); } @Test @@ -412,22 +439,19 @@ public void push_after_rename() setNodeId( NodeId.from( "child2_1" ) ). build() ); - pushNodes( NodeIds.from( node.id(), node2.id(), child1.id(), child1_1.id(), child1_1_1.id(), child2.id(), child2_1.id() ), - WS_OTHER ); + pushNodes( WS_OTHER, node.id(), node2.id(), child1.id(), child1_1.id(), child1_1_1.id(), child2.id(), child2_1.id() ); - renameNode( node, "node1-renamed" ); - renameNode( child1, "child1-renamed" ); - renameNode( child1_1, "child1_1-renamed" ); - renameNode( child1_1_1, "child1_1_1-renamed" ); - renameNode( node2, "node2-renamed" ); - renameNode( child2, "child2-renamed" ); - renameNode( child2_1, "child2_1-renamed" ); + renameNode( node.id(), "node1-renamed" ); + renameNode( child1.id(), "child1-renamed" ); + renameNode( child1_1.id(), "child1_1-renamed" ); + renameNode( child1_1_1.id(), "child1_1_1-renamed" ); + renameNode( node2.id(), "node2-renamed" ); + renameNode( child2.id(), "child2-renamed" ); + renameNode( child2_1.id(), "child2_1-renamed" ); - final PushNodesResult result = - pushNodes( NodeIds.from( child1_1_1.id(), child1_1.id(), node.id(), child2_1.id(), node2.id(), child1.id(), child2.id() ), - WS_OTHER ); + final PushNodesResult result = pushNodes( WS_OTHER, child1_1_1.id(), child1_1.id(), node.id(), child2_1.id(), node2.id(), child1.id(), child2.id() ); - assertEquals( 7, result.getSuccessful().getSize() ); + assertEquals( 7, result.getSuccessfulEntries().size() ); } @Test @@ -445,7 +469,7 @@ public void push_after_update() editor( toUpdate -> toUpdate.data.addString( "newString", "newValue" ) ). build() ); - pushNodes( NodeIds.from( node.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node.id() ); final Node pushedNode = ctxOther().callWith( () -> nodeService.getById( node.id() ) ); @@ -468,40 +492,16 @@ public void push_with_capital_node_id() setNodeId( NodeId.from( "MyChildId" ) ). build() ); - pushNodes( NodeIds.from( node.id() ), WS_OTHER ); - pushNodes( NodeIds.from( child.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node.id() ); + pushNodes( WS_OTHER, child.id() ); final Node prodNode = ctxOther().callWith( () -> getNodeById( child.id() ) ); assertNotNull( prodNode ); } - private void renameNode( final Node node, final String newName ) - { - doRenameNode( node.id(), newName ); - } - - private void renameNode( final NodeId nodeId, final String newName ) - { - doRenameNode( nodeId, newName ); - } - - private void doRenameNode( final NodeId nodeId, final String newName ) - { - MoveNodeCommand.create() - .id( nodeId ) - .newNodeName( NodeName.from( newName ) ) - .indexServiceInternal( this.indexServiceInternal ) - .searchService( this.searchService ) - .storageService( this.storageService ) - .build() - .execute(); - } - private Node getNodeByPathInOther( final NodePath nodePath ) { return ctxOther().callWith( () -> getNodeByPath( nodePath ) ); } - - } diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/ResolveSyncWorkCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/ResolveSyncWorkCommandTest.java index eb350dae953..b3e04c6dbb5 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/ResolveSyncWorkCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/ResolveSyncWorkCommandTest.java @@ -700,7 +700,7 @@ public void do_publish_new_dependencies_of_moved_parent() pushAllNodesInS1S2Tree(); updateNode( "a2_1_1" ); - renameNode( "a2_1", "newName" ); + renameNode( NodeId.from( "a2_1" ), "newName" ); createNode( NodePath.ROOT, "s3" ); @@ -1151,7 +1151,8 @@ public void change_child_order_manual_yields_children_changed() createNode( node1.path(), "node1_4" ); refresh(); - pushNodes( NodeIds.from( ROOT_UUID.toString(), "node1", "node1_1", "node1_2", "node1_3", "node1_4" ), WS_OTHER ); + pushNodes( WS_OTHER, ROOT_UUID, NodeId.from( "node1" ), NodeId.from( "node1_1" ), NodeId.from( "node1_2" ), + NodeId.from( "node1_3" ), NodeId.from( "node1_4" ) ); SetNodeChildOrderCommand.create(). nodeId( node1.id() ). @@ -1240,7 +1241,8 @@ private void createS1S2Tree() private void pushAllNodesInS1S2Tree() { - pushNodes( NodeIds.from( ROOT_UUID.toString(), "s1", "s2", "a1", "a2", "a2_1", "b1", "b2", "b2_1" ), WS_OTHER ); + pushNodes( WS_OTHER, ROOT_UUID, NodeId.from( "s1" ), NodeId.from( "s2" ), NodeId.from( "a1" ), NodeId.from( "a2" ), + NodeId.from( "a2_1" ), NodeId.from( "b1" ), NodeId.from( "b2" ), NodeId.from( "b2_1" ) ); } @@ -1270,18 +1272,6 @@ private void moveNode( final String nodeId, final NodePath newParent, final Stri execute(); } - private void renameNode( final String nodeId, final String newName ) - { - MoveNodeCommand.create() - .id( NodeId.from( nodeId ) ) - .newNodeName( NodeName.from( newName ) ) - .indexServiceInternal( this.indexServiceInternal ) - .searchService( this.searchService ) - .storageService( this.storageService ) - .build() - .execute(); - } - private Node duplicateNode( final Node node1 ) { diff --git a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/SetActiveVersionCommandTest.java b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/SetActiveVersionCommandTest.java index dd361ee7a83..cb469e5913e 100644 --- a/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/SetActiveVersionCommandTest.java +++ b/modules/core/core-repo/src/test/java/com/enonic/xp/repo/impl/node/SetActiveVersionCommandTest.java @@ -8,7 +8,6 @@ import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeAccessException; import com.enonic.xp.node.NodeId; -import com.enonic.xp.node.NodeName; import com.enonic.xp.node.NodeNotFoundException; import com.enonic.xp.node.NodePath; import com.enonic.xp.node.UpdateNodeParams; @@ -79,14 +78,7 @@ public void metadata_not_updated() editor( toBeEdited -> toBeEdited.data.setString( "property1", "ver2" ) ). build() ); - MoveNodeCommand.create() - .id( node1.id() ) - .newNodeName( NodeName.from( "renamedNode" ) ) - .indexServiceInternal( this.indexServiceInternal ) - .searchService( this.searchService ) - .storageService( this.storageService ) - .build() - .execute(); + renameNode( node1.id(), "renamedNode" ); final Node movedNode = getNodeById( node1.id() ); assertEquals( "renamedNode", movedNode.name().toString() ); diff --git a/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/node/AbstractNodeTest.java b/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/node/AbstractNodeTest.java index 52853e27f3f..43e011e8321 100644 --- a/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/node/AbstractNodeTest.java +++ b/modules/core/core-repo/src/testFixtures/java/com/enonic/xp/repo/impl/node/AbstractNodeTest.java @@ -2,6 +2,7 @@ import java.nio.file.Path; import java.util.Iterator; +import java.util.Objects; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.io.TempDir; @@ -25,6 +26,7 @@ import com.enonic.xp.internal.blobstore.MemoryBlobStore; import com.enonic.xp.node.CreateNodeParams; import com.enonic.xp.node.CreateRootNodeParams; +import com.enonic.xp.node.FindNodesByParentParams; import com.enonic.xp.node.FindNodesByParentResult; import com.enonic.xp.node.FindNodesByQueryResult; import com.enonic.xp.node.Node; @@ -32,6 +34,7 @@ import com.enonic.xp.node.NodeCommitEntry; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeIds; +import com.enonic.xp.node.NodeName; import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeQuery; import com.enonic.xp.node.Nodes; @@ -462,19 +465,9 @@ protected void printContentRepoIndex() protected PushNodesResult pushNodes( final Branch target, final NodeId... nodeIds ) - { - return doPushNodes( NodeIds.from( nodeIds ), target ); - } - - protected PushNodesResult pushNodes( final NodeIds nodeIds, final Branch target ) - { - return doPushNodes( nodeIds, target ); - } - - private PushNodesResult doPushNodes( final NodeIds nodeIds, final Branch target ) { return PushNodesCommand.create(). - ids( nodeIds ). + ids( NodeIds.from( nodeIds ) ). target( target ). indexServiceInternal( this.indexServiceInternal ). storageService( this.storageService ). @@ -496,6 +489,34 @@ protected NodeIds doDeleteNode( final NodeId nodeId ) return NodeIds.from( result.getKeys() ); } + protected void renameNode( final NodeId nodeId, final String newName ) + { + MoveNodeCommand.create() + .id( nodeId ) + .newNodeName( NodeName.from( newName ) ) + .indexServiceInternal( this.indexServiceInternal ) + .searchService( this.searchService ) + .storageService( this.storageService ) + .build() + .execute(); + } + + protected Node moveNode( final NodeId nodeId, final NodePath newParent ) + { + return MoveNodeCommand.create() + .id( nodeId ) + .newParent( newParent ) + .indexServiceInternal( this.indexServiceInternal ) + .storageService( this.storageService ) + .searchService( this.searchService ) + .build() + .execute() + .getMovedNodes() + .get( 0 ) + .getNode(); + } + + protected void queryAndAssert( final String queryString, final int expected ) { final FindNodesByQueryResult result = doQuery( queryString ); @@ -579,4 +600,40 @@ protected Nodes getNodes( final NodeIds nodeIds ) execute(); } + + protected void printContentTree( final Branch branch ) + { + ContextBuilder.from( ContextAccessor.current() ) + .branch( branch ) + .build() + .runWith( () -> doPrintContentTree( nodeService.getByPath( NodePath.ROOT ).id() ) ); + } + + private void doPrintContentTree( final NodeId rootId ) + { + final Node root = this.nodeService.getById( rootId ); + + final Branch branch = ContextAccessor.current().getBranch(); + System.out.println( "** Node-tree in branch [" + branch.getValue() + "], starting with path [" + root.path() + "]" ); + + doPrintChildren( 0, root ); + } + + private void doPrintChildren( int ident, final Node root ) + { + System.out.println( " ".repeat( ident ) + "'--" + Objects.requireNonNullElse( root.name(), "" ) + " (" + root.id() + ")" ); + + ident += 3; + + final FindNodesByParentResult result = this.nodeService.findByParent( FindNodesByParentParams.create(). + parentId( root.id() ). + size( -1 ). + build() ); + + for ( final NodeId nodeId : result.getNodeIds() ) + { + doPrintChildren( ident, this.nodeService.getById( nodeId ) ); + } + } + } 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 041d1402708..73c2848bd72 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 @@ -50,6 +50,7 @@ import com.enonic.xp.core.impl.content.ContentAuditLogFilterService; import com.enonic.xp.core.impl.content.ContentAuditLogSupportImpl; import com.enonic.xp.core.impl.content.ContentConfig; +import com.enonic.xp.core.impl.content.ContentEventProducer; import com.enonic.xp.core.impl.content.ContentServiceImpl; import com.enonic.xp.core.impl.content.validate.ContentNameValidator; import com.enonic.xp.core.impl.content.validate.ExtraDataValidator; @@ -332,7 +333,7 @@ public void setUpAbstractContentServiceTest() projectService.initialize(); contentService = new ContentServiceImpl( nodeService, pageDescriptorService, partDescriptorService, layoutDescriptorService ); - contentService.setEventPublisher( eventPublisher ); + contentService.setContentEventProducer( new ContentEventProducer( eventPublisher ) ); contentService.setMediaInfoService( mediaInfoService ); contentService.setSiteService( siteService ); contentService.setContentTypeService( contentTypeService ); 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 0e0ddc0e6cb..e873dc328c7 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 @@ -29,6 +29,7 @@ import com.enonic.xp.core.impl.content.ContentAuditLogFilterService; import com.enonic.xp.core.impl.content.ContentAuditLogSupportImpl; import com.enonic.xp.core.impl.content.ContentConfig; +import com.enonic.xp.core.impl.content.ContentEventProducer; import com.enonic.xp.core.impl.content.ContentServiceImpl; import com.enonic.xp.core.impl.media.MediaInfoServiceImpl; import com.enonic.xp.core.impl.project.ProjectPermissionsContextManagerImpl; @@ -246,7 +247,7 @@ private void setUpContentService() new ContentAuditLogSupportImpl( contentConfig, new ContentAuditLogExecutor(), auditLogService, contentAuditLogFilterService ); contentService = new ContentServiceImpl( nodeService, pageDescriptorService, partDescriptorService, layoutDescriptorService ); - contentService.setEventPublisher( eventPublisher ); + contentService.setContentEventProducer( new ContentEventProducer( eventPublisher ) ); contentService.setMediaInfoService( mediaInfoService ); contentService.setSiteService( siteService ); contentService.setContentTypeService( contentTypeService ); diff --git a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/repo/vacuum/versiontable/VersionTableVacuumTaskTest.java b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/repo/vacuum/versiontable/VersionTableVacuumTaskTest.java index 1fd7bb50a98..e6541f5072f 100644 --- a/modules/itest/itest-core/src/test/java/com/enonic/xp/core/repo/vacuum/versiontable/VersionTableVacuumTaskTest.java +++ b/modules/itest/itest-core/src/test/java/com/enonic/xp/core/repo/vacuum/versiontable/VersionTableVacuumTaskTest.java @@ -8,7 +8,6 @@ import com.enonic.xp.node.Node; import com.enonic.xp.node.NodeId; -import com.enonic.xp.node.NodeIds; import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeVersionQuery; import com.enonic.xp.node.NodeVersionQueryResult; @@ -70,7 +69,7 @@ void delete_node_deletes_versions() void version_deleted_in_all_branches() { final Node node1 = createNode( NodePath.ROOT, "node1" ); - pushNodes( NodeIds.from( node1.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node1.id() ); this.nodeService.deleteById( node1.id() ); ctxOther().runWith( () -> this.nodeService.deleteById( node1.id() ) ); @@ -93,7 +92,7 @@ void version_deleted_in_all_branches() void version_not_deleted_in_all_branches() { final Node node1 = createNode( NodePath.ROOT, "node1" ); - pushNodes( NodeIds.from( node1.id() ), WS_OTHER ); + pushNodes( WS_OTHER, node1.id() ); refresh(); this.nodeService.deleteById( node1.id() ); diff --git a/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java b/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java index 1ef5ae43509..74e8308c8dc 100644 --- a/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java +++ b/modules/lib/lib-node/src/main/java/com/enonic/xp/lib/node/mapper/PushNodesResultMapper.java @@ -1,6 +1,6 @@ package com.enonic.xp.lib.node.mapper; -import com.enonic.xp.node.NodeBranchEntry; +import com.enonic.xp.node.PushNodeEntry; import com.enonic.xp.node.PushNodesResult; import com.enonic.xp.script.serializer.MapGenerator; import com.enonic.xp.script.serializer.MapSerializable; @@ -48,9 +48,9 @@ private void addFailed( final MapGenerator gen ) private void addSuccessful( final MapGenerator gen ) { gen.array( "success" ); - for ( final NodeBranchEntry success : result.getSuccessful() ) + for ( final PushNodeEntry success : result.getSuccessfulEntries() ) { - gen.value( success.getNodeId() ); + gen.value( success.getNodeBranchEntry().getNodeId() ); } gen.end(); } From 53accb6e689a170112dbad0b3e0b659f2ea36abf Mon Sep 17 00:00:00 2001 From: rymsha Date: Tue, 20 Dec 2022 13:57:52 +0100 Subject: [PATCH 11/11] save --- .../impl/audit/CleanUpAuditLogCommand.java | 7 +++- .../impl/audit/AuditLogServiceImplTest.java | 39 +++++++++++++++---- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/modules/core/core-audit/src/main/java/com/enonic/xp/core/impl/audit/CleanUpAuditLogCommand.java b/modules/core/core-audit/src/main/java/com/enonic/xp/core/impl/audit/CleanUpAuditLogCommand.java index eaaa170c06e..abc3d657ab7 100644 --- a/modules/core/core-audit/src/main/java/com/enonic/xp/core/impl/audit/CleanUpAuditLogCommand.java +++ b/modules/core/core-audit/src/main/java/com/enonic/xp/core/impl/audit/CleanUpAuditLogCommand.java @@ -11,6 +11,7 @@ import com.enonic.xp.audit.CleanUpAuditLogListener; import com.enonic.xp.audit.CleanUpAuditLogResult; import com.enonic.xp.data.ValueFactory; +import com.enonic.xp.node.DeleteNodeParams; import com.enonic.xp.node.FindNodesByQueryResult; import com.enonic.xp.node.NodeHit; import com.enonic.xp.node.NodeIndexPath; @@ -74,11 +75,13 @@ private CleanUpAuditLogResult doCleanUp() { for ( NodeHit nodeHit : nodesToDelete.getNodeHits() ) { - result.deleted( nodeService.deleteById( nodeHit.getNodeId() ).getSize() ); + result.deleted( nodeService.delete( DeleteNodeParams.create().nodeId( nodeHit.getNodeId() ).build() ) + .getNodeBranchEntries() + .getSize() ); listener.processed(); } - + nodeService.refresh( RefreshMode.SEARCH ); nodesToDelete = nodeService.findByQuery( query ); hits = nodesToDelete.getHits(); diff --git a/modules/core/core-audit/src/test/java/com/enonic/xp/core/impl/audit/AuditLogServiceImplTest.java b/modules/core/core-audit/src/test/java/com/enonic/xp/core/impl/audit/AuditLogServiceImplTest.java index f942a3ea8dc..51ba9f79044 100644 --- a/modules/core/core-audit/src/test/java/com/enonic/xp/core/impl/audit/AuditLogServiceImplTest.java +++ b/modules/core/core-audit/src/test/java/com/enonic/xp/core/impl/audit/AuditLogServiceImplTest.java @@ -2,7 +2,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatchers; import com.enonic.xp.audit.AuditLog; import com.enonic.xp.audit.AuditLogId; @@ -18,12 +17,17 @@ import com.enonic.xp.data.PropertyTree; import com.enonic.xp.index.IndexService; import com.enonic.xp.node.CreateNodeParams; +import com.enonic.xp.node.DeleteNodeParams; +import com.enonic.xp.node.DeleteNodeResult; import com.enonic.xp.node.FindNodesByQueryResult; import com.enonic.xp.node.Node; +import com.enonic.xp.node.NodeBranchEntries; +import com.enonic.xp.node.NodeBranchEntry; import com.enonic.xp.node.NodeHit; import com.enonic.xp.node.NodeHits; import com.enonic.xp.node.NodeId; import com.enonic.xp.node.NodeIds; +import com.enonic.xp.node.NodePath; import com.enonic.xp.node.NodeQuery; import com.enonic.xp.node.NodeService; import com.enonic.xp.node.Nodes; @@ -143,8 +147,15 @@ public void find() @Test public void cleanUpOneEmpty() { - when( nodeService.deleteById( ArgumentMatchers.isA( NodeId.class ) ) ).thenAnswer( - answer -> NodeIds.from( (NodeId) answer.getArgument( 0 ) ) ); + when( nodeService.delete( any() ) ).thenAnswer( answer -> DeleteNodeResult.create() + .nodeBranchEntries( NodeBranchEntries.create() + .add( NodeBranchEntry.create() + .nodeId( answer.getArgument( 0, DeleteNodeParams.class ).getNodeId() ) + .nodePath( NodePath.ROOT ) + .build() ) + .build() ) + .build() ); + when( config.ageThreshold() ).thenReturn( "PT1s" ); when( nodeService.findByQuery( any( NodeQuery.class ) ) ). @@ -165,8 +176,15 @@ public void cleanUpOneEmpty() @Test public void cleanUpOneBatch() { - when( nodeService.deleteById( ArgumentMatchers.isA( NodeId.class ) ) ).thenAnswer( - answer -> NodeIds.from( (NodeId) answer.getArgument( 0 ) ) ); + when( nodeService.delete( any() ) ).thenAnswer( answer -> DeleteNodeResult.create() + .nodeBranchEntries( NodeBranchEntries.create() + .add( NodeBranchEntry.create() + .nodeId( answer.getArgument( 0, DeleteNodeParams.class ).getNodeId() ) + .nodePath( NodePath.ROOT ) + .build() ) + .build() ) + .build() ); + when( config.ageThreshold() ).thenReturn( "PT1s" ); final FindNodesByQueryResult.Builder queryResult = FindNodesByQueryResult.create(). @@ -194,8 +212,15 @@ public void cleanUpOneBatch() @Test public void cleanUpMultipleBatch() { - when( nodeService.deleteById( ArgumentMatchers.isA( NodeId.class ) ) ).thenAnswer( - answer -> NodeIds.from( (NodeId) answer.getArgument( 0 ) ) ); + when( nodeService.delete( any() ) ).thenAnswer( answer -> DeleteNodeResult.create() + .nodeBranchEntries( NodeBranchEntries.create() + .add( NodeBranchEntry.create() + .nodeId( answer.getArgument( 0, DeleteNodeParams.class ).getNodeId() ) + .nodePath( NodePath.ROOT ) + .build() ) + .build() ) + .build() ); + when( config.ageThreshold() ).thenReturn( "PT1s" ); final FindNodesByQueryResult.Builder queryResult1 = FindNodesByQueryResult.create().