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.trees;
35
36 import info.magnolia.cms.core.Content;
37 import info.magnolia.cms.core.ItemType;
38 import info.magnolia.cms.core.MetaData;
39 import info.magnolia.cms.core.MgnlNodeType;
40 import info.magnolia.cms.core.Path;
41 import info.magnolia.cms.exchange.ExchangeException;
42 import info.magnolia.cms.gui.control.Select;
43 import info.magnolia.cms.gui.control.TreeColumn;
44 import info.magnolia.cms.i18n.Messages;
45 import info.magnolia.cms.i18n.MessagesManager;
46 import info.magnolia.cms.i18n.MessagesUtil;
47 import info.magnolia.context.Context;
48 import info.magnolia.context.MgnlContext;
49 import info.magnolia.jcr.predicate.NodeTypePredicate;
50 import info.magnolia.jcr.util.MetaDataUtil;
51 import info.magnolia.jcr.util.NodeUtil;
52 import info.magnolia.module.admininterface.AdminTreeMVCHandler;
53 import info.magnolia.objectfactory.Components;
54 import info.magnolia.registry.RegistrationException;
55 import info.magnolia.rendering.template.TemplateDefinition;
56 import info.magnolia.rendering.template.assignment.TemplateDefinitionAssignment;
57 import info.magnolia.rendering.template.registry.TemplateDefinitionRegistry;
58
59 import java.util.Collection;
60 import java.util.Collections;
61
62 import javax.jcr.Node;
63 import javax.jcr.RepositoryException;
64 import javax.jcr.Session;
65 import javax.servlet.http.HttpServletRequest;
66 import javax.servlet.http.HttpServletResponse;
67
68 import org.slf4j.Logger;
69 import org.slf4j.LoggerFactory;
70
71
72
73
74
75 public class WebsiteTreeHandler extends AdminTreeMVCHandler {
76 private static final Logger log = LoggerFactory.getLogger(WebsiteTreeHandler.class);
77
78 private static final String COMMAND_SHOW_TEMPLATES = "getTemplatesHtml";
79 private static final String COMMAND_CHECK_CHILDREN_MODIFIED = "checkIfChildrenModified";
80
81 private TemplateDefinitionRegistry templateRegistry;
82 private TemplateDefinitionAssignment templateAssignment;
83 private boolean getAvailableTemplates;
84 private boolean checkIfChildrenModified;
85
86 public WebsiteTreeHandler(String name, HttpServletRequest request, HttpServletResponse response) {
87 super(name, request, response);
88
89 templateAssignment = Components.getComponent(TemplateDefinitionAssignment.class);
90 templateRegistry = Components.getComponent(TemplateDefinitionRegistry.class);
91 }
92
93 @Override
94 public String createNode() {
95 String view = super.createNode();
96 try {
97
98 if (this.getCreateItemType().equals(ItemType.PAGE.getSystemName())) {
99
100 Content parentNode = this.getHierarchyManager().getContent(this.getPath());
101 Content newNode = parentNode.getContent(this.getNewNodeName());
102 TemplateDefinition newTemplate = getDefaultTemplate(newNode.getJCRNode());
103 if (newTemplate != null) {
104 newNode.getMetaData().setTemplate(newTemplate.getId());
105 newNode.save();
106 }
107 }
108 } catch (RepositoryException e) {
109 log.error("can't set template", e);
110 }
111 return view;
112 }
113
114 protected TemplateDefinition getDefaultTemplate(Node node) {
115 return templateAssignment.getDefaultTemplate(node);
116 }
117
118 @Override
119 public String show() {
120
121 Collection<TemplateDefinition> templateDefinitions = templateRegistry.getTemplateDefinitions();
122
123 boolean isDeletedNodeTemplate = templateDefinitions.size() == 1 && "adminInterface:mgnlDeleted".equals(templateDefinitions.iterator().next().getId());
124 if (templateDefinitions.isEmpty() || isDeletedNodeTemplate) {
125 try {
126 request.getRequestDispatcher("/.magnolia/pages/quickstart.html").forward(request, response);
127 return "";
128 } catch (Exception e) {
129 log.error("Couldn't forward to quickstart page: " + e.getMessage());
130 }
131 }
132 return super.show();
133 }
134
135 @Override
136 public String getCommand() {
137 if (isGetAvailableTemplates()) {
138 return COMMAND_SHOW_TEMPLATES;
139 } else if (isCheckIfChildrenModified()) {
140 return COMMAND_CHECK_CHILDREN_MODIFIED;
141 }
142 return super.getCommand();
143 }
144
145 public String getTemplatesHtml() {
146 String javascriptTree = getTree().getJavascriptTree();
147 Select templateSelect = new Select();
148 templateSelect.setName(javascriptTree + TreeColumn.EDIT_NAMEADDITION);
149 templateSelect.setSaveInfo(false);
150 templateSelect.setCssClass(TreeColumn.EDIT_CSSCLASS_SELECT);
151
152 templateSelect.setEvent("onblur", javascriptTree + ".saveNodeData(this.value,this.options[this.selectedIndex].text)");
153 templateSelect.setEvent("onchange", javascriptTree + ".saveNodeData(this.value,this.options[this.selectedIndex].text)");
154
155 Collection<TemplateDefinition> templateDefinitons = Collections.emptyList();
156 try {
157 templateDefinitons = templateAssignment.getAvailableTemplates(MgnlContext.getJCRSession(this.getRepository()).getNode(this.getPath()));
158 } catch (RepositoryException e) {
159 log.error(e.getMessage(), e);
160 }
161
162 templateSelect.getOptions().clear();
163
164 for (TemplateDefinition templateDefinition : templateDefinitons) {
165 String title = MessagesUtil.javaScriptString(getI18nTitle(templateDefinition));
166 templateSelect.setOptions(title, templateDefinition.getId());
167 }
168 this.displayValue = templateSelect.getHtml();
169 return VIEW_VALUE;
170 }
171
172 public String checkIfChildrenModified() {
173 String path = this.getRequest().getParameter(Context.ATTRIBUTE_PATH);
174
175 try {
176 Session session = MgnlContext.getJCRSession(getRepository());
177 Node node = session.getNode(path);
178
179 for (Node child : NodeUtil.collectAllChildren(node, new NodeTypePredicate(node.getPrimaryNodeType().getName()))) {
180 if (MetaData.ACTIVATION_STATUS_MODIFIED == MetaDataUtil.getMetaData(child).getActivationStatus()) {
181 this.displayValue = child.getPath();
182 return VIEW_VALUE;
183 }
184 }
185 } catch (RepositoryException e) {
186 log.error("Cannot check if children of '{}:{}' were modified", new Object[] { getRepository(), path }, e);
187 }
188 this.displayValue = "";
189 return VIEW_VALUE;
190 }
191
192 private String getI18nTitle(TemplateDefinition template) {
193 Messages messages = MessagesManager.getMessages(template.getI18nBasename());
194 String title = template.getTitle();
195 return messages.getWithDefault(title, title);
196 }
197
198 @Override
199 protected void copyOrMove(int action) throws ExchangeException, RepositoryException {
200 String pathClipboard = this.getRequest().getParameter("pathClipboard");
201 if (isCopyOrMoveAvailable(pathSelected, pathClipboard)) {
202 super.copyOrMove(action);
203 } else {
204 throw new RuntimeException("Template of the page is not available on this level");
205 }
206 }
207
208 protected boolean isCopyOrMoveAvailable(String targetPath, String pagePath) throws RepositoryException {
209 boolean result = false;
210 try {
211 Session session = MgnlContext.getJCRSession(getRepository());
212 String tempNodeName = Path.getUniqueLabel(session, targetPath, "temporaryNode");
213 Node targetPage = session.getNode(targetPath).addNode(tempNodeName, MgnlNodeType.NT_PAGE);
214 Node movedPage = session.getNode(pagePath);
215
216 TemplateDefinitionRegistry registry = Components.getComponent(TemplateDefinitionRegistry.class);
217 TemplateDefinition definition = registry.getTemplateDefinition(movedPage.getNode("MetaData").getProperty("mgnl:template").getString());
218
219 result = templateAssignment.getAvailableTemplates(targetPage).contains(definition);
220
221 session.refresh(false);
222 } catch (RegistrationException e) {
223 throw new RuntimeException("Template availability could not be resolved");
224 }
225 return result;
226 }
227
228 public boolean isGetAvailableTemplates() {
229 return getAvailableTemplates;
230 }
231
232 public void setGetAvailableTemplates(boolean getAvailableTemplates) {
233 this.getAvailableTemplates = getAvailableTemplates;
234 }
235
236 public boolean isCheckIfChildrenModified() {
237 return checkIfChildrenModified;
238 }
239
240 public void setCheckIfChildrenModified(boolean checkIfChildrenModified) {
241 this.checkIfChildrenModified = checkIfChildrenModified;
242 }
243 }