/* * 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.sling.ide.serialization; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.jcr.nodetype.NodeType; import org.apache.sling.ide.transport.NodeTypeRegistry; import org.apache.sling.ide.transport.Repository; import org.apache.sling.ide.transport.RepositoryException; /** * The <tt>SerializationKindManager</tt> is a helper class which implements common logic dealing with how to serialize * repository contents on disk * */ public class SerializationKindManager { private final Set<String> fullMetadataNodeTypes = new HashSet<>(); private final Set<String> fileNodeTypes = new HashSet<>(); private final Set<String> folderNodeTypes = new HashSet<>(); public void init(Repository repository) throws RepositoryException { // first pass, init the mappings final NodeTypeRegistry nodeTypeRegistry = repository.getNodeTypeRegistry(); if (nodeTypeRegistry==null) { throw new IllegalStateException("nodeTypeRegistry must not be null here"); } final List<NodeType> nodeTypes = nodeTypeRegistry.getNodeTypes(); // detect node types which have an nt:file or nt:folder parent in the hierarchy for (Iterator<NodeType> it = nodeTypes.iterator(); it.hasNext();) { final NodeType nt = it.next(); final String nodeType = nt.getName(); SerializationKind serializationKind = getSerializationKind(nodeType, nodeTypeRegistry); if (serializationKind == null) { // don't care continue; } switch (serializationKind) { case FILE: fileNodeTypes.add(nodeType); break; case FOLDER: folderNodeTypes.add(nodeType); break; case METADATA_FULL: fullMetadataNodeTypes.add(nodeType); default: // don't care break; } } } private SerializationKind getSerializationKind(String nodeType, NodeTypeRegistry nodeTypeRegistry) { if (Repository.NT_FILE.equals(nodeType)) { return SerializationKind.FILE; } if (Repository.NT_RESOURCE.equals(nodeType)) { return SerializationKind.FILE; } if (Repository.NT_FOLDER.equals(nodeType)) { return SerializationKind.FOLDER; } if ("rep:accessControl".equals(nodeType) || "rep:Policy".equals(nodeType) || "cq:Widget".equals(nodeType) || "cq:EditConfig".equals(nodeType) || "cq:WorkflowModel".equals(nodeType) || "vlt:FullCoverage".equals(nodeType) || "mix:language".equals(nodeType) || "sling:OsgiConfig".equals(nodeType)) { return SerializationKind.METADATA_FULL; } String[] parents = nodeTypeRegistry.getNodeType(nodeType).getDeclaredSupertypeNames(); if (parents == null) return null; for (String parent : parents) { SerializationKind parentSerializationKind = getSerializationKind(parent, nodeTypeRegistry); if (parentSerializationKind != null) { return parentSerializationKind; } } return null; } public SerializationKind getSerializationKind(String nodeTypeName, List<String> mixinNodeTypeNames) { SerializationKind kind = null; // 1. check mixins for (String mixinNodeType : mixinNodeTypeNames) { kind = getSerializationKind0(mixinNodeType); if (kind != null) { return kind; } } // 2. check node type kind = getSerializationKind0(nodeTypeName); if (kind != null) { return kind; } // 3. default to partial return SerializationKind.METADATA_PARTIAL; } private SerializationKind getSerializationKind0(String nodeTypeName) { if (fullMetadataNodeTypes.contains(nodeTypeName)) { return SerializationKind.METADATA_FULL; } if (fileNodeTypes.contains(nodeTypeName)) { return SerializationKind.FILE; } if (folderNodeTypes.contains(nodeTypeName)) { return SerializationKind.FOLDER; } return null; } }