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.core.ui;
017
018import java.io.InputStream;
019import java.util.LinkedHashMap;
020import java.util.List;
021import java.util.Map;
022
023import org.apache.avalon.framework.configuration.Configuration;
024import org.apache.avalon.framework.configuration.ConfigurationException;
025import org.apache.avalon.framework.configuration.DefaultConfiguration;
026import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
027import org.apache.cocoon.environment.Request;
028import org.apache.cocoon.xml.AttributesImpl;
029import org.apache.cocoon.xml.XMLUtils;
030import org.apache.commons.lang3.StringUtils;
031import org.apache.excalibur.source.Source;
032import org.slf4j.Logger;
033import org.slf4j.LoggerFactory;
034import org.xml.sax.ContentHandler;
035import org.xml.sax.SAXException;
036
037/**
038 * Handles the configuration of uitools factories 
039 */
040public class UIToolsConfigurationManager
041{
042    private static Logger _logger = LoggerFactory.getLogger(UIToolsConfigurationManager.class);
043    
044    /** The default opened tools */
045    protected Map<String, String> _defaultUITools = new LinkedHashMap<>();
046    
047    /** The ui tools factories manager */
048    protected UIToolsFactoriesManager _uitoolsFactoriesManager;
049
050    /** The sax clientside element helper */
051    protected SAXClientSideElementHelper _saxClientSideElementHelper;
052    
053    /** Additional default tools to open */
054    protected String[] _additionalDefaultTools;
055
056    /**
057     * Constructor
058     * @param uitoolsFactoriesManager The instance of ui tools manager
059     * @param saxClientSideElementHelper The instance of sax client helper
060     * @param configSource The configuration source
061     * @param request The request to open by default additionally to those configured
062     */
063    public UIToolsConfigurationManager (UIToolsFactoriesManager uitoolsFactoriesManager, SAXClientSideElementHelper saxClientSideElementHelper, Source configSource, Request request)
064    {
065        _uitoolsFactoriesManager = uitoolsFactoriesManager;
066        _saxClientSideElementHelper = saxClientSideElementHelper;
067        
068        try
069        {
070            Configuration configuration = null;
071            
072            if (configSource.exists())
073            {
074                try (InputStream configIs = configSource.getInputStream())
075                {
076                    configuration = new DefaultConfigurationBuilder().build(configIs);
077                }
078            }
079            else
080            {
081                configuration = new DefaultConfiguration("default");
082            }
083            
084            _configure(configuration);
085        }
086        catch (Exception e)
087        {
088            throw new RuntimeException("Unable to read the configuration file", e);
089        }
090        
091        _additionalDefaultTools = request.getParameterValues("uitool");
092    }
093    
094    
095    
096    private void _configure(Configuration configuration) throws ConfigurationException
097    {
098        if (_logger.isDebugEnabled())
099        {
100            _logger.debug("Starting reading uitools configuration");
101        }
102        
103        Configuration[] defaultUIToolFactoryConfigurations = configuration.getChild("default").getChildren("uitool-factory");
104        for (Configuration uitoolFactoryConfiguration : defaultUIToolFactoryConfigurations)
105        {
106            String id = uitoolFactoryConfiguration.getAttribute("id");
107            String parameters = uitoolFactoryConfiguration.getValue("");
108            
109            _defaultUITools.put(id, parameters);
110        }
111
112        if (_logger.isDebugEnabled())
113        {
114            _logger.debug("Ending reading uitools configuration");
115        }
116    }
117    
118    /**
119     * SAX the default state of uitools to know which ones are opened
120     * @param handler Where to SAX
121     * @param contextualParameters Contextuals parameters transmitted by the environment.
122     * @param dependenciesList The list of dependencies 
123     * @throws SAXException if an error occurs
124     */
125    public void saxDefaultState(ContentHandler handler, Map<String, Object> contextualParameters, List<ClientSideElement> dependenciesList) throws SAXException
126    {
127        handler.startPrefixMapping("i18n", "http://apache.org/cocoon/i18n/2.1");
128        XMLUtils.startElement(handler, "uitools-factories");
129
130        XMLUtils.startElement(handler, "default");
131        for (String id : _defaultUITools.keySet())
132        {
133            AttributesImpl attrs = new AttributesImpl();
134            attrs.addCDATAAttribute("id", id);
135            XMLUtils.createElement(handler, "uitool-factory", attrs, _defaultUITools.get(id));
136        }
137        XMLUtils.endElement(handler, "default");
138
139        XMLUtils.startElement(handler, "additionnal");
140        if (_additionalDefaultTools != null)
141        {
142            for (String additionnalTool : _additionalDefaultTools)
143            {
144                if (!StringUtils.isEmpty(additionnalTool))
145                {
146                    int i = additionnalTool.indexOf(",");
147                    String id = additionnalTool.trim();
148                    String params = "";
149                    if (i != -1)
150                    {
151                        id = additionnalTool.substring(0, i).trim();
152                        params = additionnalTool.substring(i + 1).trim();
153                    }
154                    
155                    AttributesImpl attrs = new AttributesImpl();
156                    attrs.addCDATAAttribute("id", id);
157                    XMLUtils.createElement(handler, "uitool-factory", attrs, params);
158                }
159            }
160        }
161        XMLUtils.endElement(handler, "additionnal");
162
163        if (dependenciesList != null)
164        {
165            for (ClientSideElement factory : dependenciesList)
166            {
167                _saxClientSideElementHelper.saxDefinition("uitool-factory", factory, UIToolsFactoriesManager.ROLE, handler, contextualParameters);
168            }
169        }
170        
171        XMLUtils.endElement(handler, "uitools-factories");
172        handler.endPrefixMapping("i18n");
173    }
174}