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.admininterface.setup.for4_3;
35
36 import info.magnolia.cms.beans.config.ContentRepository;
37 import info.magnolia.cms.core.Content;
38 import info.magnolia.cms.core.ItemType;
39 import info.magnolia.cms.util.ContentUtil;
40 import info.magnolia.cms.util.QueryUtil;
41 import info.magnolia.module.InstallContext;
42 import info.magnolia.module.delta.AbstractRepositoryTask;
43 import info.magnolia.module.delta.TaskExecutionException;
44
45 import java.util.ArrayList;
46 import java.util.Collection;
47 import java.util.Iterator;
48 import java.util.List;
49
50 import javax.jcr.RepositoryException;
51 import javax.jcr.query.Query;
52
53 import org.slf4j.Logger;
54 import org.slf4j.LoggerFactory;
55
56
57
58
59
60
61
62
63
64
65 public class ReplaceWrongDialogNodeTypeTask extends AbstractRepositoryTask {
66
67 private final static Logger log = LoggerFactory.getLogger(ReplaceWrongDialogNodeTypeTask.class);
68
69 public ReplaceWrongDialogNodeTypeTask() {
70 super("Replace incorrect dialog node types", "Checks for each module in the config repository if dialogs are of the incorrect type mgnl:content and replaces them with the correct one mgnl:contentNode");
71 }
72
73 protected void doExecute(InstallContext installContext) throws RepositoryException, TaskExecutionException {
74 final Collection<Content> dialogs = QueryUtil.query(ContentRepository.CONFIG, "modules/*/dialogs", Query.XPATH);
75 List<Content> dialogNodes = new ArrayList<Content>();
76
77 for (Iterator<Content> iterator = dialogs.iterator(); iterator.hasNext();) {
78 collectDialogNodes(iterator.next(), dialogNodes);
79 }
80 log.debug("Found {} dialog(s)", dialogNodes.size());
81
82 for (Content srcNode : dialogNodes) {
83 final String handle = srcNode.getHandle();
84 try {
85 log.debug("Checking if {} needs to be replaced due to incorrect dialog type...", handle);
86 if(!srcNode.isNodeType(ItemType.CONTENTNODE.getSystemName())){
87 ContentUtil.changeNodeType(srcNode, ItemType.CONTENTNODE, false);
88 }
89 }
90 catch (RepositoryException e) {
91 installContext.error("Can't replace " + handle, e);
92 }
93 }
94 }
95
96
97 private void collectDialogNodes(Content current, List<Content> dialogNodes) throws RepositoryException {
98 if(isDialogNode(current)){
99 dialogNodes.add(current);
100 return;
101 }
102 for (Content child : ContentUtil.getAllChildren(current)) {
103 collectDialogNodes(child, dialogNodes);
104 }
105 }
106
107 private boolean isDialogNode(Content node) throws RepositoryException{
108 if(isDialogControlNode(node)){
109 return false;
110 }
111
112
113 if(ContentUtil.getAllChildren(node).isEmpty()){
114 return true;
115 }
116
117
118 if(!node.getNodeDataCollection().isEmpty()){
119 return true;
120 }
121
122
123 for (Content child : node.getChildren(ItemType.CONTENTNODE)) {
124 if (isDialogControlNode(child)) {
125 return true;
126 }
127 }
128 return false;
129 }
130
131 private boolean isDialogControlNode(Content node) throws RepositoryException{
132 return node.hasNodeData("controlType") || node.hasNodeData("reference");
133 }
134
135 }