You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2021/03/16 16:50:02 UTC

[jackrabbit-filevault] 01/01: JCRVLT-506 replace CNDImporter by Jackrabbit CndImporter

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch bugfix/removeCNDImporter
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault.git

commit 61bca78c219a773868be46edca4e5788df68986b
Author: Konrad Windszus <ko...@netcentric.biz>
AuthorDate: Tue Mar 16 17:49:45 2021 +0100

    JCRVLT-506 replace CNDImporter by Jackrabbit CndImporter
---
 .../jackrabbit/vault/fs/impl/io/CNDImporter.java   | 482 ---------------------
 .../vault/fs/impl/io/NodeTypeArtifactHandler.java  |  23 +-
 2 files changed, 18 insertions(+), 487 deletions(-)

diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/CNDImporter.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/CNDImporter.java
deleted file mode 100644
index 7cf98b0..0000000
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/CNDImporter.java
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jackrabbit.vault.fs.impl.io;
-
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.Value;
-
-import org.apache.jackrabbit.util.ISO9075;
-import org.apache.jackrabbit.vault.fs.impl.io.legacycnd.Lexer;
-import org.apache.jackrabbit.vault.fs.impl.io.legacycnd.ParseException;
-import org.apache.jackrabbit.vault.util.Constants;
-import org.apache.jackrabbit.vault.util.JcrConstants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * {@code CNDImporter}...
- *
- */
-public class CNDImporter {
-
-    /**
-     * default logger
-     */
-    private static final Logger log = LoggerFactory.getLogger(CNDImporter.class);
-
-    /**
-     * the underlying lexer
-     */
-    private Lexer lexer;
-
-    /**
-     * the current token
-     */
-    private String currentToken;
-
-    /**
-     * old namespace mappings that need to be reverted
-     */
-    private Map<String, String> oldMappings = new HashMap<String, String>();
-
-    public ImportInfoImpl doImport(Node parent, String name, Reader r, String systemId)
-            throws RepositoryException {
-        try {
-            lexer = new Lexer(r, systemId);
-            nextToken();
-            ImportInfoImpl info = parse(parent, name);
-            // reset name spaces
-            for (String prefix: oldMappings.keySet()) {
-                String uri = oldMappings.get(prefix);
-                try {
-                    parent.getSession().setNamespacePrefix(prefix, uri);
-                } catch (RepositoryException e) {
-                    // ignore
-                }
-            }
-            return info;
-        } catch (ParseException e) {
-            log.error("Error while parsing.", e);
-            return null;
-        }
-    }
-
-    private ImportInfoImpl parse(Node parent, String name) throws ParseException, RepositoryException {
-        while (!currentTokenEquals(Lexer.EOF)) {
-            if (!doNameSpace(parent.getSession())) {
-                break;
-            }
-        }
-        ImportInfoImpl info = new ImportInfoImpl();
-        while (!currentTokenEquals(Lexer.EOF)) {
-            String ntName = doNodeTypeName();
-            if (name == null) {
-                name = ntName;
-            }
-            if (parent.hasNode(name)) {
-                parent.getNode(name).remove();
-            }
-            Node node;
-            if (parent.hasNode(name)) {
-                parent.getNode(name).remove();
-                node = parent.addNode(name, JcrConstants.NT_NODETYPE);
-                info.onReplaced(node.getPath());
-            } else {
-                node = parent.addNode(name, JcrConstants.NT_NODETYPE);
-                info.onCreated(node.getPath());
-            }
-            node.setProperty(JcrConstants.JCR_NODETYPENAME, name);
-            
-            // init mandatory props
-            node.setProperty(JcrConstants.JCR_HASORDERABLECHILDNODES, false);
-            node.setProperty(JcrConstants.JCR_ISMIXIN, false);
-            doSuperTypes(node);
-            doOptions(node);
-            doItemDefs(node);
-            name = null;
-        }
-        return info;
-    }
-
-    private boolean doNameSpace(Session session) throws ParseException {
-        if (!currentTokenEquals('<')) {
-            return false;
-        }
-        nextToken();
-        String prefix = currentToken;
-        nextToken();
-        if (!currentTokenEquals('=')) {
-            lexer.fail("Missing = in namespace decl.");
-        }
-        nextToken();
-        String uri = currentToken;
-        nextToken();
-        if (!currentTokenEquals('>')) {
-            lexer.fail("Missing > in namespace decl.");
-        }
-        String oldPrefix = null;
-        try {
-            oldPrefix = session.getNamespacePrefix(uri);
-        } catch (RepositoryException e) {
-            // assume does not exist yet, so register
-        }
-        try {
-            if (oldPrefix == null) {
-                session.getWorkspace().getNamespaceRegistry().registerNamespace(prefix, uri);
-            } else if (!oldPrefix.equals(prefix)) {
-                // remap
-                oldMappings.put(oldPrefix, uri);
-                session.setNamespacePrefix(prefix, uri);
-            }
-        } catch (RepositoryException e) {
-            lexer.fail("unable to remap namespace", e);
-        }
-        nextToken();
-        return true;
-    }
-
-    private String doNodeTypeName() throws ParseException {
-        String name;
-        if (!currentTokenEquals(Lexer.BEGIN_NODE_TYPE_NAME)) {
-            lexer.fail("Missing '" + Lexer.BEGIN_NODE_TYPE_NAME + "' delimiter for beginning of node type name");
-        }
-        nextToken();
-        name = ISO9075.decode(currentToken);
-
-        nextToken();
-        if (!currentTokenEquals(Lexer.END_NODE_TYPE_NAME)) {
-            lexer.fail("Missing '" + Lexer.END_NODE_TYPE_NAME + "' delimiter for end of node type name, found " + currentToken);
-        }
-        nextToken();
-
-        return name;
-    }
-
-    private static void setProperty(Node node, String name, List<String> values)
-            throws RepositoryException {
-        node.setProperty(name, values.toArray(new String[values.size()]));
-    }
-
-    private static void setProperty(Node node, String name, List<String> values, int type)
-            throws RepositoryException {
-        node.setProperty(name, values.toArray(new String[values.size()]), type);
-    }
-
-    private void doSuperTypes(Node ntd) throws ParseException, RepositoryException {
-        // a set would be nicer here, in case someone defines a super type twice.
-        // but due to issue [JCR-333], the resulting node type definition is
-        // not symmetric anymore and the tests will fail.
-        List<String> supertypes = new ArrayList<String>();
-        if (!currentTokenEquals(Lexer.EXTENDS)) {
-            return;
-        }
-        do {
-            nextToken();
-            supertypes.add(ISO9075.decode(currentToken));
-            nextToken();
-        } while (currentTokenEquals(Lexer.LIST_DELIMITER));
-        setProperty(ntd, JcrConstants.JCR_SUPERTYPES, supertypes);
-    }
-
-    private void doOptions(Node ntd) throws ParseException, RepositoryException {
-        if (currentTokenEquals(Lexer.ORDERABLE)) {
-            ntd.setProperty(JcrConstants.JCR_HASORDERABLECHILDNODES, true);
-            nextToken();
-            if (currentTokenEquals(Lexer.MIXIN)) {
-                ntd.setProperty(JcrConstants.JCR_ISMIXIN, true);
-                nextToken();
-            }
-        } else if (currentTokenEquals(Lexer.MIXIN)) {
-            ntd.setProperty(JcrConstants.JCR_ISMIXIN, true);
-            nextToken();
-            if (currentTokenEquals(Lexer.ORDERABLE)) {
-                ntd.setProperty(JcrConstants.JCR_HASORDERABLECHILDNODES, true);
-                nextToken();
-            }
-        }
-    }
-
-    private void doItemDefs(Node ntd) throws ParseException, RepositoryException {
-        while (currentTokenEquals(Lexer.PROPERTY_DEFINITION) || currentTokenEquals(Lexer.CHILD_NODE_DEFINITION)) {
-            if (currentTokenEquals(Lexer.PROPERTY_DEFINITION)) {
-                Node pdi = ntd.addNode(JcrConstants.JCR_PROPERTYDEFINITION);
-                nextToken();
-                doPropertyDefinition(pdi);
-
-            } else if (currentTokenEquals(Lexer.CHILD_NODE_DEFINITION)) {
-                Node ndi = ntd.addNode(JcrConstants.JCR_CHILDNODEDEFINITION);
-
-                nextToken();
-                doChildNodeDefinition(ndi);
-            }
-        }
-    }
-
-    private void doPropertyDefinition(Node pdi) throws ParseException, RepositoryException {
-        String name = ISO9075.decode(currentToken);
-        if (!name.equals("") && !name.equals("*")) {
-            pdi.setProperty(JcrConstants.JCR_NAME, name);
-        }
-        // init mandatory props
-        pdi.setProperty(JcrConstants.JCR_AUTOCREATED, false);
-        pdi.setProperty(JcrConstants.JCR_MANDATORY, false);
-        pdi.setProperty(JcrConstants.JCR_MULTIPLE, false);
-        pdi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "COPY");
-        pdi.setProperty(JcrConstants.JCR_PROTECTED, false);
-        pdi.setProperty(JcrConstants.JCR_REQUIREDTYPE, "UNDEFINED");
-
-        nextToken();
-        int type = doPropertyType(pdi);
-        doPropertyDefaultValue(pdi, type);
-        doPropertyAttributes(pdi);
-        doPropertyValueConstraints(pdi);
-    }
-
-    private int doPropertyType(Node pdi) throws ParseException, RepositoryException {
-        if (!currentTokenEquals(Lexer.BEGIN_TYPE)) {
-            return PropertyType.UNDEFINED;
-        }
-        nextToken();
-        int type = PropertyType.UNDEFINED;
-        if (currentTokenEquals(Lexer.STRING)) {
-            type = PropertyType.STRING;
-        } else if (currentTokenEquals(Lexer.BINARY)) {
-            type = PropertyType.BINARY;
-        } else if (currentTokenEquals(Lexer.LONG)) {
-            type = PropertyType.LONG;
-        } else if (currentTokenEquals(Lexer.DOUBLE)) {
-            type = PropertyType.DOUBLE;
-        } else if (currentTokenEquals(Lexer.BOOLEAN)) {
-            type = PropertyType.BOOLEAN;
-        } else if (currentTokenEquals(Lexer.DATE)) {
-            type = PropertyType.DATE;
-        } else if (currentTokenEquals(Lexer.NAME)) {
-            type = PropertyType.NAME;
-        } else if (currentTokenEquals(Lexer.PATH)) {
-            type = PropertyType.PATH;
-        } else if (currentTokenEquals(Lexer.REFERENCE)) {
-            type = PropertyType.REFERENCE;
-        } else if (currentTokenEquals(Lexer.UNDEFINED)) {
-            type = PropertyType.UNDEFINED;
-        } else {
-            lexer.fail("Unknown property type '" + currentToken + "' specified");
-        }
-        pdi.setProperty(JcrConstants.JCR_REQUIREDTYPE, PropertyType.nameFromValue(type).toUpperCase());
-        nextToken();
-        if (!currentTokenEquals(Lexer.END_TYPE)) {
-            lexer.fail("Missing '" + Lexer.END_TYPE + "' delimiter for end of property type");
-        }
-        nextToken();
-        return type;
-    }
-
-    private void doPropertyAttributes(Node pdi) throws ParseException, RepositoryException {
-        while (currentTokenEquals(Lexer.ATTRIBUTE)) {
-            if (currentTokenEquals(Lexer.PRIMARY)) {
-                Value name = pdi.getProperty(JcrConstants.JCR_NAME).getValue();
-                if (pdi.getParent().hasProperty(JcrConstants.JCR_PRIMARYITEMNAME)) {
-                    lexer.fail("More than one primary item specified in node type '" + name.getString() + "'");
-                }
-                pdi.getParent().setProperty(JcrConstants.JCR_PRIMARYITEMNAME, name);
-            } else if (currentTokenEquals(Lexer.AUTOCREATED)) {
-                pdi.setProperty(JcrConstants.JCR_AUTOCREATED, true);
-            } else if (currentTokenEquals(Lexer.MANDATORY)) {
-                pdi.setProperty(JcrConstants.JCR_MANDATORY, true);
-            } else if (currentTokenEquals(Lexer.PROTECTED)) {
-                pdi.setProperty(JcrConstants.JCR_PROTECTED, true);
-            } else if (currentTokenEquals(Lexer.MULTIPLE)) {
-                pdi.setProperty(JcrConstants.JCR_MULTIPLE, true);
-            } else if (currentTokenEquals(Lexer.COPY)) {
-                pdi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "COPY");
-            } else if (currentTokenEquals(Lexer.VERSION)) {
-                pdi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "VERSION");
-            } else if (currentTokenEquals(Lexer.INITIALIZE)) {
-                pdi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "INITIALIZE");
-            } else if (currentTokenEquals(Lexer.COMPUTE)) {
-                pdi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "COMPUTE");
-            } else if (currentTokenEquals(Lexer.IGNORE)) {
-                pdi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "IGNORE");
-            } else if (currentTokenEquals(Lexer.ABORT)) {
-                pdi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "ABORT");
-            }
-            nextToken();
-        }
-    }
-
-    private void doPropertyDefaultValue(Node pdi, int type)
-            throws ParseException, RepositoryException {
-        if (!currentTokenEquals(Lexer.DEFAULT)) {
-            return;
-        }
-        List<String> defaultValues = new ArrayList<String>();
-        do {
-            nextToken();
-            defaultValues.add(currentToken);
-            nextToken();
-        } while (currentTokenEquals(Lexer.LIST_DELIMITER));
-        // use required type
-        setProperty(pdi, JcrConstants.JCR_DEFAULTVALUES, defaultValues, type);
-    }
-
-    private void doPropertyValueConstraints(Node pdi) throws ParseException, RepositoryException {
-        if (!currentTokenEquals(Lexer.CONSTRAINT)) {
-            return;
-        }
-        List<String> constraints = new ArrayList<String>();
-        do {
-            nextToken();
-            constraints.add(currentToken);
-            nextToken();
-        } while (currentTokenEquals(Lexer.LIST_DELIMITER));
-        setProperty(pdi, JcrConstants.JCR_VALUECONSTRAINTS, constraints);
-    }
-
-    private void doChildNodeDefinition(Node ndi) throws ParseException, RepositoryException {
-        String name = ISO9075.decode(currentToken);
-        if (!name.equals("") && !name.equals("*")) {
-            ndi.setProperty(JcrConstants.JCR_NAME, name);
-        }
-        // init mandatory props
-        ndi.setProperty(JcrConstants.JCR_AUTOCREATED, false);
-        ndi.setProperty(JcrConstants.JCR_MANDATORY, false);
-        ndi.setProperty(JcrConstants.JCR_SAMENAMESIBLINGS, false);
-        ndi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "COPY");
-        ndi.setProperty(JcrConstants.JCR_PROTECTED, false);
-        ndi.setProperty(JcrConstants.JCR_REQUIREDPRIMARYTYPES, Constants.EMPTY_STRING_ARRAY);
-
-        nextToken();
-        doChildNodeRequiredTypes(ndi);
-        doChildNodeDefaultType(ndi);
-        doChildNodeAttributes(ndi);
-    }
-
-    private void doChildNodeRequiredTypes(Node ndi) throws ParseException, RepositoryException {
-        if (!currentTokenEquals(Lexer.BEGIN_TYPE)) {
-            return;
-        }
-        List<String> types = new ArrayList<String>();
-        do {
-            nextToken();
-            types.add(ISO9075.decode(currentToken));
-            nextToken();
-        } while (currentTokenEquals(Lexer.LIST_DELIMITER));
-        setProperty(ndi, JcrConstants.JCR_REQUIREDPRIMARYTYPES, types);
-        nextToken();
-    }
-
-    private void doChildNodeDefaultType(Node ndi) throws ParseException, RepositoryException {
-        if (!currentTokenEquals(Lexer.DEFAULT)) {
-            return;
-        }
-        nextToken();
-        ndi.setProperty(JcrConstants.JCR_DEFAULTPRIMARYTYPE, ISO9075.decode(currentToken));
-        nextToken();
-    }
-
-    private void doChildNodeAttributes(Node ndi) throws ParseException, RepositoryException {
-        while (currentTokenEquals(Lexer.ATTRIBUTE)) {
-            if (currentTokenEquals(Lexer.PRIMARY)) {
-                Value name = ndi.getProperty(JcrConstants.JCR_NAME).getValue();
-                if (ndi.getParent().hasProperty(JcrConstants.JCR_PRIMARYITEMNAME)) {
-                    lexer.fail("More than one primary item specified in node type '" + name.getString() + "'");
-                }
-                ndi.getParent().setProperty(JcrConstants.JCR_PRIMARYITEMNAME, name);
-            } else if (currentTokenEquals(Lexer.AUTOCREATED)) {
-                ndi.setProperty(JcrConstants.JCR_AUTOCREATED, true);
-            } else if (currentTokenEquals(Lexer.MANDATORY)) {
-                ndi.setProperty(JcrConstants.JCR_MANDATORY, true);
-            } else if (currentTokenEquals(Lexer.PROTECTED)) {
-                ndi.setProperty(JcrConstants.JCR_PROTECTED, true);
-            } else if (currentTokenEquals(Lexer.MULTIPLE)) {
-                ndi.setProperty(JcrConstants.JCR_SAMENAMESIBLINGS, true);
-            } else if (currentTokenEquals(Lexer.COPY)) {
-                ndi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "COPY");
-            } else if (currentTokenEquals(Lexer.VERSION)) {
-                ndi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "VERSION");
-            } else if (currentTokenEquals(Lexer.INITIALIZE)) {
-                ndi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "INITIALIZE");
-            } else if (currentTokenEquals(Lexer.COMPUTE)) {
-                ndi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "COMPUTE");
-            } else if (currentTokenEquals(Lexer.IGNORE)) {
-                ndi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "IGNORE");
-            } else if (currentTokenEquals(Lexer.ABORT)) {
-                ndi.setProperty(JcrConstants.JCR_ONPARENTVERSION, "ABORT");
-            }
-            nextToken();
-        }
-    }
-
-    /**
-     * Gets the next token from the underlying lexer.
-     *
-     * @see Lexer#getNextToken()
-     * @throws ParseException if the lexer fails to get the next token.
-     */
-    private void nextToken() throws ParseException {
-        currentToken = lexer.getNextToken();
-    }
-
-    /**
-     * Checks if the {@link #currentToken} is semantically equal to the given
-     * argument.
-     *
-     * @param s the tokens to compare with
-     * @return {@code true} if equals; {@code false} otherwise.
-     */
-    private boolean currentTokenEquals(String[] s) {
-        for (String value : s) {
-            if (currentToken.equals(value)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Checks if the {@link #currentToken} is semantically equal to the given
-     * argument.
-     *
-     * @param c the tokens to compare with
-     * @return {@code true} if equals; {@code false} otherwise.
-     */
-    private boolean currentTokenEquals(char c) {
-        return currentToken.length() == 1 && currentToken.charAt(0) == c;
-    }
-
-    /**
-     * Checks if the {@link #currentToken} is semantically equal to the given
-     * argument.
-     *
-     * @param s the tokens to compare with
-     * @return {@code true} if equals; {@code false} otherwise.
-     */
-    private boolean currentTokenEquals(String s) {
-        return currentToken.equals(s);
-    }
-
-    
-}
\ No newline at end of file
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/NodeTypeArtifactHandler.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/NodeTypeArtifactHandler.java
index 3560d8b..24ac872 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/NodeTypeArtifactHandler.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/fs/impl/io/NodeTypeArtifactHandler.java
@@ -21,10 +21,17 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.nio.charset.StandardCharsets;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.nodetype.InvalidNodeTypeDefinitionException;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.NodeTypeExistsException;
 
+import org.apache.jackrabbit.commons.cnd.CndImporter;
+import org.apache.jackrabbit.commons.cnd.ParseException;
 import org.apache.jackrabbit.vault.fs.api.Artifact;
 import org.apache.jackrabbit.vault.fs.api.ImportMode;
 import org.apache.jackrabbit.vault.fs.api.SerializationType;
@@ -57,19 +64,25 @@ public class NodeTypeArtifactHandler extends AbstractArtifactHandler {
         if (primary.getSerializationType() != SerializationType.CND) {
             return null;
         }
+        ImportInfoImpl info = new ImportInfoImpl();
         String path = PathUtil.getPath(parent, primary.getRelativePath());
         if (wspFilter.getImportMode(path) == ImportMode.MERGE) {
-            ImportInfoImpl info = new ImportInfoImpl();
             info.onNop(path);
             return info;
         }
         // do import
-        CNDImporter importer = new CNDImporter();
         try (InputStream in = primary.getInputStream()) {
-            Reader r = new InputStreamReader(in, "utf-8");
-            return importer.doImport(parent, primary.getRelativePath(), r, primary.getRelativePath());
+            Reader r = new InputStreamReader(in, StandardCharsets.UTF_8);
+            try {
+                for (NodeType nodeType : CndImporter.registerNodeTypes(r, parent.getSession(), true)) {
+                    // node types don't have a real path
+                    info.onCreated(path + "/" + nodeType.getName());
+                }
+            } catch (ParseException e) {
+                throw new RepositoryException("Invalid CND file " + name, e);
+            }
         }
+        return info;
     }
 
-
 }
\ No newline at end of file