thanks Marcel,
I tried to use EmptyHook and empty CommitInfo just to try it out:
NodeBuilder newBuilder =
versionNodeState.builder().setProperty("custom:trashed", true);
nodeStore.merge(newBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
but the modification applied to the builder is not applied to the
FrozenNode after the merge (no errors are displayed). Am I missing
something? The hooks are additional actions/validators or they are what
actually apply the modifications defined in the NodeBuilder?
Other question, as you pointed out this is a very delicate operation, is
there anything at a higher level that I can use to modify a FrozenNode
property?
Marco.
On Tue, Jan 9, 2018 at 2:09 PM Marcel Reutegger <[email protected]>
wrote:
> Hi,
>
> you need to to first acquire a node builder from the root node state.
> This is the builder all your changes will be connected to. See
> documentation for details:
>
> https://jackrabbit.apache.org/oak/docs/architecture/nodestate.html
>
> Finally you will have to merge the root builder:
>
>
> https://jackrabbit.apache.org/oak/docs/apidocs/org/apache/jackrabbit/oak/spi/state/NodeStore.html#merge-org.apache.jackrabbit.oak.spi.state.NodeBuilder-org.apache.jackrabbit.oak.spi.commit.CommitHook-org.apache.jackrabbit.oak.spi.commit.CommitInfo-
>
> Please keep in mind that using this low level API will not guarantee
> integrity as required by the JCR specification or even some Oak
> internals. You are responsible for passing in the required CommitHook
> with editors and validators to ensure integrity depending on the changes
> you make. E.g. if you change an indexed property, you will have to
> ensure that index update editors are present in the commit hook.
>
> Regards
> Marcel
>
> On 09/01/18 09:07, Marco Piovesana wrote:
> > Hi Marcel,
> > here a piece of code that shows more less what I'm trying to do. I have
> the
> > NodeState of the verison I want to modify (versionNodeState) and I create
> > from it the updated version (updatedNodeState), but then I don't
> understand
> > how can I use it to update the actual value in the FrozenNode:
> >
> > public void changeFirstVersionProperty(NodeStore nodeStore, Node
> > myFolder) throws IOException, InvalidFileStoreVersionException,
> > RepositoryException {
> > NodeState versionNodeState = getNodeState(nodeStore, myFolder);
> > NodeState updatedNodeState =
> > versionNodeState.builder().setProperty("custom:trashed",
> > true).getNodeState();
> >
> > }
> >
> > private NodeState getNodeState(NodeStore nodeStore, Node node)
> throws
> > RepositoryException {
> > NodeState rootState = nodeStore.getRoot();
> > NodeState versionStorageState =
> >
> rootState.getChildNode(JcrConstants.JCR_SYSTEM).getChildNode(JcrConstants.JCR_VERSIONSTORAGE);
> > NodeState versionHistoryState =
> > getVersionHistoryState(versionStorageState, node.getIdentifier());
> > return
> >
> versionHistoryState.getChildNode("1.0").getChildNode(JcrConstants.JCR_FROZENNODE);
> > }
> >
> > private NodeState getVersionHistoryState(NodeState nodeState, String
> > remainingIdentifier) {
> > String clusterFolderName = remainingIdentifier.substring(0, 2);
> > NodeState childNode = nodeState.getChildNode(clusterFolderName);
> > if (childNode.exists()) {
> > return getVersionHistoryState(childNode,
> > remainingIdentifier.substring(2));
> > } else {
> > String versionHistoryNodeName = getFirstChild(nodeState);
> > return nodeState.getChildNode(versionHistoryNodeName);
> > }
> > }
> >
> > private String getFirstChild(NodeState nodeState) {
> > return nodeState.getChildNodeNames().iterator().next();
> > }
> >
> > Marco.
> >
> > On Tue, Jan 9, 2018 at 8:46 AM Marcel Reutegger
> <[email protected]>
> > wrote:
> >
> >> Hi,
> >>
> >> can you please provide a link to the upgrade script you have?
> >>
> >> Regards
> >> Marcel
> >>
> >> On 08/01/18 18:24, Marco Piovesana wrote:
> >>> Hi all,
> >>> I'm trying to modify a frozen node property in a custom upgrade
> script. I
> >>> was following this
> >>> <
> >>
> http://oak.markmail.org/message/htxdaeffnr73m3q6?q=frozen+node#query:frozen%20node+page:1+mid:ib57du3viyaz7x4b+state:results
> >>>
> >>> post and I tried to use the NodeStore API to do so. I am able to get
> the
> >>> NodeState of the required node (from the version storage), create a new
> >>> node state from its NodeBuilder, but then I don't understand how to
> >> replace
> >>> the previous node state with the new one so that the corresponding
> frozen
> >>> node will have the updated properties values. Am I doing it wrong? How
> >> can
> >>> I use the NodeStore API to modify a frozen node?
> >>>
> >>> Marco.
> >>>
> >>
> >
>