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.cms.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.cms.clientsideelement.content.SmartContentClientSideElementHelper;
027import org.ametys.cms.content.ContentHelper;
028import org.ametys.cms.repository.Content;
029import org.ametys.cms.repository.WorkflowAwareContent;
030import org.ametys.core.ui.Callable;
031import org.ametys.core.ui.StaticClientSideElement;
032import org.ametys.plugins.repository.AmetysObjectResolver;
033import org.ametys.runtime.i18n.I18nizableText;
034
035/**
036 * Edit HMI item
037 */
038public class SmartContentClientSideElement extends StaticClientSideElement
039{
040    /** Ametys object resolver */
041    protected AmetysObjectResolver _resolver;
042    /** The content helper */
043    protected ContentHelper _contentHelper;
044    /** Helper for smart content client elements */
045    protected SmartContentClientSideElementHelper _smartHelper;
046    
047    @Override
048    public void service(ServiceManager manager) throws ServiceException
049    {
050        super.service(manager);
051        _resolver = (AmetysObjectResolver) manager.lookup(AmetysObjectResolver.ROLE);
052        _contentHelper = (ContentHelper) manager.lookup(ContentHelper.ROLE);
053        _smartHelper = (SmartContentClientSideElementHelper) manager.lookup(SmartContentClientSideElementHelper.ROLE);
054    }
055    
056    /**
057     * Get informations on contents' state
058     * @param contentsId the ids of contents
059     * @return informations on contents' state
060     */
061    @Callable
062    public Map<String, Object> getStatus(List<String> contentsId)
063    {
064        Map<String, Object> results = new HashMap<>();
065        
066        results.put("unmodifiable-contents", new ArrayList<>());
067        results.put("locked-contents", new ArrayList<>());
068        results.put("noright-contents", new ArrayList<>());
069        results.put("invalidworkflowaction-contents", new ArrayList<>());
070        results.put("invalidworkflowstep-contents", new ArrayList<>());
071        results.put("allright-contents", new ArrayList<>());
072        
073        for (String contentId : contentsId)
074        {
075            Content content = _resolver.resolveById(contentId);
076            
077            boolean error = false;
078            
079            if (content instanceof WorkflowAwareContent)
080            {
081                // Is modifiable
082                String enabledOnModifiableOnly = (String) this._script.getParameters().get("enabled-on-modifiable-only"); 
083                if ("true".equals(enabledOnModifiableOnly) && !_isModifiable(content))
084                {
085                    Map<String, Object> contentParams = getContentDefaultParameters (content);
086                    contentParams.put("description", _getNoModifiableDescription(content));
087                    
088                    @SuppressWarnings("unchecked")
089                    List<Map<String, Object>> unModifiableContents = (List<Map<String, Object>>) results.get("unmodifiable-contents");
090                    unModifiableContents.add(contentParams);
091
092                    error = true;
093                }
094                
095                // Is locked
096                String enabledOnUnlockOnly = (String) this._script.getParameters().get("enabled-on-unlock-only"); 
097                if ("true".equals(enabledOnUnlockOnly) && _isLocked(content))
098                {
099                    Map<String, Object> contentParams = getContentDefaultParameters (content);
100                    contentParams.put("description", _getLockedDescription(content));
101                    
102                    @SuppressWarnings("unchecked")
103                    List<Map<String, Object>> lockedContents = (List<Map<String, Object>>) results.get("locked-contents");
104                    lockedContents.add(contentParams);
105                    
106                    error = true;
107                }
108                
109                // Has right correct
110                String enabledOnRightOnly = (String) this._script.getParameters().get("enabled-on-right-only"); 
111                if ("true".equals(enabledOnRightOnly) && !_hasRight(content))
112                {
113                    Map<String, Object> contentParams = getContentDefaultParameters (content);
114                    contentParams.put("description", _getNoRightDescription (content));
115                    
116                    @SuppressWarnings("unchecked")
117                    List<Map<String, Object>> norightContents = (List<Map<String, Object>>) results.get("noright-contents");
118                    norightContents.add(contentParams);
119                    
120                    error = true;
121                }
122                
123                // Is workflow action correct
124                String enabledOnWorkflowActionOnly = (String) this._script.getParameters().get("enabled-on-workflow-action-only"); 
125                if (enabledOnWorkflowActionOnly != null)
126                {
127                    int actionId = _workflowAction(content);
128                    if (actionId == -1)
129                    {
130                        Map<String, Object> contentParams = getContentDefaultParameters (content);
131                        contentParams.put("description", _getWorkflowActionUnvailableDescription(content));
132                        
133                        @SuppressWarnings("unchecked")
134                        List<Map<String, Object>> invalidActionContents = (List<Map<String, Object>>) results.get("invalidworkflowaction-contents");
135                        invalidActionContents.add(contentParams);
136                        
137                        error = true;
138                    }
139                    else
140                    {
141                        results.put("workflowaction-content-actionId", actionId);
142                    }
143                }
144                
145                // Is workflow step correct
146                String enabledOnWorkflowStepOnly = (String) this._script.getParameters().get("enabled-on-workflow-step-only"); 
147                if (enabledOnWorkflowStepOnly != null && !_isWorkflowStepCorrect(content))
148                {
149                    Map<String, Object> contentParams = getContentDefaultParameters (content);
150                    contentParams.put("description", _getIncorrectWorkflowStepDescription(content));
151                    
152                    @SuppressWarnings("unchecked")
153                    List<Map<String, Object>> invalidStepContents = (List<Map<String, Object>>) results.get("invalidworkflowstep-contents");
154                    invalidStepContents.add(contentParams);
155                    
156                    error = true;
157                }
158                
159                if (_isAllRight (content, error, results))
160                {
161                    Map<String, Object> contentParams = getContentDefaultParameters (content);
162                    contentParams.put("description", _getAllRightDescription(content));
163                    
164                    @SuppressWarnings("unchecked")
165                    List<Map<String, Object>> allrightContents = (List<Map<String, Object>>) results.get("allright-contents");
166                    allrightContents.add(contentParams);
167                }
168            }
169        }
170        
171        return results;
172    }
173    
174    /**
175     * Determines if the user can finally do action on content
176     * @param content The content
177     * @param hasError true if a error has already occurs
178     * @param results The result parameters to be passed to client side
179     * @return true if the user can finally do action on content
180     */
181    protected boolean _isAllRight (Content content, boolean hasError, Map<String, Object> results)
182    {
183        return !hasError;
184    }
185    
186    /**
187     * Get the default content's parameters
188     * @param content The content
189     * @return The default parameters
190     */
191    protected Map<String, Object> getContentDefaultParameters (Content content)
192    {
193        return _smartHelper.getContentDefaultParameters(content);
194    }
195    
196    /**
197     * Determines if the content is locked
198     * @param content the content
199     * @return true if the content is locked
200     */
201    protected boolean _isLocked(Content content)
202    {
203        return _smartHelper.isLocked(content);
204    }
205    
206    /**
207     * Determines if the content is modifiable
208     * @param content the content
209     * @return true if the content is modifiable
210     */
211    protected boolean _isModifiable(Content content)
212    {
213        return _smartHelper.isModifiable(content);
214    }
215    
216    /**
217     * Determines if the user has sufficient right for the given content
218     * @param content the content
219     * @return true if user has sufficient right
220     */
221    protected boolean _hasRight(Content content)
222    {
223        return _smartHelper.hasRight(_rights, content);
224    }
225    
226    /**
227     * Determines if the workflow action is correct
228     * @param content the content
229     * @return true if the workflow action is incorrect
230     */
231    protected int _workflowAction(Content content)
232    {
233        return _smartHelper.workflowAction(_script.getParameters(), content);
234    }
235    
236    /**
237     * Determines if the workflow step is correct
238     * @param content the content
239     * @return true if the workflow step is incorrect
240     */
241    protected boolean _isWorkflowStepCorrect(Content content)
242    {
243        return _smartHelper.isWorkflowStepCorrect(_script.getParameters(), content);
244    }
245    
246    /**
247     * Get i18n description when user can not do action because he has no right on content
248     * @param content The content
249     * @return The {@link I18nizableText} description
250     */
251    protected I18nizableText _getNoRightDescription (Content content)
252    {
253        return _smartHelper.getNoRightDescription(_script.getParameters(), content);
254    }
255    
256    /**
257     * Get i18n description when user can not do action because the content is locked
258     * @param content The content
259     * @return The {@link I18nizableText} description
260     */
261    protected I18nizableText _getLockedDescription (Content content)
262    {
263        return _smartHelper.getLockedDescription(_script.getParameters(), content);
264    }
265    
266    /**
267     * Get i18n description when user can not do action because there is no workflow action unvailable
268     * @param content The content
269     * @return The {@link I18nizableText} description
270     */
271    protected I18nizableText _getWorkflowActionUnvailableDescription (Content content)
272    {
273        return _smartHelper.getWorkflowActionUnvailableDescription(_script.getParameters(), content);
274    }
275    
276    /**
277     * Get i18n description when user can not do action because the workflow step is incorrect
278     * @param content The content
279     * @return The {@link I18nizableText} description
280     */
281    protected I18nizableText _getIncorrectWorkflowStepDescription (Content content)
282    {
283        return _smartHelper.getIncorrectWorkflowStepDescription(_script.getParameters(), content);
284    }
285    
286    /**
287     * Get i18n description when user can not do action because the content is not modifiable
288     * @param content The content
289     * @return The {@link I18nizableText} description
290     */
291    protected I18nizableText _getNoModifiableDescription (Content content)
292    {
293        return _smartHelper.getNoModifiableDescription(_script.getParameters(), content);
294    }
295    
296    /**
297     * Get i18n description when user can do action
298     * @param content The content
299     * @return The {@link I18nizableText} description
300     */
301    protected I18nizableText _getAllRightDescription (Content content)
302    {
303        return _smartHelper.getAllRightDescription(_script.getParameters(), content);
304    }
305}