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