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        
086        ModifiableSitemapElement page = _resolver.resolveById(pageId);
087        Site site = page.getSite();
088        Skin skin = _skinsManager.getSkin(site.getSkinId());
089
090        String templateName = page.getTemplate();
091        if (StringUtils.isBlank(templateName) || skin.getTemplate(templateName) == null)
092        {
093            results.put("no-parameters", true);
094            return results;
095        }
096        
097        SkinTemplate template = skin.getTemplate(templateName);
098        Optional<ViewParametersModel> templateViewParametersModel = _viewParametersManager.getTemplateViewParametersModel(template);
099        if (templateViewParametersModel.isPresent() && templateViewParametersModel.get().isNotEmpty())
100        {
101            // we have parameters
102            results.put("allright-view-parameters", true);
103            return results;
104        }
105        
106        if (StringUtils.isNotBlank(zoneName))
107        {
108            SkinTemplateZone zone = template.getZone(zoneName);
109            if (zone == null)
110            {
111                results.put("no-parameters", true);
112                return results;
113            }
114            
115            Optional<ViewParametersModel> zoneViewParametersModel = _viewParametersManager.getZoneViewParametersModel(zone);
116            if (zoneViewParametersModel.isPresent() && zoneViewParametersModel.get().isNotEmpty())
117            {
118                // we have parameters
119                results.put("allright-view-parameters", true);
120                return results;
121            }
122        }
123                
124        if (StringUtils.isNotBlank(zoneItemId))
125        {
126            ModifiableZoneItem zoneItem = _resolver.resolveById(zoneItemId);
127            SkinTemplateZone zone = template.getZone(zoneItem.getZone().getName());
128            Optional<ViewParametersModel> zoneItemViewParameters = zone.getZoneItemViewParameters();
129            if (zoneItemViewParameters.isPresent() && zoneItemViewParameters.get().isNotEmpty())
130            {
131                // we have parameters
132                results.put("allright-view-parameters", true);
133                return results;
134            }
135            
136            if (zoneItem.getType() == ZoneType.SERVICE)
137            {
138                Map<String, ViewParametersModel> serviceViewParametersModels = _viewParametersManager.getServiceViewParametersModels(skin.getId(), zoneItem.getServiceId());
139                for (ViewParametersModel viewParameters : serviceViewParametersModels.values())
140                {
141                    if (viewParameters.isNotEmpty())
142                    {
143                        // we have parameters
144                        results.put("allright-view-parameters", true);
145                        return results;
146                    }
147                }
148            }
149            else if (zoneItem.getType() == ZoneType.CONTENT)
150            {
151                Map<String, ViewParametersModel> contentViewParametersModels = _viewParametersManager.getContentViewParametersModels(skin.getId(), zoneItem.getContent());
152                for (ViewParametersModel viewParameters : contentViewParametersModels.values())
153                {
154                    if (viewParameters.isNotEmpty())
155                    {
156                        // we have parameters
157                        results.put("allright-view-parameters", true);
158                        return results;
159                    }
160                }
161            }
162        }
163        
164        results.put("no-parameters", true);
165        return results;
166    }
167
168}