001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.layoutconfiguration.util.velocity;
016    
017    import com.liferay.portal.kernel.model.CustomizedPages;
018    import com.liferay.portal.kernel.model.Layout;
019    import com.liferay.portal.kernel.model.LayoutConstants;
020    import com.liferay.portal.kernel.portlet.PortletProvider;
021    import com.liferay.portal.kernel.portlet.PortletProviderUtil;
022    import com.liferay.portal.kernel.service.LayoutLocalServiceUtil;
023    import com.liferay.portal.kernel.servlet.JSPSupportServlet;
024    import com.liferay.portal.kernel.util.GetterUtil;
025    import com.liferay.portal.kernel.util.ParamUtil;
026    import com.liferay.portal.kernel.util.StringPool;
027    import com.liferay.portal.kernel.util.UnicodeProperties;
028    import com.liferay.sites.kernel.util.SitesUtil;
029    import com.liferay.taglib.aui.InputTag;
030    
031    import java.io.Writer;
032    
033    import java.util.Map;
034    
035    import javax.servlet.http.HttpServletRequest;
036    import javax.servlet.http.HttpServletResponse;
037    import javax.servlet.jsp.JspFactory;
038    import javax.servlet.jsp.PageContext;
039    import javax.servlet.jsp.tagext.Tag;
040    
041    /**
042     * @author Raymond Augé
043     * @author Oliver Teichmann
044     */
045    public class CustomizationSettingsProcessor implements ColumnProcessor {
046    
047            public CustomizationSettingsProcessor(
048                    HttpServletRequest request, HttpServletResponse response) {
049    
050                    JspFactory jspFactory = JspFactory.getDefaultFactory();
051    
052                    _pageContext = jspFactory.getPageContext(
053                            new JSPSupportServlet(request.getServletContext()), request,
054                            response, null, false, 0, false);
055    
056                    _writer = _pageContext.getOut();
057    
058                    Layout selLayout = null;
059    
060                    long selPlid = ParamUtil.getLong(
061                            request, "selPlid", LayoutConstants.DEFAULT_PLID);
062    
063                    if (selPlid != LayoutConstants.DEFAULT_PLID) {
064                            selLayout = LayoutLocalServiceUtil.fetchLayout(selPlid);
065                    }
066    
067                    _layoutTypeSettings = selLayout.getTypeSettingsProperties();
068    
069                    if (!SitesUtil.isLayoutUpdateable(selLayout) ||
070                            selLayout.isLayoutPrototypeLinkActive()) {
071    
072                            _customizationEnabled = false;
073                    }
074                    else {
075                            _customizationEnabled = true;
076                    }
077            }
078    
079            @Override
080            public String processColumn(String columnId) throws Exception {
081                    return processColumn(columnId, StringPool.BLANK);
082            }
083    
084            @Override
085            public String processColumn(String columnId, String classNames)
086                    throws Exception {
087    
088                    String customizableKey = CustomizedPages.namespaceColumnId(columnId);
089    
090                    boolean customizable = false;
091    
092                    if (_customizationEnabled) {
093                            customizable = GetterUtil.getBoolean(
094                                    _layoutTypeSettings.getProperty(
095                                            customizableKey, String.valueOf(false)));
096                    }
097    
098                    _writer.append("<div class=\"");
099                    _writer.append(classNames);
100                    _writer.append("\">");
101    
102                    _writer.append("<h1>");
103                    _writer.append(columnId);
104                    _writer.append("</h1>");
105    
106                    InputTag inputTag = new InputTag();
107    
108                    inputTag.setDisabled(!_customizationEnabled);
109                    inputTag.setDynamicAttribute(
110                            StringPool.BLANK, "labelOff", "no-customizable");
111                    inputTag.setDynamicAttribute(
112                            StringPool.BLANK, "labelOn", "customizable");
113                    inputTag.setLabel(StringPool.BLANK);
114                    inputTag.setName(
115                            "TypeSettingsProperties--".concat(customizableKey).concat("--"));
116                    inputTag.setPageContext(_pageContext);
117                    inputTag.setType("toggle-switch");
118                    inputTag.setValue(customizable);
119    
120                    int result = inputTag.doStartTag();
121    
122                    if (result == Tag.EVAL_BODY_INCLUDE) {
123                            inputTag.doEndTag();
124                    }
125    
126                    _writer.append("</div>");
127    
128                    return StringPool.BLANK;
129            }
130    
131            @Override
132            public String processMax() throws Exception {
133                    return StringPool.BLANK;
134            }
135    
136            /**
137             * @deprecated As of 6.2.0, replaced by {@link #processMax()}
138             */
139            @Deprecated
140            @Override
141            public String processMax(String classNames) throws Exception {
142                    return processMax();
143            }
144    
145            @Override
146            public String processPortlet(String portletId) throws Exception {
147                    _writer.append("<div class=\"portlet\">");
148                    _writer.append(portletId);
149                    _writer.append("</div>");
150    
151                    return StringPool.BLANK;
152            }
153    
154            @Override
155            public String processPortlet(
156                            String portletId, Map<String, ?> defaultSettingsMap)
157                    throws Exception {
158    
159                    return processPortlet(portletId);
160            }
161    
162            @Override
163            public String processPortlet(
164                            String portletProviderClassName,
165                            PortletProvider.Action portletProviderAction)
166                    throws Exception {
167    
168                    String portletId = PortletProviderUtil.getPortletId(
169                            portletProviderClassName, portletProviderAction);
170    
171                    return processPortlet(portletId);
172            }
173    
174            private final boolean _customizationEnabled;
175            private final UnicodeProperties _layoutTypeSettings;
176            private final PageContext _pageContext;
177            private final Writer _writer;
178    
179    }