001/*
002 *  Copyright 2015 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.plugins.syndication;
017
018import java.util.ArrayList;
019import java.util.HashMap;
020import java.util.List;
021import java.util.Map;
022
023import org.apache.avalon.framework.parameters.Parameters;
024import org.apache.avalon.framework.service.ServiceException;
025import org.apache.avalon.framework.service.ServiceManager;
026import org.apache.cocoon.acting.ServiceableAction;
027import org.apache.cocoon.environment.ObjectModelHelper;
028import org.apache.cocoon.environment.Redirector;
029import org.apache.cocoon.environment.Request;
030import org.apache.cocoon.environment.SourceResolver;
031import org.apache.commons.lang.StringUtils;
032
033import org.ametys.core.cocoon.ActionResultGenerator;
034import org.ametys.core.user.CurrentUserProvider;
035import org.ametys.core.user.UserIdentity;
036import org.ametys.core.userpref.UserPreferencesManager;
037import org.ametys.core.util.URLEncoder;
038import org.ametys.plugins.repository.AmetysObjectResolver;
039import org.ametys.runtime.i18n.I18nizableText;
040import org.ametys.web.repository.page.Page;
041import org.ametys.web.repository.page.ZoneItem;
042import org.ametys.web.userpref.FOUserPreferencesConstants;
043
044
045/**
046 * Set user preference
047 */
048public class SetRssFeedUserPreferencesAction extends ServiceableAction
049{
050    /** The user preferences manager. */
051    protected UserPreferencesManager _userPrefManager;
052    
053    /** The Ametys resolver */
054    protected AmetysObjectResolver _resolver;
055    
056    /** The current user provider */
057    protected CurrentUserProvider _currentUserProvider;
058    
059    @Override
060    public void service(ServiceManager serviceManager) throws ServiceException
061    {
062        super.service(serviceManager);
063        _userPrefManager = (UserPreferencesManager) serviceManager.lookup(UserPreferencesManager.ROLE + ".FO");
064        _resolver = (AmetysObjectResolver) serviceManager.lookup(AmetysObjectResolver.ROLE);
065        _currentUserProvider = (CurrentUserProvider) serviceManager.lookup(CurrentUserProvider.ROLE);
066    }
067    
068    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
069    {
070        Request request = ObjectModelHelper.getRequest(objectModel);
071        Map<String, Object> result = new HashMap<>();
072        List<I18nizableText> errors = new ArrayList<>();
073
074        UserIdentity user = _currentUserProvider.getUser();
075        
076        String zoneItemId = request.getParameter("zone-item-id");
077        ZoneItem zoneItem = _resolver.resolveById(zoneItemId);
078   
079        Page page = zoneItem.getZone().getPage();
080        String language = page.getSitemapName();
081        String siteName = page.getSiteName();
082        
083        String storageContext = siteName + "/" + language + "/" + zoneItem.getId();
084        Map<String, String> contextVars = _getContextVars(siteName, language);
085        
086        Map<String, String> values = new HashMap<>();
087        String ids = _getIds(request);
088        
089        int nbMaxCheck = Integer.parseInt(request.getParameter("nbMaxCheck"));
090        if (StringUtils.split(ids, ",").length <= nbMaxCheck || nbMaxCheck == 0)
091        {
092            values.put(FeedsGenerator.USER_PREF_RSS_ID_KEY, ids);
093            values.put(FeedsGenerator.USER_PREF_RSS_URL_KEY, _getUrls(request));
094            
095            _userPrefManager.setUserPreferences(user, storageContext, contextVars, values);
096        }
097        else
098        {
099            errors.add(new I18nizableText("plugin.syndication", "SYNDICATION_SERVICE_CONFIG_RSS_ERROR_TO_MANY_CHECK"));
100        }
101        
102        if (errors.size() > 0)
103        {
104            result.put("error", errors);
105        }
106        
107        request.setAttribute(ActionResultGenerator.MAP_REQUEST_ATTR, result);
108        
109        return EMPTY_MAP;
110    }
111    
112    private String _getUrls(Request request)
113    {
114        int nbFeedUser = Integer.parseInt(request.getParameter("nbMaxUser"));
115
116        int nbFeed = Integer.parseInt(request.getParameter("nbFeedService"));
117        int position = nbFeed + 1;
118        
119        List<String> urls = new ArrayList<>();
120        for (int i = 0; i < nbFeedUser; i++)
121        {
122            String url = request.getParameter("feed-url-" + (position + i));
123            if (!StringUtils.isWhitespace(url))
124            {
125                urls.add(URLEncoder.encodePath(url));
126            }
127        }
128        
129        return StringUtils.join(urls, ",");
130    }
131    
132    private String _getIds(Request request)
133    {
134        int nbFeed = Integer.parseInt(request.getParameter("nbFeedService"));
135        int nbFeedUser = Integer.parseInt(request.getParameter("nbMaxUser"));
136
137        List<String> ids = new ArrayList<>();
138        for (int i = 1; i <= (nbFeed + nbFeedUser); i++)
139        {
140            String checked = request.getParameter("feed-check-" + i);
141            if (!StringUtils.isEmpty(checked))
142            {
143                if (checked.equals("true") || checked.equals("on"))
144                {
145                    String url = request.getParameter("feed-url-" + i);
146                    if (!StringUtils.isWhitespace(url))
147                    {
148                        ids.add(request.getParameter("feed-id-" + i));
149                    }
150                }
151            }
152        }
153        
154        return StringUtils.join(ids, ",");
155    }
156    
157    private Map<String, String> _getContextVars(String siteName, String language)
158    {
159        Map<String, String> contextVars = new HashMap<>();
160        
161        contextVars.put(FOUserPreferencesConstants.CONTEXT_VAR_SITENAME, siteName);
162        contextVars.put(FOUserPreferencesConstants.CONTEXT_VAR_LANGUAGE, language);
163        
164        return contextVars;
165    }
166
167}