001/*
002 * (C) Copyright 2015 Nuxeo SA (http://nuxeo.com/) and others.
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 * Contributors:
017 *     Thierry Delprat <tdelprat@nuxeo.com>
018 *     Stephane Lacoin <slacoin@nuxeo.com>
019 *     Vladimir Pasquier <vpasquier@nuxeo.com>
020 */
021package org.nuxeo.automation.scripting.internals;
022
023import javax.script.ScriptEngineManager;
024
025import org.apache.commons.logging.Log;
026import org.apache.commons.logging.LogFactory;
027import org.nuxeo.automation.scripting.api.AutomationScriptingConstants;
028import org.nuxeo.automation.scripting.api.AutomationScriptingService;
029import org.nuxeo.automation.scripting.internals.operation.ScriptingOperationDescriptor;
030import org.nuxeo.automation.scripting.internals.operation.ScriptingOperationTypeImpl;
031import org.nuxeo.ecm.automation.AutomationService;
032import org.nuxeo.ecm.automation.OperationException;
033import org.nuxeo.ecm.core.api.NuxeoException;
034import org.nuxeo.runtime.api.Framework;
035import org.nuxeo.runtime.management.metrics.MetricInvocationHandler;
036import org.nuxeo.runtime.model.ComponentContext;
037import org.nuxeo.runtime.model.ComponentInstance;
038import org.nuxeo.runtime.model.DefaultComponent;
039
040/**
041 * @since 7.2
042 */
043public class AutomationScriptingComponent extends DefaultComponent {
044
045    private static final Log log = LogFactory.getLog(AutomationScriptingComponent.class);
046
047    protected ScriptingFactory scriptingFactory;
048
049    public AutomationScriptingService scriptingService = new AutomationScriptingServiceImpl();
050
051    @Override
052    public void activate(ComponentContext context) {
053        super.activate(context);
054        scriptingFactory = new ScriptingFactory();
055        scriptingFactory.install();
056        if (Boolean.valueOf(Framework.getProperty(AutomationScriptingConstants.AUTOMATION_SCRIPTING_MONITOR,
057                Boolean.toString(log.isTraceEnabled())))) {
058            scriptingService = MetricInvocationHandler.newProxy(scriptingService, AutomationScriptingService.class);
059        }
060    }
061
062    @Override
063    public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
064        if (AutomationScriptingConstants.XP_OPERATION.equals(extensionPoint)) {
065            AutomationService automationService = Framework.getLocalService(AutomationService.class);
066            ScriptingOperationDescriptor desc = (ScriptingOperationDescriptor) contribution;
067            ScriptingOperationTypeImpl type = new ScriptingOperationTypeImpl(automationService, desc);
068            try {
069                automationService.putOperation(type, true);
070            } catch (OperationException e) {
071                throw new NuxeoException(e);
072            }
073        } else {
074            log.error("Unknown extension point " + extensionPoint);
075        }
076    }
077
078    @Override
079    public void unregisterContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
080        if (AutomationScriptingConstants.XP_OPERATION.equals(extensionPoint)) {
081            AutomationService automationService = Framework.getLocalService(AutomationService.class);
082            ScriptingOperationDescriptor desc = (ScriptingOperationDescriptor) contribution;
083            ScriptingOperationTypeImpl type = new ScriptingOperationTypeImpl(automationService, desc);
084            automationService.removeOperation(type);
085        } else {
086            log.error("Unknown extension point " + extensionPoint);
087        }
088    }
089
090    @Override
091    public void deactivate(ComponentContext context) {
092        super.deactivate(context);
093    }
094
095    @Override
096    public void applicationStarted(ComponentContext context) {
097        super.applicationStarted(context);
098    }
099
100    @Override
101    public <T> T getAdapter(Class<T> adapter) {
102        if (adapter.isAssignableFrom(AutomationScriptingService.class)) {
103            return adapter.cast(scriptingService);
104        }
105        if (adapter.isAssignableFrom(ScriptEngineManager.class)) {
106            return adapter.cast(scriptingFactory.scriptEngineManager);
107        }
108        return null;
109    }
110
111}