blob: afe3482d4d21cab33a4f5e2c31e2a6afefda474a [file] [log] [blame]
/*
* 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.sca.host.embedded.impl;
import java.io.IOException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.List;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.transform.TransformerFactory;
import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.Composite;
import org.apache.tuscany.sca.assembly.EndpointFactory;
import org.apache.tuscany.sca.assembly.SCABindingFactory;
import org.apache.tuscany.sca.assembly.builder.CompositeBuilder;
import org.apache.tuscany.sca.assembly.builder.impl.CompositeBuilderImpl;
import org.apache.tuscany.sca.assembly.xml.CompositeDocumentProcessor;
import org.apache.tuscany.sca.context.ContextFactoryExtensionPoint;
import org.apache.tuscany.sca.context.RequestContextFactory;
import org.apache.tuscany.sca.contribution.ContributionFactory;
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.DefaultValidatingXMLInputFactory;
import org.apache.tuscany.sca.contribution.processor.DefaultValidationSchemaExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.ExtensiblePackageProcessor;
import org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor;
import org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor;
import org.apache.tuscany.sca.contribution.processor.PackageProcessor;
import org.apache.tuscany.sca.contribution.processor.PackageProcessorExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.ValidationSchemaExtensionPoint;
import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint;
import org.apache.tuscany.sca.contribution.service.ContributionListenerExtensionPoint;
import org.apache.tuscany.sca.contribution.service.ContributionRepository;
import org.apache.tuscany.sca.contribution.service.ContributionService;
import org.apache.tuscany.sca.contribution.service.ExtensibleContributionListener;
import org.apache.tuscany.sca.contribution.service.TypeDescriber;
import org.apache.tuscany.sca.contribution.service.impl.ContributionRepositoryImpl;
import org.apache.tuscany.sca.contribution.service.impl.ContributionServiceImpl;
import org.apache.tuscany.sca.contribution.service.impl.PackageTypeDescriberImpl;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.UtilityExtensionPoint;
import org.apache.tuscany.sca.core.assembly.ActivationException;
import org.apache.tuscany.sca.core.assembly.CompositeActivator;
import org.apache.tuscany.sca.core.assembly.CompositeActivatorImpl;
import org.apache.tuscany.sca.core.conversation.ConversationManager;
import org.apache.tuscany.sca.core.invocation.ExtensibleWireProcessor;
import org.apache.tuscany.sca.core.invocation.ProxyFactory;
import org.apache.tuscany.sca.core.scope.CompositeScopeContainerFactory;
import org.apache.tuscany.sca.core.scope.ConversationalScopeContainerFactory;
import org.apache.tuscany.sca.core.scope.RequestScopeContainerFactory;
import org.apache.tuscany.sca.core.scope.ScopeContainerFactory;
import org.apache.tuscany.sca.core.scope.ScopeRegistry;
import org.apache.tuscany.sca.core.scope.ScopeRegistryImpl;
import org.apache.tuscany.sca.core.scope.StatelessScopeContainerFactory;
import org.apache.tuscany.sca.definitions.SCADefinitions;
import org.apache.tuscany.sca.endpointresolver.EndpointResolverFactoryExtensionPoint;
import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper;
import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory;
import org.apache.tuscany.sca.invocation.MessageFactory;
import org.apache.tuscany.sca.monitor.Monitor;
import org.apache.tuscany.sca.monitor.MonitorFactory;
import org.apache.tuscany.sca.policy.IntentAttachPointTypeFactory;
import org.apache.tuscany.sca.policy.PolicyFactory;
import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint;
import org.apache.tuscany.sca.runtime.RuntimeWireProcessor;
import org.apache.tuscany.sca.runtime.RuntimeWireProcessorExtensionPoint;
import org.apache.tuscany.sca.work.WorkScheduler;
/**
*
* @version $Rev$ $Date$
*/
public class ReallySmallRuntimeBuilder {
// private static final Logger logger = Logger.getLogger(ReallySmallRuntimeBuilder.class.getName());
public static CompositeActivator createCompositeActivator(ExtensionPointRegistry registry,
AssemblyFactory assemblyFactory,
MessageFactory messageFactory,
SCABindingFactory scaBindingFactory,
InterfaceContractMapper mapper,
ProxyFactory proxyFactory,
ScopeRegistry scopeRegistry,
WorkScheduler workScheduler) {
// Create a wire post processor extension point
RuntimeWireProcessorExtensionPoint wireProcessors =
registry.getExtensionPoint(RuntimeWireProcessorExtensionPoint.class);
RuntimeWireProcessor wireProcessor = new ExtensibleWireProcessor(wireProcessors);
// Retrieve the processors extension point
StAXArtifactProcessorExtensionPoint processors =
registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
// Create a provider factory extension point
ProviderFactoryExtensionPoint providerFactories =
registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);
// Create a endpoint resolver factory extension point
EndpointResolverFactoryExtensionPoint endpointResolverFactories =
registry.getExtensionPoint(EndpointResolverFactoryExtensionPoint.class);
JavaInterfaceFactory javaInterfaceFactory =
registry.getExtensionPoint(ModelFactoryExtensionPoint.class).getFactory(JavaInterfaceFactory.class);
RequestContextFactory requestContextFactory =
registry.getExtensionPoint(ContextFactoryExtensionPoint.class).getFactory(RequestContextFactory.class);
UtilityExtensionPoint utilities = registry.getExtensionPoint(UtilityExtensionPoint.class);
ConversationManager conversationManager = utilities.getUtility(ConversationManager.class);
MonitorFactory monitorFactory = utilities.getUtility(MonitorFactory.class);
Monitor monitor = monitorFactory.createMonitor();
// Create the composite activator
CompositeActivator compositeActivator =
new CompositeActivatorImpl(assemblyFactory, messageFactory, javaInterfaceFactory, scaBindingFactory,
mapper, scopeRegistry, workScheduler, wireProcessor, requestContextFactory,
proxyFactory, providerFactories, endpointResolverFactories, processors, conversationManager, monitor);
return compositeActivator;
}
public static CompositeBuilder createCompositeBuilder(Monitor monitor,
AssemblyFactory assemblyFactory,
SCABindingFactory scaBindingFactory,
EndpointFactory endpointFactory,
IntentAttachPointTypeFactory intentAttachPointTypeFactory,
DocumentBuilderFactory documentBuilderFactory,
TransformerFactory transformerFactory,
InterfaceContractMapper interfaceContractMapper,
SCADefinitions policyDefinitions) {
return new CompositeBuilderImpl(assemblyFactory,
endpointFactory,
scaBindingFactory,
intentAttachPointTypeFactory,
documentBuilderFactory,
transformerFactory,
interfaceContractMapper,
policyDefinitions,
monitor);
}
/**
* Create the contribution service used by this domain.
*
* @throws ActivationException
*/
public static ContributionService createContributionService(ClassLoader classLoader,
ExtensionPointRegistry registry,
ContributionFactory contributionFactory,
AssemblyFactory assemblyFactory,
PolicyFactory policyFactory,
InterfaceContractMapper mapper,
List<SCADefinitions> policyDefinitions,
ModelResolver policyDefinitionResolver,
Monitor monitor)
throws ActivationException {
// Get the model factory extension point
ModelFactoryExtensionPoint modelFactories = registry.getExtensionPoint(ModelFactoryExtensionPoint.class);
// Create a new XML input factory
// Allow privileged access to factory. Requires RuntimePermission in security policy file.
XMLInputFactory inputFactory = AccessController.doPrivileged(new PrivilegedAction<XMLInputFactory>() {
public XMLInputFactory run() {
return XMLInputFactory.newInstance();
}
});
modelFactories.addFactory(inputFactory);
// Create a validation XML schema extension point
ValidationSchemaExtensionPoint schemas = new DefaultValidationSchemaExtensionPoint();
// Create a validating XML input factory
XMLInputFactory validatingInputFactory = new DefaultValidatingXMLInputFactory(inputFactory, schemas, monitor);
modelFactories.addFactory(validatingInputFactory);
// Create StAX artifact processor extension point
StAXArtifactProcessorExtensionPoint staxProcessors =
registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);
// Create and register StAX processors for SCA assembly XML
// Allow privileged access to factory. Requires RuntimePermission in security policy file.
XMLOutputFactory outputFactory = AccessController.doPrivileged(new PrivilegedAction<XMLOutputFactory>() {
public XMLOutputFactory run() {
return XMLOutputFactory.newInstance();
}
});
ExtensibleStAXArtifactProcessor staxProcessor =
new ExtensibleStAXArtifactProcessor(staxProcessors, inputFactory, outputFactory, monitor);
// Create URL artifact processor extension point
URLArtifactProcessorExtensionPoint documentProcessors =
registry.getExtensionPoint(URLArtifactProcessorExtensionPoint.class);
// Create and register document processors for SCA assembly XML
documentProcessors.getProcessor(Composite.class);
DocumentBuilderFactory documentBuilderFactory = AccessController.doPrivileged(new PrivilegedAction<DocumentBuilderFactory>() {
public DocumentBuilderFactory run() {
return DocumentBuilderFactory.newInstance();
}
});
documentProcessors.addArtifactProcessor(new CompositeDocumentProcessor(staxProcessor, validatingInputFactory, documentBuilderFactory, policyDefinitions, monitor));
// Create Model Resolver extension point
ModelResolverExtensionPoint modelResolvers = registry.getExtensionPoint(ModelResolverExtensionPoint.class);
// Create contribution package processor extension point
TypeDescriber describer = new PackageTypeDescriberImpl();
PackageProcessor packageProcessor =
new ExtensiblePackageProcessor(registry.getExtensionPoint(PackageProcessorExtensionPoint.class), describer, monitor);
// Create contribution listener
ExtensibleContributionListener contributionListener =
new ExtensibleContributionListener(registry.getExtensionPoint(ContributionListenerExtensionPoint.class));
// Create a contribution repository
ContributionRepository repository;
try {
repository = new ContributionRepositoryImpl("target", inputFactory, monitor);
} catch (IOException e) {
throw new ActivationException(e);
}
ExtensibleURLArtifactProcessor documentProcessor = new ExtensibleURLArtifactProcessor(documentProcessors, monitor);
// Create the contribution service
ContributionService contributionService =
new ContributionServiceImpl(repository, packageProcessor, documentProcessor, staxProcessor,
contributionListener, policyDefinitionResolver, modelResolvers, modelFactories,
assemblyFactory, contributionFactory, inputFactory, policyDefinitions, registry, monitor);
return contributionService;
}
public static ScopeRegistry createScopeRegistry(ExtensionPointRegistry registry) {
ScopeRegistry scopeRegistry = new ScopeRegistryImpl();
ScopeContainerFactory[] factories =
new ScopeContainerFactory[] {new CompositeScopeContainerFactory(), new StatelessScopeContainerFactory(),
new RequestScopeContainerFactory(),
new ConversationalScopeContainerFactory(null),
// new HttpSessionScopeContainer(monitor)
};
for (ScopeContainerFactory f : factories) {
scopeRegistry.register(f);
}
//FIXME Pass the scope container differently as it's not an extension point
registry.addExtensionPoint(scopeRegistry);
return scopeRegistry;
}
}