001/*
002 *  Copyright 2010 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.ArrayList;
019import java.util.HashMap;
020import java.util.List;
021import java.util.Map;
022
023import org.apache.avalon.framework.service.ServiceException;
024import org.apache.avalon.framework.service.ServiceManager;
025
026import org.ametys.core.observation.Event;
027import org.ametys.core.observation.ObservationManager;
028import org.ametys.core.ui.Callable;
029import org.ametys.core.ui.ClientSideElement;
030import org.ametys.plugins.repository.AmetysObject;
031import org.ametys.runtime.i18n.I18nizableText;
032import org.ametys.web.ObservationConstants;
033import org.ametys.web.repository.page.ModifiablePage;
034import org.ametys.web.repository.page.Page;
035import org.ametys.web.repository.page.jcr.DefaultPage;
036
037/**
038 * This {@link ClientSideElement} creates a button representing the SEO properties of a page
039 *
040 */
041public class PageRobotsClientSideElement extends AbstractPageClientSideElement
042{
043    private ObservationManager _observationManager;
044    
045    @Override
046    public void service(ServiceManager smanager) throws ServiceException
047    {
048        super.service(smanager);
049        _observationManager = (ObservationManager) smanager.lookup(ObservationManager.ROLE);
050    }
051    
052    /**
053     * Allow/Disallow the robots on a page 
054     * @param pageIds the selected pages
055     * @param exclude true to disallow the robots on the selected pages, false otherwise 
056     * @return true if succeeds
057     */
058    @Callable
059    public boolean editRobots (List<String> pageIds, boolean exclude)
060    {
061        for (String id : pageIds)
062        {
063            ModifiablePage page = _resolver.resolveById(id);
064            
065            page.getMetadataHolder().setMetadata(DefaultPage.METADATA_ROBOTS_DISALLOW, exclude);
066            page.saveChanges();
067            
068            Map<String, Object> eventParams = new HashMap<>();
069            eventParams.put(ObservationConstants.ARGS_PAGE, page);
070            _observationManager.notify(new Event(ObservationConstants.EVENT_ROBOTS_CHANGED, _currentUserProvider.getUser(), eventParams));
071        } 
072        
073        return true;
074    }
075    
076    /**
077     * Get the robots status of given pages
078     * @param pageIds The page id
079     * @return the result
080     */
081    @Callable
082    public Map<String, Object> getStatus (List<String> pageIds)
083    {
084        Map<String, Object> results = new HashMap<>();
085        
086        results.put("nomodifiable-pages", new ArrayList<Map<String, Object>>());
087        results.put("noright-pages", new ArrayList<Map<String, Object>>());
088        results.put("included-pages", new ArrayList<Map<String, Object>>());
089        results.put("excluded-pages", new ArrayList<Map<String, Object>>());
090        results.put("parent-excluded-pages", new ArrayList<Map<String, Object>>());
091    
092        for (String pageId : pageIds)
093        {
094            Page page = _resolver.resolveById(pageId);
095            
096            Map<String, Object> pageParams = getPageDefaultParameters(page);
097            
098            if (!(page instanceof ModifiablePage))
099            {
100                pageParams.put("description", getNoModifiablePageDescription(page));
101
102                @SuppressWarnings("unchecked")
103                List<Map<String, Object>> nomodifiablePages = (List<Map<String, Object>>) results.get("nomodifiable-pages");
104                nomodifiablePages.add(pageParams);
105            }
106            else if (!hasRight(page))
107            {
108                pageParams.put("description", getNoRightPageDescription(page));
109
110                @SuppressWarnings("unchecked")
111                List<Map<String, Object>> norightPages = (List<Map<String, Object>>) results.get("noright-pages");
112                norightPages.add(pageParams);
113            }
114            else
115            {
116                if (_isExcludedFromSEO(page))
117                {
118                    pageParams.put("description", _getExcludedDescription(page));
119                    
120                    @SuppressWarnings("unchecked")
121                    List<Map<String, Object>> excludedPages = (List<Map<String, Object>>) results.get("excluded-pages");
122                    excludedPages.add(pageParams);
123                }
124                else if (_isParentExcludedFromSEO(page))
125                {
126                    pageParams.put("description", _getParentExcludedDescription(page));
127                    
128                    @SuppressWarnings("unchecked")
129                    List<Map<String, Object>> excludedPages = (List<Map<String, Object>>) results.get("parent-excluded-pages");
130                    excludedPages.add(pageParams);
131                }
132                else
133                {
134                    pageParams.put("description", _getIncludedDescription(page));
135                    
136                    @SuppressWarnings("unchecked")
137                    List<Map<String, Object>> includedPages = (List<Map<String, Object>>) results.get("included-pages");
138                    includedPages.add(pageParams);
139                    
140                }
141            }
142        }
143        
144        return results;
145    }
146    
147    private I18nizableText _getExcludedDescription (Page page)
148    {
149        List<String> i18nParameters = new ArrayList<>();
150        i18nParameters.add(page.getTitle());
151        
152        I18nizableText ed = (I18nizableText) this._script.getParameters().get("page-excluded-description");
153        return new I18nizableText(ed.getCatalogue(), ed.getKey(), i18nParameters);
154    }
155    
156    private I18nizableText _getParentExcludedDescription (Page page)
157    {
158        List<String> i18nParameters = new ArrayList<>();
159        i18nParameters.add(page.getTitle());
160        
161        I18nizableText ed = (I18nizableText) this._script.getParameters().get("page-excluded-description");
162        return new I18nizableText(ed.getCatalogue(), ed.getKey(), i18nParameters);
163    }
164    
165    private I18nizableText _getIncludedDescription (Page page)
166    {
167        List<String> i18nParameters = new ArrayList<>();
168        i18nParameters.add(page.getTitle());
169        
170        I18nizableText ed = (I18nizableText) this._script.getParameters().get("page-included-description");
171        return new I18nizableText(ed.getCatalogue(), ed.getKey(), i18nParameters);
172    }
173
174    private boolean _isExcludedFromSEO (Page page)
175    {
176        return page.getMetadataHolder().getBoolean(DefaultPage.METADATA_ROBOTS_DISALLOW, false);
177    }
178    
179    private boolean _isParentExcludedFromSEO (Page page)
180    {
181        AmetysObject parent = page.getParent();
182        while (parent != null && parent instanceof Page)
183        {
184            boolean excluded = ((Page) parent).getMetadataHolder().getBoolean(DefaultPage.METADATA_ROBOTS_DISALLOW, false);
185            if (excluded)
186            {
187                return true;
188            }
189            parent = parent.getParent();
190        }
191        return false;
192    }
193}