001/*
002 *  Copyright 2012 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 */
016
017package org.ametys.runtime.plugins.admin.plugins;
018
019import java.util.Map;
020
021import org.apache.avalon.framework.parameters.Parameters;
022import org.apache.avalon.framework.thread.ThreadSafe;
023import org.apache.cocoon.acting.AbstractAction;
024import org.apache.cocoon.environment.ObjectModelHelper;
025import org.apache.cocoon.environment.Redirector;
026import org.apache.cocoon.environment.SourceResolver;
027import org.apache.excalibur.source.Source;
028import org.apache.excalibur.source.SourceUtil;
029
030/**
031 * Change the plugins (activate/deactivate)
032 */
033public class ChangePlugins extends AbstractAction implements ThreadSafe
034{
035    @SuppressWarnings("unchecked")
036    @Override
037    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters parameters) throws Exception
038    {
039        Map<String, Object> jsParameters = (Map<String, Object>) objectModel.get(ObjectModelHelper.PARENT_CONTEXT);
040        
041        // map of extension ids, true means to activate and false to deactivate
042        Map<String, Boolean> extensionPoints = (Map<String, Boolean>) jsParameters.get("EP");
043        Map<String, String> components = (Map<String, String>) jsParameters.get("CMP");
044
045        if (getLogger().isDebugEnabled())
046        {
047            getLogger().debug("Applying following changes");
048            
049            for (String extensionPoint : extensionPoints.keySet())
050            {
051                getLogger().debug("EP " + extensionPoint + " " + extensionPoints.get(extensionPoint));
052            }
053            for (String component : components.keySet())
054            {
055                getLogger().debug("CMP " + component + " " + components.get(component));
056            }
057            
058            getLogger().debug("Applying preceding changes");
059        }
060
061        // 1 - save current runtime.xml file to runtime.bak
062        Source bakFile = null;
063        Source currentFile = null;
064        try
065        {
066            bakFile = resolver.resolveURI("context://WEB-INF/param/runtime.bak");
067            currentFile = resolver.resolveURI("context://WEB-INF/param/runtime.xml");
068            
069            SourceUtil.copy(currentFile, bakFile);
070        }
071        finally
072        {
073            resolver.release(bakFile);
074            resolver.release(currentFile);
075        }
076        
077        Source src = null;
078        try
079        {
080            currentFile = resolver.resolveURI("context://WEB-INF/param/runtime.xml");
081            src = resolver.resolveURI("cocoon:/plugins/change-runtime", null, jsParameters);
082            
083            SourceUtil.copy(src, currentFile);
084        }
085        finally
086        {
087            resolver.release(src);
088            resolver.release(currentFile);
089        }
090
091        return EMPTY_MAP;
092    }
093}