blob: b60b82f0546992022c50880f01cc57dbba6d5b89 [file] [log] [blame]
/*
* 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;
}
}