/* * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.switchyard.as7.extension.services; import java.util.Map; import java.util.Set; import javax.xml.namespace.QName; import org.jboss.dmr.ModelNode; import org.jboss.jca.core.spi.rar.ResourceAdapterRepository; import org.jboss.logging.Logger; import org.jboss.modules.Module; import org.jboss.modules.ModuleIdentifier; import org.jboss.modules.ModuleLoadException; import org.jboss.msc.inject.Injector; import org.jboss.msc.service.Service; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.StartContext; import org.jboss.msc.service.StartException; import org.jboss.msc.service.StopContext; import org.jboss.msc.value.InjectedValue; import org.switchyard.as7.extension.CommonAttributes; import org.switchyard.as7.extension.ExtensionLogger; import org.switchyard.config.Configuration; import org.switchyard.config.ConfigurationPuller; import org.switchyard.config.Configurations; import org.switchyard.deploy.Component; /** * The SwitchYard Component service. * * @author Magesh Kumar B <mageshbk@jboss.com> (C) 2011 Red Hat Inc. */ public class SwitchYardComponentService implements Service<Component> { private static final Logger LOG = Logger.getLogger("org.switchyard"); /** * Represents a SwitchYard Component initializer service name. */ public static final ServiceName SERVICE_NAME = ServiceName.of("SwitchYardComponentService"); private final InjectedValue<Map> _injectedValues = new InjectedValue<Map>(); private final InjectedValue<ResourceAdapterRepository> _resourceAdapterRepository = new InjectedValue<ResourceAdapterRepository>(); private String _moduleId; private ModelNode _model; private Component _component; /** * Constructs a SwitchYard Component service. * * @param moduleId the module identifier * @param model the Module's model operation */ public SwitchYardComponentService(String moduleId, ModelNode model) { _moduleId = moduleId; _model = model; } @Override public Component getValue() throws IllegalStateException, IllegalArgumentException { return _component; } @Override public void start(StartContext context) throws StartException { Class<?> componentClass; String className = _model.get(CommonAttributes.IMPLCLASS).asString(); try { componentClass = Module.loadClassFromCallerModuleLoader(ModuleIdentifier.fromString(_moduleId), className); try { _component = (Component) componentClass.newInstance(); ModelNode properties = _model.hasDefined(CommonAttributes.PROPERTIES) ? _model.get(CommonAttributes.PROPERTIES) : null; _component.init(createEnvironmentConfig(properties)); LOG.debug("Initialized component " + _component); _component.addResourceDependency(_resourceAdapterRepository.getValue()); } catch (InstantiationException ie) { ExtensionLogger.ROOT_LOGGER.unableToInstantiateClass(className, ie); } catch (IllegalAccessException iae) { ExtensionLogger.ROOT_LOGGER.unableToAccessConstructor(className, iae); } } catch (ClassNotFoundException cnfe) { ExtensionLogger.ROOT_LOGGER.unableToLoadClass(className, cnfe); } catch (ModuleLoadException mle) { ExtensionLogger.ROOT_LOGGER.unableToLoadModule(_moduleId, mle); } } private Configuration createEnvironmentConfig(ModelNode properties) { Configuration envConfig = Configurations.newConfiguration(); if (properties != null) { Set<String> propertyNames = properties.keys(); if (propertyNames != null) { for (String propertyName : propertyNames) { Configuration propConfig = new ConfigurationPuller().pull(new QName(propertyName)); String value = properties.get(propertyName).asString(); if (value.startsWith(CommonAttributes.DOLLAR)) { String key = value.substring(1); String injectedValue = (String) _injectedValues.getValue().get(key); if (injectedValue != null) { propConfig.setValue(injectedValue); envConfig.addChild(propConfig); } } else { propConfig.setValue(value); envConfig.addChild(propConfig); } } } } return envConfig; } @Override public void stop(StopContext context) { LOG.info("Stopping SwitchYard component " + _component.getName()); try { _component.destroy(); } catch (Exception e) { ExtensionLogger.ROOT_LOGGER.unableToStop(_component.getName(), e); } } /** * Injection point for injectValues. * * @return a map of injected values */ public InjectedValue<Map> getInjectedValues() { return _injectedValues; } /** * Injection point for ResourceAdapterRepository. * @return ResourceAdapterRepository */ public Injector<ResourceAdapterRepository> getResourceAdapterRepository() { return _resourceAdapterRepository; } }