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 org.apache.commons.logging.Log;
024import org.apache.commons.logging.LogFactory;
025import org.nuxeo.automation.scripting.api.AutomationScriptingService;
026import org.nuxeo.automation.scripting.internals.operation.ScriptingOperationDescriptor;
027import org.nuxeo.automation.scripting.internals.operation.ScriptingOperationTypeImpl;
028import org.nuxeo.ecm.automation.AutomationService;
029import org.nuxeo.ecm.automation.OperationException;
030import org.nuxeo.runtime.RuntimeServiceEvent;
031import org.nuxeo.runtime.RuntimeServiceListener;
032import org.nuxeo.runtime.api.Framework;
033import org.nuxeo.runtime.model.ComponentContext;
034import org.nuxeo.runtime.model.ComponentInstance;
035import org.nuxeo.runtime.model.DefaultComponent;
036
037/**
038 * @since 7.2
039 */
040public class AutomationScriptingComponent extends DefaultComponent {
041
042    private static final Log log = LogFactory.getLog(AutomationScriptingComponent.class);
043
044    protected final AutomationScriptingRegistry registry = new AutomationScriptingRegistry();
045
046    protected AutomationScriptingServiceImpl service;
047
048    @Override
049    public void registerContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
050        if (contribution instanceof ScriptingOperationDescriptor) {
051            registry.addContribution((ScriptingOperationDescriptor) contribution);
052        } else {
053            log.error("Unknown extension point " + extensionPoint);
054        }
055    }
056
057    @Override
058    public void unregisterContribution(Object contribution, String extensionPoint, ComponentInstance contributor) {
059        if (contribution instanceof ScriptingOperationDescriptor) {
060            registry.removeContribution((ScriptingOperationDescriptor) contribution);
061        } else {
062            log.error("Unknown extension point " + extensionPoint);
063        }
064    }
065
066    @Override
067    public void applicationStarted(ComponentContext context) {
068        super.applicationStarted(context);
069        service = new AutomationScriptingServiceImpl();
070        AutomationService automation = Framework.getService(AutomationService.class);
071        Framework.addListener(new RuntimeServiceListener() {
072
073            @Override
074            public void handleEvent(RuntimeServiceEvent event) {
075                if (event.id != RuntimeServiceEvent.RUNTIME_ABOUT_TO_STOP) {
076                    return;
077                }
078                Framework.removeListener(this);
079                registry.stream().forEach(contrib -> {
080                    try {
081                        ScriptingOperationTypeImpl type = new ScriptingOperationTypeImpl(service,
082                                automation, contrib);
083                        automation.removeOperation(type);
084                    } catch (OperationException e) {
085                        LogFactory.getLog(AutomationScriptingRegistry.class)
086                                .error("Cannot contribute scripting operation " + contrib.getId());
087                    }
088                });
089            }
090        });
091        {
092            registry.stream().forEach(contrib -> {
093                try {
094                    ScriptingOperationTypeImpl type = new ScriptingOperationTypeImpl(service,
095                            automation, contrib);
096                    automation.putOperation(type, true);
097                } catch (OperationException e) {
098                    LogFactory.getLog(AutomationScriptingRegistry.class)
099                            .error("Cannot contribute scripting operation " + contrib.getId());
100                }
101            });
102        }
103    }
104
105    @Override
106    public <T> T getAdapter(Class<T> adapter) {
107        if (adapter.isAssignableFrom(AutomationScriptingService.class)) {
108            return adapter.cast(service);
109        }
110        return super.getAdapter(adapter);
111    }
112
113}