Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility ...

29
Tuscany 2.x Extensibility and SPIs Raymond Feng

Transcript of Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility ...

Page 1: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Tuscany 2.x Extensibility and SPIs

Raymond Feng

Page 2: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Tuscany Extensibilityhttp://cwiki.apache.org/confluence/display/TUSCANYxDOCx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions

Page 3: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Tuscany Core and Extensions

Implementation Extensions

Policy Extensions

Interface Extensions

Binding Extensions

Databinding Extensions

Contribution Extensions

Host Extensions

Composite 1 Composite 2

Java Metadata Model

Deployment

Activation and Execution

SCA AssemblyXML Configuration Model

Extensibility & Pluggability

S C A com pos ite app lica t ion

Tuscany Core

Tuscany Runtim e(se lec ted and assem b led from the co re m odu les

and se lec ted ex tens ions)

21

A

B

Page 4: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

How is Extensibility achieved?

• Inspired by Eclipse ExtensionPoint/Extension pattern

• Use Jar service provider configuration files with extended syntax– http://java.sun.com/j2se/1.4.2/docs/guide/jar/

jar.html#Service Provider – META-INF/services/<SPI>

Page 5: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

ExtensionPoint Registry

StAXArtifactProcessor

ProviderFactory

Extension Points

Extensions

StAXArtifact

ProcessorExtension

Point

C om pos iteP rocesso r

ProviderFactory

ExtensionPoint

UtilityExtension

Point

A x is2B ind ing

P rov ide r F acto ry

JavaIm p lem en ta t ion

P rov ide r F acto ry

W eb S e rv iceB ind ing

P rocesso r

JavaIm p lem en ta t ion

P rocesso r

W orkS chedu le r

M on ito rF acto ry

In te r faceC on trac tM appe r

ExtensionPoint

Registry

Page 6: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

META-INF/services

• META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor

– org.apache.tuscany.sca.assembly.xml.CompositeProcessor;qname=http://docs.oasis-open.org/ns/opencsa/sca/200903#composite,model=org.apache.tuscany.sca.assembly.Composite

Page 7: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

An example

implements

creates

implements

implements

extends

implements

o rg .apache . tuscany.sca .assem b ly.D e fau ltA ssem b lyF acto ry

META-INF/services/org.apache.tuscany.sca.assembly.AssemblyFactory

o rg .apache . tuscany.sca .co re .assem b ly.R un t im eA ssem b lyF acto ry

META-INF/services/org.apache.tuscany.sca.assembly.AssemblyFactory

META-INF/services/org.apache.tuscany.sca.assembly.AssemblyFactory

Page 8: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Service Discovery

• Two types of service discovery mechanisms– Classloader– OSGi bundles

• Sort by ranking attribute (to override default implementations)– A: <ClassName>;ranking=100 (A is picked)– B: <ClassName>;ranking=50

• Discover by a filter

Page 9: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

OSGi-friendly Service Discovery

• Bundle.getResource()

• An implementation of ExtensionPointRegistry that uses OSGi service registry

Page 10: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Service Attributes

• Similar with OSGi header syntax – <ClassName>;attr1=value1,attr2=value2– Both , and ; can be used to separate

attributes– | can be used to declare multiple providers on

one line– <ClassName1>|<ClassName2>;attr1=value1

Page 11: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Service Constructors

• The Tuscany runtime introspects the constrcutors of an implementation class by the following order for extension points– <ImplClass>(ExtensionPointRegistry registry)– <ImplClass>(ExtensionPointRegistry registry,

Map<String, String> attributes)– <ImplClass>()

• The extension point controls how to instantiate an extension implementation class

Page 12: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

LifeCycle of Extensions

• The implementation class of an extension point or extension can optionally implement the LifeCycleListener– start()– stop()

Page 13: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Extension Pointsorg.apache.tuscany.sca.core.ModuleActivatorExtensionPointorg.apache.tuscany.sca.core.UtilityExtensionPoint

org.apache.tuscany.sca.core.FactoryExtensionPointorg.apache.tuscany.sca.assembly.builder.BuilderExtensionPointorg.apache.tuscany.sca.definitions.xml.DefinitionsExtensionPointorg.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPointorg.apache.tuscany.sca.contribution.processor.StAXAttributeProcessorExtensionPointorg.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPointorg.apache.tuscany.sca.contribution.processor.ValidationSchemaExtensionPointorg.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPointorg.apache.tuscany.sca.contribution.scanner.ContributionScannerExtensionPoint

org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPointorg.apache.tuscany.sca.context.ContextFactoryExtensionPointorg.apache.tuscany.sca.provider.ProviderFactoryExtensionPointorg.apache.tuscany.sca.runtime.RuntimeWireProcessorExtensionPointorg.apache.tuscany.sca.databinding.DataBindingExtensionPointorg.apache.tuscany.sca.databinding.TransformerExtensionPointorg.apache.tuscany.sca.databinding.jaxb.XMLAdapterExtensionPoint

org.apache.tuscany.sca.host.http.ServletHostExtensionPointorg.apache.tuscany.sca.host.rmi.RMIHostExtensionPointorg.apache.tuscany.sca.implementation.web.runtime.ClientExtensionPointorg.apache.tuscany.sca.web.javascript.ComponentJavaScriptGeneratorExtensionPointorg.apache.tuscany.sca.web.javascript.JavascriptProxyFactoryExtensionPoint

Page 14: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

ModuleActivator

• ModuleActivator is now a special type of LifeCycleListener– void start()– void stop()

• In 2.x, the implementation class of a ModuleActivator receives ExtensionPointRegistry via constructors instead of start/stop methods

• Almost all of the 1.x module activators are now converted into regular extension

Page 15: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Utility Extension Point

• A collection of utility functions

• Replace static singletons with a registry managed utilities

• Utilities without a META-INF/services configuration – org.apache.tuscany.sca.common.xml.stax.StA

XHelper (concrete class)

Page 16: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Tuscany SPIshttp://cwiki.apache.org/confluence/display/TUSCANYxDOCx2x/Tuscany+2.x+Extensibility+and+SPIs

Page 17: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Tuscany SPI packages

• Listed by OSGi Export-Package header• The categories

– model interfaces (assembly, implementation-java)

– base implementation classes– extension point and extension interfaces

(extensibility, core-spi, contribution)– common utilities (common-xml, common-java)– node apis and base implementations

Page 18: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Models

• tuscany-assembly– org.apache.tuscany.sca.assembly – org.apache.tuscany.sca.assembly.builder – org.apache.tuscany.sca.assembly.impl – org.apache.tuscany.sca.definitions – org.apache.tuscany.sca.definitions.util – org.apache.tuscany.sca.interfacedef – org.apache.tuscany.sca.interfacedef.impl – org.apache.tuscany.sca.interfacedef.util – org.apache.tuscany.sca.policy – org.apache.tuscany.sca.policy.impl – org.apache.tuscany.sca.policy.util

Page 19: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Interface-java and interface-wsdl

• Interface-java– org.apache.tuscany.sca.interfacedef.java.impl – org.apache.tuscany.sca.interfacedef.java.introspect – org.apache.tuscany.sca.interfacedef.java

• Interface-wsdl– org.apache.tuscany.sca.interfacedef.wsdl

• Xsd– org.apache.tuscany.sca.xsd – org.apache.tuscany.sca.xsd.xml

Page 20: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Contribution and deployment

• Contribution– org.apache.tuscany.sca.contribution.scanner – org.apache.tuscany.sca.contribution.resolver – org.apache.tuscany.sca.contribution.processor – org.apache.tuscany.sca.contribution – org.apache.tuscany.sca.contribution.namespace – org.apache.tuscany.sca.contribution.java

• Deployment– org.apache.tuscany.sca.deployment

– org.apache.tuscany.sca.deployment.impl

Page 21: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Extensibility and core-spi

• Extensibility– org.apache.tuscany.sca.core – org.apache.tuscany.sca.extensibility

• Core-spi– org.apache.tuscany.sca.context – org.apache.tuscany.sca.invocation – org.apache.tuscany.sca.management – org.apache.tuscany.sca.provider – org.apache.tuscany.sca.runtime – org.apache.tuscany.sca.work

• Monitor– org.apache.tuscany.sca.monitor

Page 22: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Databinding

• Databinding– org.apache.tuscany.sca.databinding – org.apache.tuscany.sca.databinding.xml – org.apache.tuscany.sca.databinding.impl – org.apache.tuscany.sca.databinding.util – org.apache.tuscany.sca.databinding.annotation

– org.apache.tuscany.sca.databinding.javabeans

Page 23: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Node-api and launcher

• Node-api– org.apache.tuscany.sca.node – org.apache.tuscany.sca.node.configuration

• Node-impl– org.apache.tuscany.sca.node.impl

Page 24: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Common utilities

• Common-java– org.apache.tuscany.sca.common.java.classloader – org.apache.tuscany.sca.common.java.collection – org.apache.tuscany.sca.common.java.io – org.apache.tuscany.sca.common.java.reflection

• Common-xml– org.apache.tuscany.sca.common.xml – org.apache.tuscany.sca.common.xml.dom – org.apache.tuscany.sca.common.xml.sax – org.apache.tuscany.sca.common.xml.stax – org.apache.tuscany.sca.common.xml.stax.reader – org.apache.tuscany.sca.common.xml.xpath

Page 25: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

A scheme for internal package dependencies

• Semi-SPIs for internal module dependencies– Export-Package:

a.b;version=2.0.0;internal=true;mandatory:=internal

– Import-Package: a.b;version=2.0.0;internal=true

Page 26: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Changed SPIs

• Monitor is now mostly request-scoped

• New Builder SPIs for extensions (implementation, binding and policy)

• Context– CompositeContext (maybe should be named

as NodeContext)– ProcessorContext– BuilderContext

Page 27: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Changed SPIs (2)

• ???ProviderFactory.create???Provider() now takes RuntimeEndpoint for service binding and RuntimeEndpointReference for reference binding

• RuntimeWire is removed. RuntimeEndpoint and RuntimeEndpointReference own the invocation chains.

Page 28: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

References

Page 29: Tuscany 2.x Extensibility and SPIs Raymond Feng. Tuscany Extensibility  Cx2x/Tuscany+2.x+Extensibility+and+SPIs#extensions.

Useful Links

• http://cwiki.apache.org/confluence/display/TUSCANYxDOCx2x/Tuscany+2.x+Extensibility+and+SPIs

• http://www.manning.com/laws/ (Chapter 13 and Chapter 14)