Index: main/plugin-gadgets/src/org/ametys/plugins/gadgets/Init.java =================================================================== --- main/plugin-gadgets/src/org/ametys/plugins/gadgets/Init.java (revision 9146) +++ main/plugin-gadgets/src/org/ametys/plugins/gadgets/Init.java (working copy) @@ -16,13 +16,23 @@ package org.ametys.plugins.gadgets; +import java.util.HashMap; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.avalon.framework.CascadingRuntimeException; +import org.apache.avalon.framework.component.WrapperComponentManager; +import org.apache.avalon.framework.context.Context; +import org.apache.avalon.framework.context.ContextException; +import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; +import org.apache.cocoon.Constants; +import org.apache.cocoon.components.CocoonComponentManager; +import org.apache.cocoon.environment.background.BackgroundEnvironment; import org.apache.commons.lang.StringUtils; import org.apache.excalibur.source.SourceResolver; import org.apache.shindig.common.PropertiesModule; @@ -33,6 +43,7 @@ import org.apache.shindig.gadgets.process.Processor; import org.slf4j.bridge.SLF4JBridgeHandler; +import org.ametys.plugins.gadgets.generators.GadgetsLibraryManager; import org.ametys.runtime.config.Config; import com.google.inject.AbstractModule; @@ -43,15 +54,28 @@ /** * Init class for initializing shindig components */ -public class Init extends AbstractLogEnabled implements org.ametys.runtime.plugin.Init, Serviceable +public class Init extends AbstractLogEnabled implements org.ametys.runtime.plugin.Init, Serviceable, Contextualizable { private static Injector __injector; private SourceResolver _resolver; + private GadgetsLibraryManager _gadgetLibrary; + + /** The cocoon environment context. */ + private org.apache.cocoon.environment.Context _environmentContext; + private ServiceManager _manager; @Override public void service(ServiceManager manager) throws ServiceException { _resolver = (SourceResolver) manager.lookup(SourceResolver.ROLE); + _gadgetLibrary = (GadgetsLibraryManager) manager.lookup(GadgetsLibraryManager.ROLE); + _manager = manager; + } + + @Override + public void contextualize(Context context) throws ContextException + { + _environmentContext = (org.apache.cocoon.environment.Context) context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT); } @Override @@ -73,6 +97,26 @@ new OAuthModule()); ((AmetysGadgetSpecFactory) __injector.getInstance(GadgetSpecFactory.class)).setResolver(_resolver); + + + Map<String, Object> environmentInformation = null; + + try + { + environmentInformation = _createAndEnterEngineEnvironment(); + + // Load the gadget library in cache + _gadgetLibrary.loadLibrary(); + + } + finally + { + // Leave the environment. + if (environmentInformation != null) + { + _leaveEngineEnvironment(environmentInformation); + } + } } /** @@ -132,6 +176,67 @@ return Integer.toString(_port); } } + + /** + * Create and enter a cocoon environment specific to the engine. + * @return a Map with the environment information. + */ + protected Map<String, Object> _createAndEnterEngineEnvironment() + { + BackgroundEnvironment environment; + org.apache.cocoon.Processor processor; + + // Création de l'environnement cocoon particulier + try + { + environment = new BackgroundEnvironment(getLogger(), _environmentContext); + processor = (org.apache.cocoon.Processor) _manager.lookup(org.apache.cocoon.Processor.ROLE); + } + catch (Exception e) + { + throw new CascadingRuntimeException("Error during environment's setup.", e); + } + + Object processingKey = CocoonComponentManager.startProcessing(environment); + int environmentDepth = CocoonComponentManager.markEnvironment(); + + CocoonComponentManager.enterEnvironment(environment, new WrapperComponentManager(_manager), processor); + + Map<String, Object> result = new HashMap<String, Object>(); + + result.put("environment", environment); + result.put("processor", processor); + result.put("processingKey", processingKey); + result.put("environmentDepth", new Integer(environmentDepth)); + + return result; + } + + /** + * Leave the cocoon environment. + * @param environmentInformation the environment information. + */ + protected void _leaveEngineEnvironment(Map<String, Object> environmentInformation) + { + BackgroundEnvironment environment = (BackgroundEnvironment) environmentInformation.get("environment"); + Processor processor = (Processor) environmentInformation.get("processor"); + Object processingKey = environmentInformation.get("processingKey"); + int environmentDepth = ((Integer) environmentInformation.get("environmentDepth")).intValue(); + + CocoonComponentManager.leaveEnvironment(); + CocoonComponentManager.endProcessing(environment, processingKey); + + try + { + CocoonComponentManager.checkEnvironment(environmentDepth, getLogger()); + } + catch (Exception e) + { + throw new CascadingRuntimeException("Error checking the environment", e); + } + + _manager.release(processor); + } class AmetysModule extends AbstractModule {