Author: stillalex
Date: Wed Jun 20 07:30:56 2018
New Revision: 1833892
URL: http://svn.apache.org/viewvc?rev=1833892&view=rev
Log:
OAK-7532 VersionStorageEditor should allow bootstraping of initial content
Modified:
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java
Modified:
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java
(original)
+++
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/VersionConstants.java
Wed Jun 20 07:30:56 2018
@@ -150,4 +150,7 @@ public interface VersionConstants extend
VersionConstants.REP_ACTIVITIES,
VersionConstants.REP_CONFIGURATIONS
);
+
+ // flag indicating the version store has been initialized
+ String VERSION_STORE_INIT = ":initialized";
}
\ No newline at end of file
Modified:
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java
(original)
+++
jackrabbit/oak/trunk/oak-core-spi/src/main/java/org/apache/jackrabbit/oak/spi/version/package-info.java
Wed Jun 20 07:30:56 2018
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-@Version("1.0.0")
+@Version("1.1.0")
package org.apache.jackrabbit.oak.spi.version;
import org.osgi.annotation.versioning.Version;
\ No newline at end of file
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/InitialContent.java
Wed Jun 20 07:30:56 2018
@@ -25,6 +25,7 @@ import static org.apache.jackrabbit.oak.
import static
org.apache.jackrabbit.oak.plugins.index.IndexConstants.TYPE_PROPERTY_NAME;
import static
org.apache.jackrabbit.oak.plugins.memory.ModifiedNodeState.squeeze;
import static
org.apache.jackrabbit.oak.spi.version.VersionConstants.REP_VERSIONSTORAGE;
+import static
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_INIT;
import com.google.common.collect.ImmutableList;
@@ -142,15 +143,15 @@ public class InitialContent implements R
}
//--------------------------< internal
>------------------------------------
-
- private boolean isInitialized(NodeBuilder versionStorage) {
- PropertyState init = versionStorage.getProperty(":initialized");
+
+ private static boolean isInitialized(NodeBuilder versionStorage) {
+ PropertyState init = versionStorage.getProperty(VERSION_STORE_INIT);
return init != null && init.getValue(Type.LONG) > 0;
}
- private void createIntermediateNodes(NodeBuilder versionStorage) {
+ private static void createIntermediateNodes(NodeBuilder versionStorage) {
String fmt = "%02x";
- versionStorage.setProperty(":initialized", 1);
+ versionStorage.setProperty(VERSION_STORE_INIT, 1);
for (int i = 0; i < 0xff; i++) {
NodeBuilder c = storageChild(versionStorage, String.format(fmt,
i));
for (int j = 0; j < 0xff; j++) {
@@ -158,8 +159,8 @@ public class InitialContent implements R
}
}
}
-
- private NodeBuilder storageChild(NodeBuilder node, String name) {
+
+ private static NodeBuilder storageChild(NodeBuilder node, String name) {
NodeBuilder c = node.child(name);
if (!c.hasProperty(JCR_PRIMARYTYPE)) {
c.setProperty(JCR_PRIMARYTYPE, REP_VERSIONSTORAGE, Type.NAME);
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionStorageEditor.java
Wed Jun 20 07:30:56 2018
@@ -22,6 +22,7 @@ import org.apache.jackrabbit.oak.api.Com
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.spi.commit.DefaultEditor;
import org.apache.jackrabbit.oak.spi.commit.Editor;
+import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -31,7 +32,9 @@ import static org.apache.jackrabbit.JcrC
import static org.apache.jackrabbit.oak.commons.PathUtils.concat;
import static org.apache.jackrabbit.oak.commons.PathUtils.getDepth;
import static org.apache.jackrabbit.oak.commons.PathUtils.relativize;
+import static
org.apache.jackrabbit.oak.spi.state.AbstractNodeState.comparePropertiesAgainstBaseState;
import static
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_NODE_TYPE_NAMES;
+import static
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_INIT;
import static
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_NT_NAMES;
import static
org.apache.jackrabbit.oak.spi.version.VersionConstants.VERSION_STORE_PATH;
@@ -46,6 +49,7 @@ class VersionStorageEditor extends Defau
private final NodeBuilder workspaceRoot;
private final NodeBuilder builder;
private final String path;
+ private boolean initPhase;
private ReadWriteVersionManager vMgr;
VersionStorageEditor(@Nonnull NodeBuilder versionStorageNode,
@@ -65,6 +69,13 @@ class VersionStorageEditor extends Defau
}
@Override
+ public void enter(NodeState before, NodeState after) {
+ if (VERSION_STORE_PATH.equals(path)) {
+ initPhase = isInitializationPhase(before, after);
+ }
+ }
+
+ @Override
public Editor childNodeChanged(String name,
NodeState before,
NodeState after)
@@ -92,6 +103,10 @@ class VersionStorageEditor extends Defau
!isVersionStorageNode(after)) {
return null;
}
+ // allow node addition during initialization phase
+ if (initPhase) {
+ return null;
+ }
return throwProtected(name);
}
@@ -157,4 +172,13 @@ class VersionStorageEditor extends Defau
private Editor throwProtected(String name) throws CommitFailedException {
return Utils.throwProtected(concat(path, name));
}
+
+ private static boolean isInitializationPhase(NodeState before, NodeState
after) {
+ return !comparePropertiesAgainstBaseState(after, before, new
DefaultNodeStateDiff() {
+ @Override
+ public boolean propertyAdded(PropertyState after) {
+ return !after.getName().equals(VERSION_STORE_INIT);
+ }
+ });
+ }
}
Modified:
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java?rev=1833892&r1=1833891&r2=1833892&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java
(original)
+++
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/InitialContentTest.java
Wed Jun 20 07:30:56 2018
@@ -16,16 +16,19 @@
*/
package org.apache.jackrabbit.oak;
-import org.apache.jackrabbit.oak.spi.version.VersionConstants;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.junit.Test;
-
+import static org.apache.jackrabbit.oak.InitialContentHelper.INITIAL_CONTENT;
import static
org.apache.jackrabbit.oak.plugins.document.bundlor.BundlingConfigHandler.DOCUMENT_NODE_STORE;
import static
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import org.apache.jackrabbit.oak.plugins.version.VersionHook;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.version.VersionConstants;
+import org.junit.Test;
+
/**
* Test for OAK-2459.
*/
@@ -35,7 +38,7 @@ public class InitialContentTest implemen
public void noVersionStoragePrePopulated() throws Exception {
// default initial content does not have intermediate nodes
// pre-populated
- NodeState system =
InitialContentHelper.INITIAL_CONTENT.getChildNode(JCR_SYSTEM);
+ NodeState system = INITIAL_CONTENT.getChildNode(JCR_SYSTEM);
assertTrue(system.exists());
NodeState vs = system.getChildNode(JCR_VERSIONSTORAGE);
@@ -63,8 +66,17 @@ public class InitialContentTest implemen
}
@Test
- public void bundlingConfig() throws Exception{
- NodeState system =
InitialContentHelper.INITIAL_CONTENT.getChildNode(JCR_SYSTEM);
+ public void bundlingConfig() throws Exception {
+ NodeState system = INITIAL_CONTENT.getChildNode(JCR_SYSTEM);
assertFalse(system.getChildNode(DOCUMENT_NODE_STORE).exists());
}
+
+ @Test
+ public void validatePrePopulated() throws Exception {
+ NodeState before = EMPTY_NODE;
+ NodeBuilder builder = before.builder();
+ new
InitialContent().withPrePopulatedVersionStore().initialize(builder);
+ NodeState after = builder.getNodeState();
+ new VersionHook().processCommit(before, after, CommitInfo.EMPTY);
+ }
}