summaryrefslogtreecommitdiffstats
path: root/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
diff options
context:
space:
mode:
Diffstat (limited to 'sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java')
-rw-r--r--sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java379
1 files changed, 379 insertions, 0 deletions
diff --git a/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java b/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
new file mode 100644
index 0000000000..4a9cbb1ff5
--- /dev/null
+++ b/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
@@ -0,0 +1,379 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.tuscany.core.runtime;
+
+import static org.apache.tuscany.spi.bootstrap.ComponentNames.TUSCANY_DEPLOYER;
+import static org.apache.tuscany.spi.bootstrap.ComponentNames.TUSCANY_SYSTEM;
+import static org.apache.tuscany.spi.bootstrap.ComponentNames.TUSCANY_SYSTEM_ROOT;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.xml.stream.XMLInputFactory;
+
+import org.apache.tuscany.core.bootstrap.Bootstrapper;
+import org.apache.tuscany.core.bootstrap.DefaultBootstrapper;
+import org.apache.tuscany.core.bootstrap.ExtensionActivator;
+import org.apache.tuscany.core.builder.ConnectorImpl;
+import org.apache.tuscany.core.component.ComponentManagerImpl;
+import org.apache.tuscany.core.component.SimpleWorkContext;
+import org.apache.tuscany.core.component.scope.CompositeScopeContainer;
+import org.apache.tuscany.core.component.scope.ScopeRegistryImpl;
+import org.apache.tuscany.core.deployer.DeployerImpl;
+import org.apache.tuscany.core.monitor.NullMonitorFactory;
+import org.apache.tuscany.core.resolver.AutowireResolver;
+import org.apache.tuscany.core.resolver.DefaultAutowireResolver;
+import org.apache.tuscany.core.services.classloading.ClassLoaderRegistryImpl;
+import org.apache.tuscany.core.util.IOHelper;
+import org.apache.tuscany.host.MonitorFactory;
+import org.apache.tuscany.host.RuntimeInfo;
+import org.apache.tuscany.host.management.ManagementService;
+import org.apache.tuscany.host.monitor.FormatterRegistry;
+import org.apache.tuscany.host.runtime.InitializationException;
+import org.apache.tuscany.host.runtime.TuscanyRuntime;
+import org.apache.tuscany.spi.builder.BuilderRegistry;
+import org.apache.tuscany.spi.builder.Connector;
+import org.apache.tuscany.spi.component.AtomicComponent;
+import org.apache.tuscany.spi.component.Component;
+import org.apache.tuscany.spi.component.ComponentManager;
+import org.apache.tuscany.spi.component.RegistrationException;
+import org.apache.tuscany.spi.component.ScopeContainerMonitor;
+import org.apache.tuscany.spi.component.ScopeRegistry;
+import org.apache.tuscany.spi.component.TargetResolutionException;
+import org.apache.tuscany.spi.component.WorkContext;
+import org.apache.tuscany.spi.deployer.Deployer;
+import org.apache.tuscany.spi.idl.java.JavaServiceContract;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.services.classloading.ClassLoaderRegistry;
+import org.apache.tuscany.spi.services.management.TuscanyManagementService;
+import org.osoa.sca.ComponentContext;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public abstract class AbstractRuntime<I extends RuntimeInfo> implements TuscanyRuntime<I> {
+ private static final URI MONITOR_URI = TUSCANY_SYSTEM_ROOT.resolve("MonitorFactory");
+
+ private static final URI COMPONENT_MGR_URI = TUSCANY_SYSTEM_ROOT.resolve("ComponentManager");
+
+ private static final URI AUTOWIRE_RESOLVER_URI = TUSCANY_SYSTEM_ROOT.resolve("AutowireResolver");
+
+ private static final URI SCOPE_REGISTRY_URI = TUSCANY_SYSTEM_ROOT.resolve("ScopeRegistry");
+
+ private static final URI WORK_CONTEXT_URI = TUSCANY_SYSTEM.resolve("WorkContext");
+
+ private static final URI RUNTIME_INFO_URI = TUSCANY_SYSTEM_ROOT.resolve("RuntimeInfo");
+
+ private static final URI CLASSLOADER_REGISTRY_URI = TUSCANY_SYSTEM_ROOT.resolve("ClassLoaderRegistry");
+
+ private static final URI HOST_CLASSLOADER_ID = URI.create("sca://./hostClassLoader");
+
+ private static final URI BOOT_CLASSLOADER_ID = URI.create("sca://./bootClassLoader");
+
+ protected final XMLInputFactory xmlFactory;
+ protected URL systemScdl;
+ protected String applicationName;
+ protected URL applicationScdl;
+ protected Class<I> runtimeInfoType;
+ protected ManagementService<?> managementService;
+
+ // primorial components automatically registered with the runtime
+ /**
+ * Information provided by the host about its runtime environment.
+ */
+ protected I runtimeInfo;
+
+ /**
+ * MonitorFactory provided by the host for directing events to its
+ * management framework.
+ */
+ protected MonitorFactory monitorFactory;
+
+ /**
+ * The ComponentManager that manages all components in this runtime.
+ */
+ protected ComponentManager componentManager;
+
+ /**
+ * Registry for ClassLoaders used by this runtime.
+ */
+ protected ClassLoaderRegistry classLoaderRegistry;
+
+ protected AutowireResolver resolver;
+
+ protected Component systemComponent;
+ protected Component tuscanySystem;
+
+ protected ScopeRegistry scopeRegistry;
+ protected Collection<ExtensionActivator> activators;
+
+ protected AbstractRuntime(Class<I> runtimeInfoType) {
+ this(runtimeInfoType, new NullMonitorFactory());
+ }
+
+ protected AbstractRuntime(Class<I> runtimeInfoType, MonitorFactory monitorFactory) {
+ this.runtimeInfoType = runtimeInfoType;
+ this.monitorFactory = monitorFactory;
+ xmlFactory = XMLInputFactory.newInstance("javax.xml.stream.XMLInputFactory", getClass().getClassLoader());
+ classLoaderRegistry = new ClassLoaderRegistryImpl();
+ classLoaderRegistry.register(BOOT_CLASSLOADER_ID, getClass().getClassLoader());
+ }
+
+ public URL getSystemScdl() {
+ return systemScdl;
+ }
+
+ public void setSystemScdl(URL systemScdl) {
+ this.systemScdl = systemScdl;
+ }
+
+ public String getApplicationName() {
+ return applicationName;
+ }
+
+ public void setApplicationName(String applicationName) {
+ this.applicationName = applicationName;
+ }
+
+ public URL getApplicationScdl() {
+ return applicationScdl;
+ }
+
+ public void setApplicationScdl(URL applicationScdl) {
+ this.applicationScdl = applicationScdl;
+ }
+
+ public ClassLoader getHostClassLoader() {
+ return classLoaderRegistry.getClassLoader(HOST_CLASSLOADER_ID);
+ }
+
+ public void setHostClassLoader(ClassLoader hostClassLoader) {
+ classLoaderRegistry.register(HOST_CLASSLOADER_ID, hostClassLoader);
+ }
+
+ public I getRuntimeInfo() {
+ return runtimeInfo;
+ }
+
+ public void setRuntimeInfo(I runtimeInfo) {
+ this.runtimeInfo = runtimeInfo;
+ }
+
+ public MonitorFactory getMonitorFactory() {
+ return monitorFactory;
+ }
+
+ public void setMonitorFactory(MonitorFactory monitorFactory) {
+ this.monitorFactory = monitorFactory;
+ }
+
+ public ManagementService<?> getManagementService() {
+ return managementService;
+ }
+
+ public void setManagementService(ManagementService<?> managementService) {
+ this.managementService = managementService;
+ }
+
+ public void initialize() throws InitializationException {
+ // URI name = TUSCANY_SYSTEM_ROOT.resolve("main");
+ Bootstrapper bootstrapper = createBootstrapper();
+ Deployer deployer = bootstrapper.createDeployer();
+ registerSystemComponent(TUSCANY_DEPLOYER, Deployer.class, deployer);
+ registerSystemComponent(WORK_CONTEXT_URI, WorkContext.class, new SimpleWorkContext());
+
+ this.scopeRegistry = bootstrapper.getScopeRegistry();
+
+ LoaderRegistry loaderRegistry = (LoaderRegistry)((DeployerImpl)deployer).getLoader();
+ BuilderRegistry builderRegistry = (BuilderRegistry)((DeployerImpl)deployer).getBuilder();
+ activators = getInstances(getHostClassLoader(), ExtensionActivator.class);
+ for (ExtensionActivator activator : activators) {
+ activator.start(loaderRegistry, builderRegistry);
+ }
+
+ registerBaselineSystemComponents();
+ }
+
+ public void destroy() {
+ if (tuscanySystem != null) {
+ tuscanySystem.stop();
+ tuscanySystem = null;
+ }
+ if (systemComponent != null) {
+ systemComponent.stop();
+ systemComponent = null;
+ }
+ }
+
+ public ComponentContext getComponentContext(URI componentId) {
+ Component component = componentManager.getComponent(componentId);
+ if (component == null) {
+ return null;
+ }
+ return component.getComponentContext();
+ }
+
+ protected Bootstrapper createBootstrapper() {
+ TuscanyManagementService tms = (TuscanyManagementService)getManagementService();
+ resolver = new DefaultAutowireResolver();
+ componentManager = new ComponentManagerImpl(tms, resolver);
+ Connector connector = new ConnectorImpl(componentManager);
+ return new DefaultBootstrapper(getMonitorFactory(), xmlFactory, componentManager, resolver, connector);
+ }
+
+ protected void registerBaselineSystemComponents() throws InitializationException {
+ // register the RuntimeInfo provided by the host
+ registerSystemComponent(RUNTIME_INFO_URI, runtimeInfoType, runtimeInfo);
+
+ // register the MonitorFactory provided by the host
+ List<Class<?>> monitorServices = new ArrayList<Class<?>>();
+ monitorServices.add(MonitorFactory.class);
+ monitorServices.add(FormatterRegistry.class);
+ registerSystemComponent(MONITOR_URI, monitorServices, getMonitorFactory());
+
+ // register the ClassLoaderRegistry
+ registerSystemComponent(CLASSLOADER_REGISTRY_URI, ClassLoaderRegistry.class, classLoaderRegistry);
+
+ // register the ComponentManager to that the fabric can wire to it
+ registerSystemComponent(COMPONENT_MGR_URI, ComponentManager.class, componentManager);
+
+ // register the AutowireResolver
+ registerSystemComponent(AUTOWIRE_RESOLVER_URI, AutowireResolver.class, resolver);
+
+ // register the ScopeRegistry
+ registerSystemComponent(SCOPE_REGISTRY_URI, ScopeRegistry.class, scopeRegistry);
+ }
+
+ protected <S, I extends S> void registerSystemComponent(URI uri, Class<S> type, I component)
+ throws InitializationException {
+ try {
+ JavaServiceContract<S> contract = new JavaServiceContract<S>(type);
+ componentManager.registerJavaObject(uri, contract, component);
+ } catch (RegistrationException e) {
+ throw new InitializationException(e);
+ }
+ }
+
+ protected <I> void registerSystemComponent(URI uri, List<Class<?>> types, I component)
+ throws InitializationException {
+ try {
+ List<JavaServiceContract<?>> contracts = new ArrayList<JavaServiceContract<?>>();
+ for (Class<?> type : types) {
+ contracts.add(new JavaServiceContract(type));
+
+ }
+ componentManager.registerJavaObject(uri, contracts, component);
+ } catch (RegistrationException e) {
+ throw new InitializationException(e);
+ }
+ }
+
+ protected ComponentManager getComponentManager() {
+ return componentManager;
+ }
+
+ protected ScopeRegistry getScopeRegistry() {
+ return scopeRegistry;
+ }
+
+ protected WorkContext getWorkContext() {
+ try {
+ AtomicComponent component = (AtomicComponent)getComponentManager().getComponent(WORK_CONTEXT_URI);
+ return (WorkContext)component.getTargetInstance();
+ } catch (TargetResolutionException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ protected Deployer getDeployer() {
+ try {
+ AtomicComponent component = (AtomicComponent)getComponentManager().getComponent(TUSCANY_DEPLOYER);
+ return (Deployer)component.getTargetInstance();
+ } catch (TargetResolutionException e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ /**
+ * Read the service name from a configuration file
+ *
+ * @param classLoader
+ * @param name The name of the service class
+ * @return A class name which extends/implements the service class
+ * @throws IOException
+ */
+ private static Set<String> getServiceNames(ClassLoader classLoader, String name) throws IOException {
+ Set<String> set = new HashSet<String>();
+ Enumeration<URL> urls = classLoader.getResources("META-INF/services/" + name);
+ while (urls.hasMoreElements()) {
+ URL url = urls.nextElement();
+ String service = getServiceName(url);
+ if (service != null) {
+ set.add(service);
+
+ }
+ }
+ return set;
+ }
+
+ private static String getServiceName(URL url) throws IOException {
+ InputStream is = IOHelper.getInputStream(url);
+ BufferedReader reader = null;
+ try {
+ reader = new BufferedReader(new InputStreamReader(is));
+ while (true) {
+ String line = reader.readLine();
+ if (line == null) {
+ break;
+ } else if (!line.startsWith("#")) {
+ return line.trim();
+ }
+ }
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ return null;
+ }
+
+ private static <T> Collection<T> getInstances(final ClassLoader classLoader, Class<T> serviceClass) {
+ List<T> instances = new ArrayList<T>();
+ try {
+ Set<String> services = getServiceNames(classLoader, serviceClass.getName());
+ for (String className : services) {
+ Class cls = Class.forName(className, true, classLoader);
+ instances.add(serviceClass.cast(cls.newInstance())); // NOPMD
+ }
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ return instances;
+ }
+}