You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by rf...@apache.org on 2007/04/02 19:47:44 UTC
svn commit: r524852 - in
/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core:
bootstrap/ component/ deployer/ implementation/composite/ loader/ model/
runtime/ wire/
Author: rfeng
Date: Mon Apr 2 10:47:43 2007
New Revision: 524852
URL: http://svn.apache.org/viewvc?view=rev&rev=524852
Log:
Bring up the minicore
Added:
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java (with props)
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/CallableReferenceImpl.java
- copied unchanged from r521965, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/CallableReferenceImpl.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/CallbackReferenceImpl.java
- copied unchanged from r521965, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/CallbackReferenceImpl.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java
- copied, changed from r521965, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ServiceReferenceImpl.java
- copied unchanged from r521965, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ServiceReferenceImpl.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java
- copied unchanged from r521965, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/WorkContextImpl.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java (with props)
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java (with props)
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/
- copied from r523780, incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/loader/
Removed:
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/DependencyLoader.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/JNDIPropertyFactory.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/model/
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/wire/NonBlockingInterceptorGenerator.java
Modified:
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java
incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
Modified: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java?view=diff&rev=524852&r1=524851&r2=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java (original)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/Bootstrapper.java Mon Apr 2 10:47:43 2007
@@ -18,16 +18,12 @@
*/
package org.apache.tuscany.core.bootstrap;
+import org.apache.tuscany.core.resolver.AutowireResolver;
+import org.apache.tuscany.host.MonitorFactory;
import org.apache.tuscany.spi.builder.Connector;
+import org.apache.tuscany.spi.component.ComponentManager;
import org.apache.tuscany.spi.component.ScopeRegistry;
-import org.apache.tuscany.spi.component.WorkContext;
import org.apache.tuscany.spi.deployer.Deployer;
-import org.apache.tuscany.spi.implementation.java.Introspector;
-import org.apache.tuscany.spi.loader.Loader;
-import org.apache.tuscany.spi.loader.PropertyObjectFactory;
-
-import org.apache.tuscany.core.resolver.AutowireResolver;
-import org.apache.tuscany.host.MonitorFactory;
/**
* Interface that abstracts the process used to create a running Tuscany system. Implementation of this may provide
@@ -58,7 +54,7 @@
*
* @return a new primordial ScopeRegistry
*/
- ScopeRegistry createScopeRegistry();
+ ScopeRegistry getScopeRegistry();
/**
* Create a Connector that can wire together primordial components.
@@ -73,5 +69,7 @@
* @return the AutowireResolver that resolves autowire targets
*/
AutowireResolver getAutowireResolver();
+
+ ComponentManager getComponentManager();
}
Modified: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java?view=diff&rev=524852&r1=524851&r2=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java (original)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/DefaultBootstrapper.java Mon Apr 2 10:47:43 2007
@@ -22,10 +22,24 @@
import org.apache.tuscany.core.binding.local.LocalBindingBuilder;
import org.apache.tuscany.core.binding.local.LocalBindingDefinition;
+import org.apache.tuscany.core.binding.local.LocalBindingLoader;
import org.apache.tuscany.core.builder.BuilderRegistryImpl;
+import org.apache.tuscany.core.component.scope.AbstractScopeContainer;
import org.apache.tuscany.core.component.scope.CompositeScopeContainer;
+import org.apache.tuscany.core.component.scope.RequestScopeContainer;
import org.apache.tuscany.core.component.scope.ScopeRegistryImpl;
+import org.apache.tuscany.core.component.scope.StatelessScopeContainer;
import org.apache.tuscany.core.deployer.DeployerImpl;
+import org.apache.tuscany.core.implementation.composite.CompositeBuilder;
+import org.apache.tuscany.core.implementation.composite.CompositeComponentTypeLoader;
+import org.apache.tuscany.core.implementation.composite.CompositeLoader;
+import org.apache.tuscany.core.loader.ComponentLoader;
+import org.apache.tuscany.core.loader.ComponentTypeElementLoader;
+import org.apache.tuscany.core.loader.IncludeLoader;
+import org.apache.tuscany.core.loader.LoaderRegistryImpl;
+import org.apache.tuscany.core.loader.PropertyLoader;
+import org.apache.tuscany.core.loader.ReferenceLoader;
+import org.apache.tuscany.core.loader.ServiceLoader;
import org.apache.tuscany.core.resolver.AutowireResolver;
import org.apache.tuscany.host.MonitorFactory;
import org.apache.tuscany.spi.builder.Builder;
@@ -35,12 +49,16 @@
import org.apache.tuscany.spi.component.ScopeRegistry;
import org.apache.tuscany.spi.deployer.Deployer;
import org.apache.tuscany.spi.extension.LoaderExtension;
+import org.apache.tuscany.spi.implementation.java.Introspector;
+import org.apache.tuscany.spi.loader.Loader;
import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.loader.PropertyObjectFactory;
+import org.apache.tuscany.spi.model.CompositeImplementation;
/**
- * A default implementation of a Bootstrapper. Please see the documentation on the individual methods for how the
- * primordial components are created.
- *
+ * A default implementation of a Bootstrapper. Please see the documentation on
+ * the individual methods for how the primordial components are created.
+ *
* @version $Rev$ $Date$
*/
public class DefaultBootstrapper implements Bootstrapper {
@@ -53,32 +71,31 @@
/**
* Create a default bootstrapper.
- *
- * @param monitorFactory the MonitorFactory to be used to create monitors for the primordial components
- * @param xmlFactory the XMLInputFactory to be used by the components to load XML artifacts
+ *
+ * @param monitorFactory the MonitorFactory to be used to create monitors
+ * for the primordial components
+ * @param xmlFactory the XMLInputFactory to be used by the components to
+ * load XML artifacts
* @param componentManager the component manager for the runtime instance
- * @param resolver the autowire resolver for the runtime instance
- * @param connector the connector for the runtime instance
- * @param scopeRegistry the scope registry for the runtime instance
+ * @param resolver the autowire resolver for the runtime instance
+ * @param connector the connector for the runtime instance
*/
public DefaultBootstrapper(MonitorFactory monitorFactory,
XMLInputFactory xmlFactory,
ComponentManager componentManager,
AutowireResolver resolver,
- Connector connector,
- ScopeRegistry scopeRegistry
- ) {
+ Connector connector) {
this.monitorFactory = monitorFactory;
this.xmlFactory = xmlFactory;
this.componentManager = componentManager;
this.resolver = resolver;
this.connector = connector;
- this.scopeRegistry = scopeRegistry;
+ this.scopeRegistry = createScopeRegistry();
}
/**
* Returns the MonitorFactory being used by this bootstrapper.
- *
+ *
* @return the MonitorFactory being used by this bootstrapper
*/
public MonitorFactory getMonitorFactory() {
@@ -86,71 +103,122 @@
}
/**
- * Create primordial deployer that can be used to load the system definition.
- *
+ * Create primordial deployer that can be used to load the system
+ * definition.
+ *
* @return the primordial deployer
*/
public Deployer createDeployer() {
+ ScopeRegistry scopeRegistry = getScopeRegistry();
Builder builder = createBuilder(scopeRegistry);
- DeployerImpl deployer = new DeployerImpl(xmlFactory, builder, componentManager, resolver, connector);
+ Loader loader = createLoader(null, null);
+ DeployerImpl deployer = new DeployerImpl(xmlFactory, loader, builder, componentManager, resolver, connector);
deployer.setMonitor(getMonitorFactory().getMonitor(ScopeContainerMonitor.class));
- deployer.setScopeRegistry(scopeRegistry);
+ deployer.setScopeRegistry(getScopeRegistry());
return deployer;
}
/**
- * Create a basic ScopeRegistry containing the ScopeContainers that are available to components in the system
- * definition. The implementation returned only support COMPOSITE scope.
- *
+ * Create a basic ScopeRegistry containing the ScopeContainers that are
+ * available to components in the system definition. The implementation
+ * returned only support COMPOSITE scope.
+ *
* @return a new ScopeRegistry
*/
- public ScopeRegistry createScopeRegistry() {
+ private ScopeRegistry createScopeRegistry() {
ScopeRegistry scopeRegistry = new ScopeRegistryImpl();
- CompositeScopeContainer scopeContainer =
- new CompositeScopeContainer(monitorFactory.getMonitor(ScopeContainerMonitor.class));
- scopeContainer.start();
- scopeRegistry.register(scopeContainer);
+ ScopeContainerMonitor monitor = monitorFactory.getMonitor(ScopeContainerMonitor.class);
+ AbstractScopeContainer[] containers = new AbstractScopeContainer[] {new CompositeScopeContainer(monitor),
+ new StatelessScopeContainer(monitor),
+ new RequestScopeContainer(monitor),
+ // new ConversationalScopeContainer(monitor),
+ // new HttpSessionScopeContainer(monitor)
+ };
+ for (AbstractScopeContainer c : containers) {
+ c.start();
+ scopeRegistry.register(c);
+ }
+
return scopeRegistry;
}
-
/**
- * Create a new Connector that can be used to wire primordial components together.
- *
+ * Create a new Connector that can be used to wire primordial components
+ * together.
+ *
* @return a new Connector
*/
public Connector getConnector() {
return connector;
}
-
public AutowireResolver getAutowireResolver() {
return resolver;
}
/**
- * Helper method for registering a loader with the registry. The Loader is registered once for the QName returned by
- * its {@link LoaderExtension#getXMLType()} method.
- *
+ * Helper method for registering a loader with the registry. The Loader is
+ * registered once for the QName returned by its
+ * {@link LoaderExtension#getXMLType()} method.
+ *
* @param registry the LoaderRegistry to register with
- * @param loader the Loader to register
+ * @param loader the Loader to register
*/
protected void registerLoader(LoaderRegistry registry, LoaderExtension<?> loader) {
registry.registerLoader(loader.getXMLType(), loader);
}
+ public LoaderRegistry createLoader(PropertyObjectFactory propertyFactory, Introspector introspector) {
+ LoaderRegistryImpl loaderRegistry = new LoaderRegistryImpl(monitorFactory
+ .getMonitor(LoaderRegistryImpl.Monitor.class));
+
+ // register element loaders
+ registerLoader(loaderRegistry, new ComponentLoader(loaderRegistry, propertyFactory));
+ registerLoader(loaderRegistry, new ComponentTypeElementLoader(loaderRegistry));
+ registerLoader(loaderRegistry, new CompositeLoader(loaderRegistry, null));
+ registerLoader(loaderRegistry, new IncludeLoader(loaderRegistry));
+ registerLoader(loaderRegistry, new PropertyLoader(loaderRegistry));
+ registerLoader(loaderRegistry, new ReferenceLoader(loaderRegistry));
+ registerLoader(loaderRegistry, new ServiceLoader(loaderRegistry));
+ registerLoader(loaderRegistry, new LocalBindingLoader(loaderRegistry));
+
+ loaderRegistry.registerLoader(CompositeImplementation.class, new CompositeComponentTypeLoader(loaderRegistry));
+ return loaderRegistry;
+ }
+
/**
- * Create a Builder that can be used to build the components in the system definition. The default implementation
- * only supports implementations from the system programming model.
- *
- * @param scopeRegistry the ScopeRegistry defining the component scopes that will be supported
+ * Create a Builder that can be used to build the components in the system
+ * definition. The default implementation only supports implementations from
+ * the system programming model.
+ *
+ * @param scopeRegistry the ScopeRegistry defining the component scopes that
+ * will be supported
* @return a new Builder
*/
private Builder createBuilder(ScopeRegistry scopeRegistry) {
- BuilderRegistryImpl builderRegistry =
- new BuilderRegistryImpl(scopeRegistry);
+ BuilderRegistryImpl builderRegistry = new BuilderRegistryImpl(scopeRegistry);
+ CompositeBuilder compositeBuilder = new CompositeBuilder();
+ compositeBuilder.setBuilderRegistry(builderRegistry);
+ compositeBuilder.setScopeRegistry(scopeRegistry);
+ compositeBuilder.init();
+ // builderRegistry.register(CompositeImplementation.class,
+ // compositeBuilder);
builderRegistry.register(LocalBindingDefinition.class, new LocalBindingBuilder());
return builderRegistry;
+ }
+
+ /**
+ * @return the componentManager
+ */
+ public ComponentManager getComponentManager() {
+ return componentManager;
+ }
+
+ /**
+ * @return the scopeRegistry
+ */
+ public ScopeRegistry getScopeRegistry() {
+ return scopeRegistry;
}
}
Added: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java?view=auto&rev=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java (added)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java Mon Apr 2 10:47:43 2007
@@ -0,0 +1,31 @@
+/*
+ * 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.bootstrap;
+
+import org.apache.tuscany.spi.builder.BuilderRegistry;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface ExtensionActivator {
+ void start(LoaderRegistry loaderRegistry, BuilderRegistry builderRegistry);
+ void stop();
+}
Propchange: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/bootstrap/ExtensionActivator.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Copied: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java (from r521965, incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java)
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java?view=diff&rev=524852&p1=incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java&r1=521965&p2=incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java&r2=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java (original)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/component/ComponentContextImpl.java Mon Apr 2 10:47:43 2007
@@ -25,6 +25,9 @@
import org.osoa.sca.ServiceRuntimeException;
import org.apache.tuscany.api.TuscanyRuntimeException;
+import org.apache.tuscany.spi.ObjectFactory;
+import org.apache.tuscany.spi.component.AtomicComponent;
+import org.apache.tuscany.spi.component.Component;
/**
* Implementation of ComponentContext that delegates to a ComponentContextProvider.
@@ -79,7 +82,9 @@
}
public <B> ServiceReference<B> createSelfReference(Class<B> businessInterface) {
- return null;
+ // FIXME: How to get the ObjectFactory?
+ ObjectFactory<B> factory = ((AtomicComponent) component).createObjectFactory();
+ return new ServiceReferenceImpl<B>(businessInterface, factory);
}
public <B> ServiceReference<B> createSelfReference(Class<B> businessInterface, String serviceName) {
Modified: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java?view=diff&rev=524852&r1=524851&r2=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java (original)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/deployer/DeployerImpl.java Mon Apr 2 10:47:43 2007
@@ -55,20 +55,24 @@
*/
public class DeployerImpl implements Deployer {
private XMLInputFactory xmlFactory;
+ private Loader loader;
private Builder builder;
private ScopeContainerMonitor monitor;
private AutowireResolver resolver;
private Connector connector;
private ComponentManager componentManager;
private ScopeRegistry scopeRegistry;
+
public DeployerImpl(XMLInputFactory xmlFactory,
+ Loader loader,
Builder builder,
ComponentManager componentManager,
AutowireResolver resolver,
Connector connector) {
this.xmlFactory = xmlFactory;
this.builder = builder;
+ this.loader = loader;
this.componentManager = componentManager;
this.resolver = resolver;
this.connector = connector;
@@ -117,6 +121,7 @@
DeploymentContext deploymentContext =
new RootDeploymentContext(null, null, groupId, xmlFactory, scopeContainer, false);
// load the model
+ load(parent, componentDefinition, deploymentContext);
// resolve autowires
resolver.resolve(null, componentDefinition);
// build runtime artifacts
@@ -145,6 +150,20 @@
connector.connect(componentDefinition);
return components;
}
+
+ /**
+ * Load the componentDefinition type information for the componentDefinition being deployed. For a typical
+ * deployment this will result in the SCDL definition being loaded.
+ *
+ * @param componentDefinition the componentDefinition being deployed
+ * @param deploymentContext the current deployment context
+ */
+ protected <I extends Implementation<?>> void load(Component parent,
+ ComponentDefinition<I> componentDefinition,
+ DeploymentContext deploymentContext) throws LoaderException {
+ loader.loadComponentType(componentDefinition.getImplementation(), deploymentContext);
+ }
+
/**
* Build the runtime context for a loaded componentDefinition.
@@ -159,6 +178,20 @@
DeploymentContext deploymentContext)
throws BuilderException {
return builder.build(componentDefinition, deploymentContext);
+ }
+
+ /**
+ * @return the builder
+ */
+ public Builder getBuilder() {
+ return builder;
+ }
+
+ /**
+ * @return the loader
+ */
+ public Loader getLoader() {
+ return loader;
}
}
Added: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java?view=auto&rev=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java (added)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java Mon Apr 2 10:47:43 2007
@@ -0,0 +1,65 @@
+/*
+ * 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.implementation.composite;
+
+import java.net.URI;
+import java.net.URL;
+
+import org.apache.tuscany.spi.deployer.CompositeClassLoader;
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.extension.ComponentTypeLoaderExtension;
+import org.apache.tuscany.spi.loader.LoaderException;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.model.CompositeComponentType;
+import org.apache.tuscany.spi.model.CompositeImplementation;
+
+import org.apache.tuscany.core.deployer.ChildDeploymentContext;
+
+/**
+ * Loads a composite component type
+ *
+ * @version $Rev$ $Date$
+ */
+public class CompositeComponentTypeLoader extends ComponentTypeLoaderExtension<CompositeImplementation> {
+ public CompositeComponentTypeLoader() {
+ }
+
+ public CompositeComponentTypeLoader(LoaderRegistry loaderRegistry) {
+ super(loaderRegistry);
+ }
+
+ protected Class<CompositeImplementation> getImplementationClass() {
+ return CompositeImplementation.class;
+ }
+
+ public void load(CompositeImplementation implementation, DeploymentContext context) throws LoaderException {
+ URL scdlLocation = implementation.getScdlLocation();
+ ClassLoader cl = new CompositeClassLoader(null, implementation.getClassLoader());
+ URI componentId = URI.create(context.getComponentId().toString() + '/');
+ DeploymentContext childContext =
+ new ChildDeploymentContext(context, cl, scdlLocation, componentId, context.isAutowire());
+ CompositeComponentType componentType = loadFromSidefile(scdlLocation, childContext);
+ implementation.setComponentType(componentType);
+ }
+
+ protected CompositeComponentType loadFromSidefile(URL url, DeploymentContext deploymentContext)
+ throws LoaderException {
+ return loaderRegistry.load(null, url, CompositeComponentType.class, deploymentContext);
+ }
+}
Propchange: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeComponentTypeLoader.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Added: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java?view=auto&rev=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java (added)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java Mon Apr 2 10:47:43 2007
@@ -0,0 +1,224 @@
+/*
+ * 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.implementation.composite;
+
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+import static org.osoa.sca.Constants.SCA_NS;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.tuscany.spi.deployer.DeploymentContext;
+import org.apache.tuscany.spi.extension.LoaderExtension;
+import org.apache.tuscany.spi.loader.InvalidServiceException;
+import org.apache.tuscany.spi.loader.InvalidWireException;
+import org.apache.tuscany.spi.loader.LoaderException;
+import org.apache.tuscany.spi.loader.LoaderRegistry;
+import org.apache.tuscany.spi.model.ComponentDefinition;
+import org.apache.tuscany.spi.model.ComponentType;
+import org.apache.tuscany.spi.model.CompositeComponentType;
+import org.apache.tuscany.spi.model.Implementation;
+import org.apache.tuscany.spi.model.Include;
+import org.apache.tuscany.spi.model.ModelObject;
+import org.apache.tuscany.spi.model.Property;
+import org.apache.tuscany.spi.model.ReferenceDefinition;
+import org.apache.tuscany.spi.model.ReferenceTarget;
+import org.apache.tuscany.spi.model.ServiceDefinition;
+import org.apache.tuscany.spi.model.WireDefinition;
+import org.apache.tuscany.spi.services.artifact.ArtifactRepository;
+import org.osoa.sca.annotations.Reference;
+
+/**
+ * Loads a composite component definition from an XML-based assembly file
+ *
+ * @version $Rev$ $Date$
+ */
+public class CompositeLoader extends LoaderExtension<CompositeComponentType> {
+ public static final QName COMPOSITE = new QName(SCA_NS, "composite");
+ public static final String URI_DELIMITER = "/";
+
+ private final ArtifactRepository artifactRepository;
+
+ public CompositeLoader(@Reference
+ LoaderRegistry registry, @Reference
+ ArtifactRepository artifactRepository) {
+ super(registry);
+ this.artifactRepository = artifactRepository;
+ }
+
+ public QName getXMLType() {
+ return COMPOSITE;
+ }
+
+ public CompositeComponentType load(ModelObject object, XMLStreamReader reader, DeploymentContext deploymentContext)
+ throws XMLStreamException, LoaderException {
+
+ String name = reader.getAttributeValue(null, "name");
+ String targetNamespace = reader.getAttributeValue(null, "targetNamespace");
+ boolean autowire = Boolean.parseBoolean(reader.getAttributeValue(null, "autowire"));
+
+ CompositeComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> type = new CompositeComponentType<ServiceDefinition, ReferenceDefinition, Property<?>>(
+ new QName(
+ targetNamespace,
+ name));
+ type.setAutowire(autowire);
+ boolean done = false;
+ while (!done) {
+ switch (reader.next()) {
+ case START_ELEMENT:
+ boolean oldAutowire = deploymentContext.isAutowire();
+ deploymentContext.setAutowire(autowire);
+ ModelObject o = registry.load(type, reader, deploymentContext);
+ deploymentContext.setAutowire(oldAutowire);
+ if (o instanceof ServiceDefinition) {
+ type.add((ServiceDefinition)o);
+ } else if (o instanceof ReferenceDefinition) {
+ type.add((ReferenceDefinition)o);
+ } else if (o instanceof Property<?>) {
+ type.add((Property<?>)o);
+ } else if (o instanceof ComponentDefinition<?>) {
+ type.add((ComponentDefinition<?>)o);
+ } else if (o instanceof Include) {
+ type.add((Include)o);
+ } else if (o instanceof WireDefinition) {
+ type.add((WireDefinition)o);
+ } else {
+ // add as an unknown model extension
+ if (o != null) {
+ type.getExtensions().put(o.getClass(), o);
+ }
+ }
+ reader.next();
+ break;
+ case END_ELEMENT:
+ if (COMPOSITE.equals(reader.getName())) {
+ // if there are wire defintions then link them up to the
+ // relevant components
+ resolveWires(type);
+ verifyCompositeCompleteness(type);
+ done = true;
+ break;
+ }
+ }
+ }
+ for (ComponentDefinition<? extends Implementation<?>> c : type.getComponents().values()) {
+ // PropertyHelper.processProperties(type, c, deploymentContext);
+ }
+ return type;
+ }
+
+ protected void resolveWires(CompositeComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> composite)
+ throws InvalidWireException {
+ ComponentDefinition componentDefinition;
+ ServiceDefinition serviceDefinition;
+ List<WireDefinition> wireDefns = composite.getDeclaredWires();
+ for (WireDefinition wire : wireDefns) {
+ URI targetUri = wire.getTarget();
+ // validate the target before finding the source
+ validateTarget(targetUri, composite);
+
+ String sourceName = wire.getSource().getPath(); // new
+ // QualifiedName(wire.getSource().getPath());
+ serviceDefinition = composite.getDeclaredServices().get(sourceName);
+ if (serviceDefinition != null) {
+ serviceDefinition.setTarget(wire.getTarget());
+ } else {
+ componentDefinition = composite.getDeclaredComponents().get(sourceName);
+ if (componentDefinition != null) {
+ if (wire.getSource().getFragment() == null) {
+ throw new InvalidWireException("Source reference not specified", sourceName);
+ }
+ URI referenceName = URI.create(wire.getSource().getFragment());
+ ReferenceTarget referenceTarget = createReferenceTarget(referenceName,
+ targetUri,
+ componentDefinition);
+ componentDefinition.add(referenceTarget);
+ } else {
+ throw new InvalidWireException("Source not found", sourceName);
+ }
+ }
+ }
+ }
+
+ private ReferenceTarget createReferenceTarget(URI componentReferenceName,
+ URI target,
+ ComponentDefinition componentDefn) throws InvalidWireException {
+ ComponentType componentType = componentDefn.getImplementation().getComponentType();
+ if (componentReferenceName == null) {
+ // if there is ambiguity in determining the source of the wire or
+ // there is no reference to be wired
+ if (componentType.getReferences().size() > 1 || componentType.getReferences().isEmpty()) {
+ throw new InvalidWireException("Unable to determine unique source reference");
+ } else {
+ Map references = componentType.getReferences();
+ ReferenceDefinition definition = (ReferenceDefinition)references.values().iterator().next();
+ componentReferenceName = definition.getUri();
+ }
+ }
+
+ ReferenceTarget referenceTarget = new ReferenceTarget();
+ referenceTarget.setReferenceName(componentReferenceName);
+ referenceTarget.addTarget(target);
+ return referenceTarget;
+ }
+
+ protected void verifyCompositeCompleteness(CompositeComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> composite)
+ throws InvalidServiceException {
+ // check if all of the composite services have been wired
+ for (ServiceDefinition svcDefn : composite.getDeclaredServices().values()) {
+ if (svcDefn.getTarget() == null) {
+ String identifier = svcDefn.getUri().toString();
+ throw new InvalidServiceException("Composite service not wired to a target", identifier);
+ }
+ }
+ }
+
+ private void validateTarget(URI target,
+ CompositeComponentType<ServiceDefinition, ReferenceDefinition, Property<?>> composite)
+ throws InvalidWireException {
+ // if target is not a reference of the composite
+ String targetName = target.getPath();
+ if (composite.getReferences().get(targetName) == null) {
+ ComponentDefinition<?> targetDefinition = composite.getDeclaredComponents().get(targetName);
+ // if a target component exists in this composite
+ if (targetDefinition != null) {
+ Implementation<?> implementation = targetDefinition.getImplementation();
+ ComponentType<?, ?, ?> componentType = implementation.getComponentType();
+ Map<String, ? extends ServiceDefinition> services = componentType.getServices();
+ if (target.getFragment() == null) {
+ if (services.size() > 1 || services.isEmpty()) {
+ throw new InvalidWireException("Ambiguous target", target.toString());
+ }
+ } else {
+ if (services.get(target.getFragment()) == null) {
+ throw new InvalidWireException("Invalid target service", target.toString());
+ }
+ }
+ } else {
+ throw new InvalidWireException("Target not found", target.toString());
+ }
+ }
+ }
+}
Propchange: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/implementation/composite/CompositeLoader.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java?view=diff&rev=524852&r1=523780&r2=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java (original)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/loader/ComponentLoader.java Mon Apr 2 10:47:43 2007
@@ -18,30 +18,30 @@
*/
package org.apache.tuscany.core.loader;
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+import static org.osoa.sca.Constants.SCA_NS;
+
import java.lang.reflect.Type;
import java.net.URI;
-import java.net.URL;
import java.net.URISyntaxException;
+import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
+
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
-import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
-import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
-import org.w3c.dom.Document;
-import static org.osoa.sca.Constants.SCA_NS;
-import org.osoa.sca.annotations.Constructor;
-import org.osoa.sca.annotations.Reference;
-
+import org.apache.tuscany.core.binding.local.LocalBindingDefinition;
+import org.apache.tuscany.core.deployer.ChildDeploymentContext;
import org.apache.tuscany.spi.ObjectFactory;
import org.apache.tuscany.spi.QualifiedName;
-import org.apache.tuscany.spi.databinding.extension.DOMHelper;
import org.apache.tuscany.spi.deployer.DeploymentContext;
import org.apache.tuscany.spi.extension.LoaderExtension;
import org.apache.tuscany.spi.loader.InvalidReferenceException;
@@ -69,10 +69,9 @@
import org.apache.tuscany.spi.model.ReferenceDefinition;
import org.apache.tuscany.spi.model.ReferenceTarget;
import org.apache.tuscany.spi.model.ServiceDefinition;
-
-import org.apache.tuscany.core.binding.local.LocalBindingDefinition;
-import org.apache.tuscany.core.deployer.ChildDeploymentContext;
-import org.apache.tuscany.core.property.SimplePropertyObjectFactory;
+import org.osoa.sca.annotations.Constructor;
+import org.osoa.sca.annotations.Reference;
+import org.w3c.dom.Document;
/**
* Loads a component definition from an XML-based assembly file
@@ -220,7 +219,7 @@
LoaderUtil.skipToEndElement(reader);
} else {
try {
- DocumentBuilder documentBuilder = DOMHelper.newDocumentBuilder();
+ DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document value = PropertyUtils.createPropertyValue(reader, property.getXmlType(), documentBuilder);
propertyValue = new PropertyValue<Type>(name, value);
} catch (ParserConfigurationException e) {
@@ -302,8 +301,8 @@
PropertyValue propertyValue = new PropertyValue();
propertyValue.setName(aProperty.getName());
propertyValue.setValue(aProperty.getDefaultValue());
- propertyValue.setValueFactory(new SimplePropertyObjectFactory(aProperty,
- propertyValue.getValue()));
+// propertyValue.setValueFactory(new SimplePropertyObjectFactory(aProperty,
+// propertyValue.getValue()));
propertyValues.put(aProperty.getName(), propertyValue);
}
}
Modified: incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java?view=diff&rev=524852&r1=524851&r2=524852
==============================================================================
--- incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java (original)
+++ incubator/tuscany/sandbox/rfeng/minicore/src/main/java/org/apache/tuscany/core/runtime/AbstractRuntime.java Mon Apr 2 10:47:43 2007
@@ -22,43 +22,54 @@
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.GroupInitializationException;
import org.apache.tuscany.spi.component.RegistrationException;
-import org.apache.tuscany.spi.component.ScopeContainer;
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.model.Scope;
+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;
@@ -120,6 +131,7 @@
protected Component tuscanySystem;
protected ScopeRegistry scopeRegistry;
+ protected Collection<ExtensionActivator> activators;
protected AbstractRuntime(Class<I> runtimeInfoType) {
this(runtimeInfoType, new NullMonitorFactory());
@@ -190,19 +202,22 @@
}
public void initialize() throws InitializationException {
- URI name = TUSCANY_SYSTEM_ROOT.resolve("main");
+ // 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();
-
- systemComponent = componentManager.getComponent(name);
- URI uri = systemComponent.getUri();
- ScopeContainer scopeContainer = scopeRegistry.getScopeContainer(Scope.COMPOSITE);
- try {
- scopeContainer.startContext(uri, uri);
- } catch (GroupInitializationException e) {
- throw new InitializationException(e);
- }
}
public void destroy() {
@@ -229,14 +244,7 @@
resolver = new DefaultAutowireResolver();
componentManager = new ComponentManagerImpl(tms, resolver);
Connector connector = new ConnectorImpl(componentManager);
-
- scopeRegistry = new ScopeRegistryImpl();
- CompositeScopeContainer scopeContainer = new CompositeScopeContainer(monitorFactory
- .getMonitor(ScopeContainerMonitor.class));
- scopeContainer.start();
- scopeRegistry.register(scopeContainer);
- return new DefaultBootstrapper(getMonitorFactory(), xmlFactory, componentManager, resolver, connector,
- scopeRegistry);
+ return new DefaultBootstrapper(getMonitorFactory(), xmlFactory, componentManager, resolver, connector);
}
protected void registerBaselineSystemComponents() throws InitializationException {
@@ -310,5 +318,62 @@
} 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;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org