001/*
002 *  Copyright 2011 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.skinfactory.clientsidelement;
017
018import java.util.ArrayList;
019import java.util.Collections;
020import java.util.LinkedHashMap;
021import java.util.List;
022import java.util.Map;
023import java.util.Set;
024
025import org.apache.avalon.framework.configuration.Configuration;
026import org.apache.avalon.framework.configuration.ConfigurationException;
027import org.apache.avalon.framework.configuration.DefaultConfiguration;
028import org.apache.avalon.framework.service.ServiceException;
029import org.apache.avalon.framework.service.ServiceManager;
030import org.apache.cocoon.ProcessingException;
031
032import org.ametys.core.ui.ClientSideElement;
033import org.ametys.core.ui.SimpleMenu;
034import org.ametys.core.ui.StaticClientSideElement;
035import org.ametys.core.util.I18nUtils;
036import org.ametys.runtime.i18n.I18nizableText;
037import org.ametys.web.skin.SkinModel;
038import org.ametys.web.skin.SkinModelsManager;
039
040/**
041 * {@link StaticClientSideElement} for models menu
042 */
043public class ModelsMenu extends SimpleMenu
044{
045    private SkinModelsManager _modelsManager;
046    private boolean _modelsInitialized;
047    private I18nUtils _i18nUtils;
048    
049    @Override
050    public void service(ServiceManager smanager) throws ServiceException
051    {
052        super.service(smanager);
053        _modelsManager = (SkinModelsManager) smanager.lookup(SkinModelsManager.ROLE);
054        _i18nUtils = (I18nUtils) smanager.lookup(I18nUtils.ROLE);
055    }
056    
057    @Override
058    public List<Script> getScripts(boolean ignoreRights, Map<String, Object> contextParameters)
059    {
060        Map<String, String> rights = getRights(contextParameters);
061        
062        if (!ignoreRights && !hasRight(rights))
063        {
064            return Collections.EMPTY_LIST;
065        }
066        
067        try
068        {
069            Set<String> models = _modelsManager.getModels();
070            if (models.size() > 0)
071            {
072                return super.getScripts(ignoreRights, contextParameters);
073            }
074            else
075            {
076                return Collections.EMPTY_LIST;
077            }
078        }
079        catch (Exception e)
080        {
081            throw new IllegalStateException("Unable to lookup client side element local components", e);
082        }
083    }
084
085    @Override
086    protected void _getGalleryItems(Map<String, Object> parameters, Map<String, Object> contextualParameters)
087    {
088        try
089        {
090            _lazyInitializeModelsGallery();
091        }
092        catch (Exception e)
093        {
094            throw new IllegalStateException("Unable to lookup client side element local components", e);
095        }
096        
097        if (_galleryItems.size() > 0)
098        {
099            parameters.put("gallery-item", new LinkedHashMap<>());
100            
101            for (GalleryItem galleryItem : _galleryItems)
102            {
103                @SuppressWarnings("unchecked")
104                Map<String, Object> galleryItems = (Map<String, Object>) parameters.get("gallery-item");
105                galleryItems.put("gallery-groups", new ArrayList<>());
106                
107                for (GalleryGroup galleryGp : galleryItem.getGroups())
108                {
109                    @SuppressWarnings("unchecked")
110                    List<Object> galleryGroups = (List<Object>) galleryItems.get("gallery-groups");
111                    
112                    Map<String, Object> groupParams = new LinkedHashMap<>();
113                    
114                    I18nizableText label = galleryGp.getLabel();
115                    groupParams.put("label", label);
116                    
117                    // Group items
118                    List<String> gpItems = new ArrayList<>();
119                    for (ClientSideElement element : galleryGp.getItems())
120                    {
121                        gpItems.add(element.getId());
122                    }
123                    
124                    if (gpItems.size() > 0)
125                    {
126                        groupParams.put("items", gpItems);
127                        galleryGroups.add(groupParams);
128                    }
129                }
130            }
131        }
132    }
133    
134
135    /**
136     * Lazy initialization of the language gallery
137     * @throws ConfigurationException if the models' configuration is wrong
138     * @throws ProcessingException if an error occurs when retrieving the models
139     */
140    private synchronized void _lazyInitializeModelsGallery() throws ConfigurationException, ProcessingException
141    {
142        if (!_modelsInitialized)
143        {
144            Set<String> models = _modelsManager.getModels();
145            
146            if (models.size() > 0)
147            {
148                GalleryItem galleryItem = new GalleryItem();
149                
150                GalleryGroup galleryGroup = new GalleryGroup(new I18nizableText("plugin." + _pluginName, "PLUGINS_SKINFACTORY_MODELSMENU_GROUP_LABEL"));
151                galleryItem.addGroup(galleryGroup);
152                
153                for (String id : models)
154                {
155                    SkinModel model = _modelsManager.getModel(id);
156                    
157                    String itemId = this.getId() + "-" + id;
158                    
159                    Configuration conf = _getModelConfiguration(itemId, model);
160                    _getGalleryItemManager().addComponent(_pluginName, null, itemId, StaticClientSideElement.class, conf);
161                    galleryGroup.addItem(new UnresolvedItem(itemId, true));
162                }
163                
164                _galleryItems.add(galleryItem);
165            }
166            
167            if (_galleryItems.size() > 0)
168            {
169                try
170                {
171                    _getGalleryItemManager().initialize();
172                }
173                catch (Exception e)
174                {
175                    throw new ConfigurationException("Unable to lookup parameter local components", e);
176                }
177            }
178        }
179        
180        _modelsInitialized = true;
181    }
182
183    /**
184     * Get the configuration of the model item
185     * @param id The id of item
186     * @param model The model
187     * @return The configuration
188     */
189    protected Configuration _getModelConfiguration(String id, SkinModel model)
190    {
191        DefaultConfiguration conf = new DefaultConfiguration("extension");
192        conf.setAttribute("id", id);
193        
194        DefaultConfiguration classConf = new DefaultConfiguration("class");
195        classConf.setAttribute("name", "Ametys.ribbon.element.ui.ButtonController");
196
197        // enable toggle
198        DefaultConfiguration enableToggleConf = new DefaultConfiguration("toggle-enabled");
199        enableToggleConf.setValue("true");
200        classConf.addChild(enableToggleConf);
201
202        
203        // Label
204        DefaultConfiguration labelConf = new DefaultConfiguration("label");
205        labelConf.setValue(_i18nUtils.translate(model.getLabel()));
206        classConf.addChild(labelConf);
207        
208        // Description
209        DefaultConfiguration descriptionConf = new DefaultConfiguration("description");
210        descriptionConf.setValue(_i18nUtils.translate(model.getDescription()));
211        classConf.addChild(descriptionConf);
212        
213        // Icons
214        DefaultConfiguration iconSmallConf = new DefaultConfiguration("icon-small");
215        iconSmallConf.setValue(model.getSmallImage());
216        classConf.addChild(iconSmallConf);
217        DefaultConfiguration iconMediumConf = new DefaultConfiguration("icon-medium");
218        iconMediumConf.setValue(model.getMediumImage());
219        classConf.addChild(iconMediumConf);
220        DefaultConfiguration iconLargeConf = new DefaultConfiguration("icon-large");
221        iconLargeConf.setValue(model.getLargeImage());
222        classConf.addChild(iconLargeConf);
223
224        // Model name
225        DefaultConfiguration modelNameConf = new DefaultConfiguration("modelName");
226        modelNameConf.setValue(model.getId());
227        classConf.addChild(modelNameConf);
228        
229        // Common configuration
230        @SuppressWarnings("unchecked")
231        Map<String, Object> commonConfig = (Map<String, Object>) this._script.getParameters().get("items-config");
232        for (String tagName : commonConfig.keySet())
233        {
234            DefaultConfiguration c = new DefaultConfiguration(tagName);
235            c.setValue(String.valueOf(commonConfig.get(tagName)));
236            classConf.addChild(c);
237        }
238        
239        conf.addChild(classConf);
240        return conf;
241    }
242}