Skip to content

Commit 1e602e8

Browse files
committed
wip
1 parent 64bddaf commit 1e602e8

File tree

7 files changed

+120
-41
lines changed

7 files changed

+120
-41
lines changed

modules/core/core-api/src/main/java/com/enonic/xp/node/Attributes.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ public Attributes build()
5252
{
5353
return new Attributes( builder.build() );
5454
}
55+
56+
public Attributes buildKeepingLast()
57+
{
58+
return new Attributes( builder.buildKeepingLast() );
59+
}
5560
}
5661

5762
public static final class AttributeBuilder
@@ -69,6 +74,12 @@ private AttributeBuilder( final Attributes.Builder attributesBuilder, final Stri
6974
obj.put( "_key", key );
7075
}
7176

77+
public AttributeBuilder put( final String key, final GenericValue value )
78+
{
79+
obj.put( key, value );
80+
return this;
81+
}
82+
7283
public AttributeBuilder put( final String key, final String value )
7384
{
7485
obj.put( key, value );

modules/core/core-api/src/main/java/com/enonic/xp/node/NodeService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,6 @@ public interface NodeService
8484
void importNodeVersion( ImportNodeVersionParams params );
8585

8686
void importNodeCommit( ImportNodeCommitParams params );
87+
88+
void addAttributes( NodeVersionId nodeVersionId, Attributes attributes );
8789
}

modules/core/core-content/src/main/java/com/enonic/xp/core/impl/content/PublishContentCommand.java

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
import com.enonic.xp.content.PushContentListener;
1717
import com.enonic.xp.data.PropertySet;
1818
import com.enonic.xp.data.PropertyTree;
19+
import com.enonic.xp.node.Attributes;
1920
import com.enonic.xp.node.Node;
2021
import com.enonic.xp.node.NodeCommitEntry;
22+
import com.enonic.xp.node.NodeDataProcessor;
2123
import com.enonic.xp.node.NodeIds;
2224
import com.enonic.xp.node.NodePath;
2325
import com.enonic.xp.node.PushNodeParams;
@@ -145,7 +147,7 @@ private ContentValidityResult checkIfAllContentsValid( final ContentIds pushCont
145147
private void doPushNodes( final NodeIds nodesToPush )
146148
{
147149
final PushNodeParams.Builder pushNodeParams =
148-
PushNodeParams.create().ids( nodesToPush ).processor( this::setPublishInfo ).target( ContentConstants.BRANCH_MASTER );
150+
PushNodeParams.create().ids( nodesToPush ).processor( setPublishInfo() ).target( ContentConstants.BRANCH_MASTER );
149151
if ( publishContentListener != null )
150152
{
151153
pushNodeParams.publishListener( publishContentListener::contentPushed );
@@ -168,32 +170,35 @@ private void doPushNodes( final NodeIds nodesToPush )
168170
.forEach( resultBuilder::add );
169171
}
170172

171-
private PropertyTree setPublishInfo( final PropertyTree data, final NodePath nodePath )
173+
private NodeDataProcessor setPublishInfo()
172174
{
173-
var toBeEdited = data.copy();
174-
final PropertySet publishInfo = Objects.requireNonNullElseGet( toBeEdited.getSet( ContentPropertyNames.PUBLISH_INFO ),
175-
() -> toBeEdited.addSet( ContentPropertyNames.PUBLISH_INFO ) );
175+
return ( PropertyTree data, NodePath nodePath ) -> {
176+
var toBeEdited = data.copy();
177+
final PropertySet publishInfo = Objects.requireNonNullElseGet( toBeEdited.getSet( ContentPropertyNames.PUBLISH_INFO ),
178+
() -> toBeEdited.addSet( ContentPropertyNames.PUBLISH_INFO ) );
176179

177-
final Instant currentPublishFrom = publishInfo.getInstant( ContentPropertyNames.PUBLISH_FROM );
180+
final Instant currentPublishFrom = publishInfo.getInstant( ContentPropertyNames.PUBLISH_FROM );
178181

179-
if ( !publishInfo.hasProperty( ContentPropertyNames.PUBLISH_FIRST ) )
180-
{
181-
publishInfo.setInstant( ContentPropertyNames.PUBLISH_FIRST, Objects.requireNonNullElse( currentPublishFrom, publishFrom ) );
182-
}
183-
184-
if ( currentPublishFrom == null )
185-
{
186-
publishInfo.setInstant( ContentPropertyNames.PUBLISH_FROM, publishFrom );
187-
if ( publishTo == null )
182+
if ( !publishInfo.hasProperty( ContentPropertyNames.PUBLISH_FIRST ) )
188183
{
189-
publishInfo.removeProperties( ContentPropertyNames.PUBLISH_TO );
184+
publishInfo.setInstant( ContentPropertyNames.PUBLISH_FIRST, Objects.requireNonNullElse( currentPublishFrom, publishFrom ) );
190185
}
191-
else
186+
187+
if ( currentPublishFrom == null )
192188
{
193-
publishInfo.setInstant( ContentPropertyNames.PUBLISH_TO, publishTo );
189+
publishInfo.setInstant( ContentPropertyNames.PUBLISH_FROM, publishFrom );
190+
191+
if ( publishTo == null )
192+
{
193+
publishInfo.removeProperties( ContentPropertyNames.PUBLISH_TO );
194+
}
195+
else
196+
{
197+
publishInfo.setInstant( ContentPropertyNames.PUBLISH_TO, publishTo );
198+
}
194199
}
195-
}
196-
return toBeEdited;
200+
return toBeEdited;
201+
};
197202
}
198203

199204
private void commitPushedNodes( final Iterable<PushNodeResult> branchEntries )
@@ -211,6 +216,18 @@ private void commitPushedNodes( final Iterable<PushNodeResult> branchEntries )
211216
routableNodeVersionIds.add( routableNodeVersionId );
212217
}
213218
nodeService.commit( commitEntry, routableNodeVersionIds.build() );
219+
220+
final Attributes versionAttributes = Attributes.create()
221+
.attribute( "content.publish" )
222+
.put( "user", getCurrentUserKey().toString() )
223+
.put( "optime", Instant.now().toString() )
224+
.end()
225+
.build();
226+
227+
for ( var nbe : branchEntries )
228+
{
229+
nodeService.addAttributes( nbe.getNodeVersionId(), versionAttributes );
230+
}
214231
}
215232

216233
public static class Builder

modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/NodeServiceImpl.java

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.enonic.xp.event.EventPublisher;
2323
import com.enonic.xp.node.ApplyNodePermissionsParams;
2424
import com.enonic.xp.node.ApplyNodePermissionsResult;
25+
import com.enonic.xp.node.Attributes;
2526
import com.enonic.xp.node.CreateNodeParams;
2627
import com.enonic.xp.node.DeleteNodeParams;
2728
import com.enonic.xp.node.DeleteNodeResult;
@@ -59,14 +60,14 @@
5960
import com.enonic.xp.node.NodeService;
6061
import com.enonic.xp.node.NodeVersion;
6162
import com.enonic.xp.node.NodeVersionId;
63+
import com.enonic.xp.node.NodeVersionIds;
6264
import com.enonic.xp.node.NodeVersionKey;
6365
import com.enonic.xp.node.NodeVersionQuery;
6466
import com.enonic.xp.node.NodeVersionQueryResult;
6567
import com.enonic.xp.node.Nodes;
6668
import com.enonic.xp.node.PatchNodeParams;
6769
import com.enonic.xp.node.PatchNodeResult;
6870
import com.enonic.xp.node.PushNodeParams;
69-
import com.enonic.xp.node.PushNodesListener;
7071
import com.enonic.xp.node.PushNodesResult;
7172
import com.enonic.xp.node.RefreshMode;
7273
import com.enonic.xp.node.ResolveSyncWorkResult;
@@ -81,6 +82,7 @@
8182
import com.enonic.xp.query.expr.OrderExpr;
8283
import com.enonic.xp.repo.impl.InternalContext;
8384
import com.enonic.xp.repo.impl.NodeBranchEntries;
85+
import com.enonic.xp.repo.impl.NodeBranchEntry;
8486
import com.enonic.xp.repo.impl.NodeEvents;
8587
import com.enonic.xp.repo.impl.SearchPreference;
8688
import com.enonic.xp.repo.impl.binary.BinaryService;
@@ -383,7 +385,9 @@ public Node update( final UpdateNodeParams params )
383385
{
384386
verifyContext();
385387

386-
final PatchNodeResult result = PatchNodeCommand.create().params( convertUpdateParams( params ) ).binaryService( this.binaryService )
388+
final PatchNodeResult result = PatchNodeCommand.create()
389+
.params( convertUpdateParams( params ) )
390+
.binaryService( this.binaryService )
387391
.indexServiceInternal( this.indexServiceInternal )
388392
.storageService( this.nodeStorageService )
389393
.searchService( this.nodeSearchService )
@@ -520,11 +524,8 @@ public PushNodesResult push( final PushNodeParams params )
520524
}
521525

522526
return pushNodesResult;
523-
524527
}
525528

526-
527-
528529
@Override
529530
public DuplicateNodeResult duplicate( final DuplicateNodeParams params )
530531
{
@@ -910,8 +911,14 @@ public void importNodeCommit( final ImportNodeCommitParams params )
910911
public NodeCommitEntry commit( final NodeCommitEntry nodeCommitEntry, final RoutableNodeVersionIds routableNodeVersionIds )
911912
{
912913
verifyContext();
913-
final NodeCommitEntry commit =
914-
nodeStorageService.commit( nodeCommitEntry, routableNodeVersionIds, InternalContext.from( ContextAccessor.current() ) );
914+
915+
final InternalContext context =
916+
InternalContext.create( ContextAccessor.current() ).searchPreference( SearchPreference.PRIMARY ).build();
917+
918+
final NodeVersionIds nodeVersionIds =
919+
routableNodeVersionIds.stream().map( RoutableNodeVersionId::getNodeVersionId ).collect( NodeVersionIds.collector() );
920+
921+
final NodeCommitEntry commit = nodeStorageService.commit( nodeCommitEntry, nodeVersionIds, context );
915922

916923
refresh( RefreshMode.STORAGE );
917924

@@ -926,18 +933,30 @@ public NodeCommitEntry commit( final NodeCommitEntry nodeCommitEntry, final Node
926933
final InternalContext context =
927934
InternalContext.create( ContextAccessor.current() ).searchPreference( SearchPreference.PRIMARY ).build();
928935

929-
final NodeBranchEntries branchNodeVersions = nodeStorageService.getBranchNodeVersions( nodeIds, context );
930-
final RoutableNodeVersionIds routableNodeVersionIds = branchNodeVersions.stream()
931-
.map( branchEntry -> RoutableNodeVersionId.from( branchEntry.getNodeId(), branchEntry.getVersionId() ) )
932-
.collect( RoutableNodeVersionIds.collector() );
936+
final NodeVersionIds nodeVersionIds = nodeStorageService.getBranchNodeVersions( nodeIds, context )
937+
.stream()
938+
.map( NodeBranchEntry::getVersionId )
939+
.collect( NodeVersionIds.collector() );
933940

934-
final NodeCommitEntry commitEntry = nodeStorageService.commit( nodeCommitEntry, routableNodeVersionIds, context );
941+
final NodeCommitEntry commitEntry = nodeStorageService.commit( nodeCommitEntry, nodeVersionIds, context );
935942

936943
refresh( RefreshMode.STORAGE );
937944

938945
return commitEntry;
939946
}
940947

948+
@Override
949+
public void addAttributes( final NodeVersionId nodeVersionId, final Attributes attributes )
950+
{
951+
verifyContext();
952+
953+
final InternalContext context =
954+
InternalContext.create( ContextAccessor.current() ).searchPreference( SearchPreference.PRIMARY ).build();
955+
nodeStorageService.setAttribute( nodeVersionId, attributes, context );
956+
957+
refresh( RefreshMode.STORAGE );
958+
}
959+
941960
@Override
942961
public NodeCommitEntry getCommit( final NodeCommitId nodeCommitId )
943962
{

modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/node/PushNodesCommand.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.enonic.xp.repo.impl.InternalContext;
3535
import com.enonic.xp.repo.impl.NodeBranchEntries;
3636
import com.enonic.xp.repo.impl.NodeBranchEntry;
37+
import com.enonic.xp.repo.impl.SearchPreference;
3738
import com.enonic.xp.repo.impl.SingleRepoSearchSource;
3839
import com.enonic.xp.repo.impl.search.NodeSearchService;
3940
import com.enonic.xp.repo.impl.storage.NodeVersionData;
@@ -69,7 +70,8 @@ public PushNodesResult execute()
6970
{
7071
refresh( RefreshMode.ALL );
7172

72-
final InternalContext internalContext = InternalContext.from( ContextAccessor.current() );
73+
final InternalContext internalContext =
74+
InternalContext.create( ContextAccessor.current() ).searchPreference( SearchPreference.PRIMARY ).build();
7375

7476
NodeIds.Builder allIdsBuilder = NodeIds.create().addAll( params.getIds() );
7577

@@ -163,6 +165,7 @@ public PushNodesResult execute()
163165

164166
final PushNodesResult result = builder.build();
165167
this.nodeStorageService.push( successfulPush, params.getTarget(), pushListener, internalContext );
168+
166169
final InternalContext targetContext = InternalContext.create( internalContext ).branch( params.getTarget() ).build();
167170
for ( PushNodeResult pushNodeResult : result.getSuccessful() )
168171
{
@@ -196,7 +199,8 @@ private NodeBranchEntry processBeforePush( NodeBranchEntry nbe, InternalContext
196199
final NodeVersion version = this.nodeStorageService.getNodeVersion( nbe.getNodeVersionKey(), internalContext );
197200

198201
final PropertyTree processedData = params.getProcessor().process( version.getData(), nbe.getNodePath() );
199-
if ( processedData.equals( version.getData() ) ) {
202+
if ( processedData.equals( version.getData() ) )
203+
{
200204
return nbe;
201205
}
202206

@@ -208,8 +212,7 @@ private NodeBranchEntry processBeforePush( NodeBranchEntry nbe, InternalContext
208212
.timestamp( Instant.now( CLOCK ) )
209213
.build();
210214

211-
final NodeVersionData stored =
212-
this.nodeStorageService.store( StoreNodeParams.newVersion( changedNode, params.getVersionAttributes() ), internalContext );
215+
final NodeVersionData stored = this.nodeStorageService.store( StoreNodeParams.newVersion( changedNode ), internalContext );
213216

214217
return NodeBranchEntry.fromNodeVersionMetadata( stored.nodeVersionMetadata() );
215218
}

modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageService.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33

44
import java.util.Collection;
55

6+
import com.enonic.xp.node.Attributes;
7+
import com.enonic.xp.node.NodeVersionIds;
68
import com.enonic.xp.node.NodeVersionKey;
79
import com.enonic.xp.branch.Branch;
810
import com.enonic.xp.node.Node;
@@ -17,11 +19,11 @@
1719
import com.enonic.xp.node.NodeVersionMetadata;
1820
import com.enonic.xp.node.Nodes;
1921
import com.enonic.xp.node.PushNodesListener;
20-
import com.enonic.xp.node.RoutableNodeVersionIds;
2122
import com.enonic.xp.repo.impl.InternalContext;
2223
import com.enonic.xp.repo.impl.NodeBranchEntries;
2324
import com.enonic.xp.repo.impl.NodeBranchEntry;
2425
import com.enonic.xp.security.acl.AccessControlList;
26+
import com.enonic.xp.util.GenericValue;
2527

2628
public interface NodeStorageService
2729
{
@@ -37,7 +39,9 @@ public interface NodeStorageService
3739

3840
void push( Collection<NodeBranchEntry> entries, Branch target, PushNodesListener pushListener, InternalContext context );
3941

40-
NodeCommitEntry commit( NodeCommitEntry entry, RoutableNodeVersionIds routableNodeVersionIds, InternalContext context );
42+
NodeCommitEntry commit( NodeCommitEntry entry, NodeVersionIds versionIds, InternalContext context );
43+
44+
void setAttribute( NodeVersionId versionId, Attributes attributes, InternalContext context );
4145

4246
Node get( NodeId nodeId, InternalContext context );
4347

modules/core/core-repo/src/main/java/com/enonic/xp/repo/impl/storage/NodeStorageServiceImpl.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.enonic.xp.branch.Branch;
1818
import com.enonic.xp.node.AttachedBinaries;
1919
import com.enonic.xp.node.AttachedBinary;
20+
import com.enonic.xp.node.Attributes;
2021
import com.enonic.xp.node.Node;
2122
import com.enonic.xp.node.NodeCommitEntry;
2223
import com.enonic.xp.node.NodeCommitId;
@@ -26,6 +27,7 @@
2627
import com.enonic.xp.node.NodePaths;
2728
import com.enonic.xp.node.NodeVersion;
2829
import com.enonic.xp.node.NodeVersionId;
30+
import com.enonic.xp.node.NodeVersionIds;
2931
import com.enonic.xp.node.NodeVersionKey;
3032
import com.enonic.xp.node.NodeVersionMetadata;
3133
import com.enonic.xp.node.Nodes;
@@ -43,6 +45,7 @@
4345
import com.enonic.xp.repo.impl.version.VersionService;
4446
import com.enonic.xp.security.acl.AccessControlList;
4547
import com.enonic.xp.security.acl.Permission;
48+
import com.enonic.xp.util.GenericValue;
4649

4750
import static com.enonic.xp.repo.impl.node.NodeConstants.CLOCK;
4851

@@ -167,7 +170,7 @@ public void deleteFromIndex( final NodeId nodeId, final InternalContext internal
167170
}
168171

169172
@Override
170-
public NodeCommitEntry commit( final NodeCommitEntry nodeCommitEntry, final RoutableNodeVersionIds routableNodeVersionIds,
173+
public NodeCommitEntry commit( final NodeCommitEntry nodeCommitEntry, final NodeVersionIds versionIds,
171174
final InternalContext context )
172175
{
173176
final NodeCommitId nodeCommitId = new NodeCommitId();
@@ -176,10 +179,10 @@ public NodeCommitEntry commit( final NodeCommitEntry nodeCommitEntry, final Rout
176179
build();
177180
this.commitService.store( updatedCommitEntry, context );
178181

179-
for ( RoutableNodeVersionId routableNodeVersionId : routableNodeVersionIds )
182+
for ( final NodeVersionId versionId : versionIds )
180183
{
181184
final NodeVersionMetadata existingVersion =
182-
this.versionService.getVersion( routableNodeVersionId.getNodeVersionId(), context );
185+
this.versionService.getVersion( versionId, context );
183186

184187
final NodeVersionMetadata updatedVersion = NodeVersionMetadata.create().
185188
nodeVersionId( existingVersion.getNodeVersionId() ).
@@ -196,6 +199,26 @@ public NodeCommitEntry commit( final NodeCommitEntry nodeCommitEntry, final Rout
196199
return updatedCommitEntry;
197200
}
198201

202+
@Override
203+
public void setAttribute( final NodeVersionId versionId, Attributes value, final InternalContext context )
204+
{
205+
final NodeVersionMetadata existingVersion = this.versionService.getVersion( versionId, context );
206+
207+
final Attributes newAttrs =
208+
Attributes.create().addAll( existingVersion.getAttributes().list() ).addAll( value.list() ).buildKeepingLast();
209+
final NodeVersionMetadata updatedVersion = NodeVersionMetadata.create()
210+
.nodeVersionId( existingVersion.getNodeVersionId() )
211+
.nodeVersionKey( existingVersion.getNodeVersionKey() )
212+
.binaryBlobKeys( existingVersion.getBinaryBlobKeys() )
213+
.nodeId( existingVersion.getNodeId() )
214+
.nodePath( existingVersion.getNodePath() )
215+
.timestamp( existingVersion.getTimestamp() )
216+
.attributes( newAttrs )
217+
.nodeCommitId( existingVersion.getNodeCommitId() )
218+
.build();
219+
this.versionService.store( updatedVersion, context );
220+
}
221+
199222
@Override
200223
public Node get( final NodeId nodeId, final InternalContext context )
201224
{

0 commit comments

Comments
 (0)