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.templating.elements;
35
36 import info.magnolia.cms.beans.config.ServerConfiguration;
37 import info.magnolia.cms.core.Content;
38 import info.magnolia.cms.gui.i18n.I18nAuthoringSupport;
39 import info.magnolia.cms.gui.misc.Sources;
40 import info.magnolia.cms.i18n.I18nContentSupport;
41 import info.magnolia.cms.i18n.I18nContentSupportFactory;
42 import info.magnolia.cms.security.Permission;
43 import info.magnolia.cms.security.PermissionUtil;
44 import info.magnolia.context.MgnlContext;
45 import info.magnolia.link.LinkUtil;
46 import info.magnolia.rendering.context.RenderingContext;
47 import info.magnolia.rendering.engine.RenderException;
48 import info.magnolia.rendering.template.TemplateDefinition;
49 import info.magnolia.templating.freemarker.AreaDirective;
50
51 import java.io.IOException;
52 import java.util.ArrayList;
53 import java.util.List;
54 import java.util.Locale;
55
56 import javax.jcr.Node;
57 import javax.jcr.RepositoryException;
58
59 import org.apache.commons.lang.StringUtils;
60 import org.slf4j.Logger;
61 import org.slf4j.LoggerFactory;
62
63
64
65
66
67
68 public class InitElement extends AbstractContentTemplatingElement {
69
70 public static final String PAGE_EDITOR_JS_SOURCE = MgnlContext.getContextPath() + "/.resources/editor/info.magnolia.templating.editor.PageEditor/info.magnolia.templating.editor.PageEditor.nocache.js";
71 public static final String PAGE_EDITOR_CSS = MgnlContext.getContextPath() + "/.resources/magnolia-templating-editor/css/editor.css";
72 private static final String CMS_PAGE_TAG = "cms:page";
73 private static final Logger log = LoggerFactory.getLogger(InitElement.class);
74
75 private final I18nContentSupport i18nContentSupport = I18nContentSupportFactory.getI18nSupport();
76 private final I18nAuthoringSupport i18nAuthoringSupport = I18nAuthoringSupport.Factory.getInstance();
77 private String dialog;
78
79 public InitElement(ServerConfiguration server, RenderingContext renderingContext) {
80 super(server, renderingContext);
81 }
82
83 @Override
84 public void begin(Appendable out) throws IOException, RenderException {
85 if (!renderComments()) {
86 return;
87 }
88
89 Node content = getPassedContent();
90 if (content == null) {
91 content = currentContent();
92 }
93
94 TemplateDefinition templateDefinition = getRequiredTemplateDefinition();
95
96 dialog = resolveDialog(templateDefinition);
97
98 Sources src = new Sources(MgnlContext.getContextPath());
99 MarkupHelper helper = new MarkupHelper(out);
100 helper.append("<!-- begin js and css added by @cms.init -->\n");
101 helper.append("<meta name=\"gwt:property\" content=\"locale=" + i18nContentSupport.getLocale() + "\"/>\n");
102 helper.append(src.getHtmlCss());
103 helper.append(src.getHtmlJs(true));
104 helper.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + PAGE_EDITOR_CSS + "\"></link>\n");
105 helper.append("<script type=\"text/javascript\" src=\"" + PAGE_EDITOR_JS_SOURCE + "\"></script>\n");
106
107 try {
108 if (content != null) {
109 if (!PermissionUtil.isGranted(content, Permission.WRITE)) {
110 return;
111 }
112 }
113 } catch (RepositoryException e) {
114 log.error("Can't read users permissions for node [" + content + "]. PageBar will not be rendered.");
115 return;
116 }
117 helper.openComment(CMS_PAGE_TAG);
118 if (content != null) {
119 helper.attribute(AreaDirective.CONTENT_ATTRIBUTE, getNodePath(content));
120 }
121 helper.attribute("dialog", dialog);
122 helper.attribute("preview", String.valueOf(MgnlContext.getAggregationState().isPreviewMode()));
123
124
125 if (i18nAuthoringSupport.isEnabled() && i18nContentSupport.isEnabled() && i18nContentSupport.getLocales().size() > 1) {
126
127 Content currentPage = MgnlContext.getAggregationState().getMainContent();
128 String currentUri = createURI(currentPage, i18nContentSupport.getLocale());
129 helper.attribute("currentURI", currentUri);
130
131 List<String> availableLocales = new ArrayList<String>();
132
133 for (Locale locale : i18nContentSupport.getLocales()) {
134 String uri = createURI(currentPage, locale);
135 String label = StringUtils.capitalize(locale.getDisplayLanguage(locale));
136 if (StringUtils.isNotEmpty(locale.getCountry())) {
137 label += " (" + StringUtils.capitalize(locale.getDisplayCountry()) + ")";
138 }
139 availableLocales.add(label + ":" + uri);
140 }
141
142 helper.attribute("availableLocales", StringUtils.join(availableLocales, ","));
143 }
144
145 helper.append(" -->\n");
146 helper.closeComment(CMS_PAGE_TAG);
147 }
148
149 @Override
150 public void end(Appendable out) throws IOException, RenderException {
151 if (!renderComments()) {
152 return;
153 }
154 MarkupHelper helper = new MarkupHelper(out);
155 helper.append("\n<!-- end js and css added by @cms.init -->\n");
156 }
157
158 public void setDialog(String dialog) {
159 this.dialog = dialog;
160 }
161
162 private TemplateDefinition getRequiredTemplateDefinition() {
163 return (TemplateDefinition) getRenderingContext().getRenderableDefinition();
164 }
165
166 private String resolveDialog(TemplateDefinition component) {
167 if (StringUtils.isNotEmpty(this.dialog)) {
168 return this.dialog;
169 }
170 String dialog = component.getDialog();
171 if (StringUtils.isNotEmpty(dialog)) {
172 return dialog;
173 }
174 return null;
175 }
176
177 private String createURI(Content currentPage, Locale locale) {
178
179 Locale currentLocale = i18nContentSupport.getLocale();
180 String uri = null;
181 try {
182
183 i18nContentSupport.setLocale(locale);
184 uri = LinkUtil.createAbsoluteLink(currentPage);
185 }
186
187 finally {
188 i18nContentSupport.setLocale(currentLocale);
189 }
190 return uri;
191 }
192
193 }