001/*
002 *  Copyright 2020 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.web.clientsideelement;
017
018import java.util.HashMap;
019import java.util.List;
020import java.util.Map;
021import java.util.Optional;
022
023import org.apache.avalon.framework.configuration.Configuration;
024import org.apache.avalon.framework.configuration.ConfigurationException;
025import org.apache.avalon.framework.service.ServiceException;
026import org.apache.avalon.framework.service.ServiceManager;
027import org.apache.commons.lang3.StringUtils;
028
029import org.ametys.core.ui.Callable;
030import org.ametys.web.parameters.view.ViewParametersManager;
031import org.ametys.web.parameters.view.ViewParametersModel;
032import org.ametys.web.repository.page.ModifiableSitemapElement;
033import org.ametys.web.repository.page.ModifiableZoneItem;
034import org.ametys.web.repository.page.ZoneItem.ZoneType;
035import org.ametys.web.repository.site.Site;
036import org.ametys.web.rights.PageRightAssignmentContext;
037import org.ametys.web.skin.Skin;
038import org.ametys.web.skin.SkinTemplate;
039import org.ametys.web.skin.SkinTemplateZone;
040import org.ametys.web.skin.SkinsManager;
041
042/**
043 * This client side handles a controller enabled if the active page has at least one view parameter.
044 */
045public class ConfigureViewParametersClientSideElement extends AbstractSitemapElementClientSideElement
046{
047    /** The skins manager */
048    protected SkinsManager _skinsManager;
049
050    /** The view parameters manager */
051    protected ViewParametersManager _viewParametersManager;
052    
053    @Override
054    public void service(ServiceManager smanager) throws ServiceException
055    {
056        super.service(smanager);
057        _skinsManager = (SkinsManager) smanager.lookup(SkinsManager.ROLE);
058        _viewParametersManager = (ViewParametersManager) smanager.lookup(ViewParametersManager.ROLE);
059    }
060    
061    @Override
062    public void configure(Configuration configuration) throws ConfigurationException
063    {
064        super.configure(configuration);
065    }
066    
067    @Override
068    public List<Script> getScripts(boolean ignoreRights, Map<String, Object> contextParameters)
069    {
070        // TODO Auto-generated method stub
071        return super.getScripts(ignoreRights, contextParameters);
072    }
073
074    /**
075     * Get the status of the page for the view parameters
076     * @param pageId the page id
077     * @param zoneName the zone name
078     * @param zoneItemId the id of the zone item
079     * @return the status for the page view parameters
080     */
081    @Callable(rights = "Web_Rights_Page_Configure_View_Parameters", rightContext = PageRightAssignmentContext.ID, paramIndex = 0)
082    public Map<String, Object> getStatus (String pageId, String zoneName, String zoneItemId)
083    {
084        Map<String, Object> results = new HashMap<>();
085        ModifiableSitemapElement page = _resolver.resolveById(pageId);
086        Site site = page.getSite();
087        Skin skin = _skinsManager.getSkin(site.getSkinId());
088        String templateName = page.getTemplate();
089        if (StringUtils.isBlank(templateName) || skin.getTemplate(templateName) == null)
090        {
091            results.put("no-parameters", true);
092            return results;
093        }
094        SkinTemplate template = skin.getTemplate(templateName);
095        if (_hasTemplateViewParameters(template))
096        {
097            results.put("allright-view-parameters", true);
098            return results;
099        }
100        if (_hasZoneViewParameters(template, zoneName))
101        {
102            results.put("allright-view-parameters", true);
103            return results;
104        }
105        if (_hasZoneItemViewParameters(template, zoneItemId, skin, results))
106        {
107            return results;
108        }
109        results.put("no-parameters", true);
110        return results;
111    }
112
113    private boolean _hasTemplateViewParameters(SkinTemplate template)
114    {
115        Optional<ViewParametersModel> templateViewParametersModel = _viewParametersManager.getTemplateViewParametersModel(template);
116        return templateViewParametersModel.isPresent() && templateViewParametersModel.get().isNotEmpty();
117    }
118
119    private boolean _hasZoneViewParameters(SkinTemplate template, String zoneName)
120    {
121        if (StringUtils.isNotBlank(zoneName))
122        {
123            SkinTemplateZone zone = template.getZone(zoneName);
124            if (zone == null)
125            {
126                return false;
127            }
128            Optional<ViewParametersModel> zoneViewParametersModel = _viewParametersManager.getZoneViewParametersModel(zone);
129            return zoneViewParametersModel.isPresent() && zoneViewParametersModel.get().isNotEmpty();
130        }
131        return false;
132    }
133
134    private boolean _hasZoneItemViewParameters(SkinTemplate template, String zoneItemId, Skin skin, Map<String, Object> results)
135    {
136        if (StringUtils.isNotBlank(zoneItemId))
137        {
138            ModifiableZoneItem zoneItem = _resolver.resolveById(zoneItemId);
139            SkinTemplateZone zone = template.getZone(zoneItem.getZone().getName());
140            Optional<ViewParametersModel> zoneItemViewParameters = zone.getZoneItemViewParameters();
141            if (zoneItemViewParameters.isPresent() && zoneItemViewParameters.get().isNotEmpty())
142            {
143                results.put("allright-view-parameters", true);
144                return true;
145            }
146            if (zoneItem.getType() == ZoneType.SERVICE)
147            {
148                Map<String, ViewParametersModel> serviceViewParametersModels = _viewParametersManager.getServiceViewParametersModels(skin.getId(), zoneItem.getServiceId());
149                for (ViewParametersModel viewParameters : serviceViewParametersModels.values())
150                {
151                    if (viewParameters.isNotEmpty())
152                    {
153                        results.put("allright-view-parameters", true);
154                        return true;
155                    }
156                }
157            }
158            else if (zoneItem.getType() == ZoneType.CONTENT)
159            {
160                Map<String, ViewParametersModel> contentViewParametersModels = _viewParametersManager.getContentViewParametersModels(skin.getId(), zoneItem.getContent());
161                for (ViewParametersModel viewParameters : contentViewParametersModels.values())
162                {
163                    if (viewParameters.isNotEmpty())
164                    {
165                        results.put("allright-view-parameters", true);
166                        return true;
167                    }
168                }
169            }
170        }
171        return false;
172    }
173}