1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.module.delta;
35
36 import info.magnolia.jcr.util.NodeTypes;
37 import info.magnolia.module.InstallContext;
38 import info.magnolia.repository.RepositoryConstants;
39 import info.magnolia.repository.RepositoryManager;
40
41 import java.util.ArrayList;
42 import java.util.Arrays;
43 import java.util.List;
44
45 import javax.jcr.RepositoryException;
46 import javax.jcr.Session;
47 import javax.jcr.nodetype.NodeDefinition;
48 import javax.jcr.nodetype.NodeType;
49 import javax.jcr.nodetype.NodeTypeManager;
50
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54
55
56
57
58 public class NoSameNameSiblingsCondition extends AbstractCondition {
59
60 private static final Logger log = LoggerFactory.getLogger(NoSameNameSiblingsCondition.class);
61
62 public static final String[] NODETYPES = new String[]{
63 NodeTypes.Content.NAME,
64 NodeTypes.ContentNode.NAME,
65 NodeTypes.Folder.NAME,
66 NodeTypes.Page.NAME,
67 NodeTypes.Area.NAME,
68 NodeTypes.Component.NAME,
69 NodeTypes.User.NAME,
70 NodeTypes.Role.NAME,
71 NodeTypes.Group.NAME,
72 "mgnl:reserve"
73 };
74
75 public static final List<String> WORKSPACES = Arrays.asList(
76 RepositoryConstants.CONFIG,
77 RepositoryConstants.WEBSITE,
78 RepositoryConstants.USERS,
79 RepositoryConstants.USER_GROUPS,
80 RepositoryConstants.USER_ROLES
81 );
82
83 private final RepositoryManager repositoryManager;
84
85 public NoSameNameSiblingsCondition(RepositoryManager repositoryManager) {
86 super("Same name siblings must be not allowed.", "Ensures that same name siblings are not allowed in Magnolia node types.");
87 this.repositoryManager = repositoryManager;
88 }
89
90 @Override
91 public boolean check(InstallContext installContext) {
92 try {
93 List<String> workspaces = new ArrayList<>();
94 for (String workspaceName : repositoryManager.getWorkspaceNames()) {
95 if (workspaceName.contains(RepositoryConstants.VERSION_STORE)) {
96 workspaces.add(workspaceName);
97 }
98 }
99 workspaces.addAll(WORKSPACES);
100 for (String workspaceName : workspaces) {
101 Session session = installContext.getJCRSession(workspaceName);
102 NodeTypeManager ntManager = session.getWorkspace().getNodeTypeManager();
103 for (String nodetypeName : NODETYPES) {
104 NodeType nodetype = ntManager.getNodeType(nodetypeName);
105 for (NodeDefinition def : nodetype.getChildNodeDefinitions()) {
106 if (def.allowsSameNameSiblings()) {
107 log.error("Child definition of the [{}] node type in workspace [{}] allows same name siblings.", nodetypeName, workspaceName);
108 return false;
109 }
110 }
111 }
112 }
113 } catch (RepositoryException ex) {
114 log.error("Cannot verify that same name siblings are not allowed.", ex);
115 return false;
116 }
117
118 return true;
119 }
120
121 }