[
https://issues.apache.org/jira/browse/OAK-9134?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17159941#comment-17159941
]
Marcel Reutegger commented on OAK-9134:
---------------------------------------
bq. edits internally the inputStream of the builtin_nodetypes.cnd file, which I
don't think is an elegant solution
I don't have a better solution. It may not be perfect, but gets the job done.
Just a few suggestions.
There is an easier way than this:
{noformat}
boolean referenceableFrozenNode =
Boolean.parseBoolean(System.getProperty("oak.referenceableFrozenNode"));
{noformat}
Instead use:
{noformat}
boolean referenceableFrozenNode =
Boolean.getBoolean("oak.referenceableFrozenNode");
{noformat}
Use StringBuilder Instead of StringBuffer. The latter is thread-safe, which is
not necessary in this case.
The InputStreamReader in the if clause should also use predefined encoding
UTF-8.
When the InputStream is 'rewritten', a {{BufferedInputStream}} is created. I
don't think this is necessary.
As an alternative, the following may also work:
{noformat}
@@ -89,9 +93,24 @@
private void registerNodeTypes(InputStream stream, String systemId) {
try {
- CndImporter.registerNodeTypes(
- new InputStreamReader(stream, Charsets.UTF_8),
- systemId, ntMgr, nsReg, vf, false);
+ Reader reader = new InputStreamReader(stream, Charsets.UTF_8);
+ // OAK-9134: nt:frozenNode is not implementing mix:referenceable
from JCR 2.0.
+ // This system property allows to add it back when initializing a
repository.
+ boolean referenceableFrozenNode =
Boolean.getBoolean("oak.referenceableFrozenNode");
+ if (referenceableFrozenNode) {
+ BufferedReader bufferedReader = new BufferedReader(reader);
+ StringBuilder result = new StringBuilder();
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ if (line.trim().equals("[nt:frozenNode]")) {
+ line = "[nt:frozenNode] > mix:referenceable";
+ }
+ result.append(line).append(System.lineSeparator());
+ }
+ reader = new StringReader(result.toString());
+ }
+
+ CndImporter.registerNodeTypes(reader, systemId, ntMgr, nsReg, vf,
false);
} catch (IOException e) {
throw new IllegalStateException("Unable to read " + systemId, e);
} catch (ParseException e) {
{noformat}
WDYT?
The class {{ReferenceableFrozenNodeTest}} has a comment that does not match. It
was probably copied from an existing test.
I would not catch the {{CommitFailedException}} in {{initializeRepository()}}
or is there a particular reason?
Clearing the system property could be moved to a {{@After}} method. That would
also ensure it is cleared when the test fails.
Can you add a test that creates a repository with referenceable nt:frozenNodes
and then initialize it again without the system property set? The test would
verify the node type definition does not change on an existing repository.
> Remove mix:referenceable from nt:frozenNode definition
> ------------------------------------------------------
>
> Key: OAK-9134
> URL: https://issues.apache.org/jira/browse/OAK-9134
> Project: Jackrabbit Oak
> Issue Type: Improvement
> Components: core, jcr
> Reporter: José Andrés Cordero Benítez
> Priority: Minor
> Labels: patch
> Attachments: OAK-9134-remove-referenceable-from-test.patch,
> OAK-9134-remove-referenceable-frozenNode-2.patch,
> OAK-9134-remove-referenceable-frozenNode.patch
>
>
> One of the changes between JCR 1.0 and JCR 2.0 is the definition of
> nt:frozenNode. In JCR 1.0 the node type extends from mix:referenceable, while
> in JCR 2.0 it does [not
> anymore|https://docs.adobe.com/docs/en/spec/jcr/2.0/3_Repository_Model.html#3.13.4.1%20nt:frozenNode].
> Oak currently uses a nt:frozenNode definition that extends from
> mix:referenceable. This adds quite a bit of overhead because each node
> written under a JCR version gets a jcr:uuid, which is indexed by default.
> The proposal is to remove the supertype "mix:referenceable" from
> nt:frozenNode.
> Removing this supertype, the frozenNodes wouldn't have a "jcr:uuid" field,
> which at the end is not used, and allows to reduce the size of the index.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)