diff options
author | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-10-12 23:45:39 +0000 |
---|---|---|
committer | rfeng <rfeng@13f79535-47bb-0310-9956-ffa450edef68> | 2009-10-12 23:45:39 +0000 |
commit | 9b83ee182114c288675c2249da652df93a105dfe (patch) | |
tree | ad1bf20ac7c1133b383d960dad3d17362b4d5184 /java/sca/modules/assembly/src/main | |
parent | d3937102e3ee45a413aaf1f3aa19020d23d8b721 (diff) |
Add PolicyBuilder to the builder extension point
Use QName as the key to index and look up builders
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@824540 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca/modules/assembly/src/main')
5 files changed, 208 insertions, 66 deletions
diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BindingBuilder.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BindingBuilder.java index dbb1bab44b..4b875d9b34 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BindingBuilder.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BindingBuilder.java @@ -19,6 +19,8 @@ package org.apache.tuscany.sca.assembly.builder; +import javax.xml.namespace.QName; + import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.Contract; @@ -39,6 +41,10 @@ public interface BindingBuilder<B extends Binding> { */ void build(Component component, Contract contract, B binding, Monitor monitor); - Class<B> getModelType(); + /** + * Get QName of the binding type + * @return + */ + QName getBindingType(); } diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java index 857b251a16..ae526b92a1 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/BuilderExtensionPoint.java @@ -19,6 +19,8 @@ package org.apache.tuscany.sca.assembly.builder; +import javax.xml.namespace.QName; + import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Implementation; @@ -63,7 +65,7 @@ public interface BuilderExtensionPoint { * @param bindingType * @return */ - <B extends Binding> BindingBuilder<B> getBindingBuilder(Class<B> bindingType); + <B extends Binding> BindingBuilder<B> getBindingBuilder(QName bindingType); /** * Remove a binding builder @@ -84,7 +86,7 @@ public interface BuilderExtensionPoint { * @param implementationType * @return */ - <I extends Implementation> ImplementationBuilder<I> getImplementationBuilder(Class<I> implementationType); + <I extends Implementation> ImplementationBuilder<I> getImplementationBuilder(QName implementationType); /** * Remove an implementation builder @@ -92,5 +94,25 @@ public interface BuilderExtensionPoint { * @param builder */ <I extends Implementation> void removeImplementationBuilder(ImplementationBuilder<I> builder); + + /** + * Add a policy builder + * @param policyBuilder + */ + void addPolicyBuilder(PolicyBuilder<?> policyBuilder); + /** + * Look up a Policy builder by the Policy type + * @param <P> + * @param policyType + * @return + */ + <P> PolicyBuilder<P> getPolicyBuilder(QName policyType); + + /** + * Remove a Policy builder + * @param <P> + * @param builder + */ + <P> void removePolicyBuilder(PolicyBuilder<P> builder); } diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java index 2464fb77dc..d414913a12 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/DefaultBuilderExtensionPoint.java @@ -26,11 +26,13 @@ import java.util.List; import java.util.Map; import javax.xml.namespace.QName; +import javax.xml.ws.EndpointReference; import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.Composite; import org.apache.tuscany.sca.assembly.Contract; +import org.apache.tuscany.sca.assembly.Endpoint; import org.apache.tuscany.sca.assembly.Implementation; import org.apache.tuscany.sca.core.ExtensionPointRegistry; import org.apache.tuscany.sca.core.FactoryExtensionPoint; @@ -38,6 +40,7 @@ import org.apache.tuscany.sca.core.LifeCycleListener; import org.apache.tuscany.sca.core.UtilityExtensionPoint; import org.apache.tuscany.sca.definitions.Definitions; import org.apache.tuscany.sca.extensibility.ServiceDeclaration; +import org.apache.tuscany.sca.extensibility.ServiceDeclarationParser; import org.apache.tuscany.sca.extensibility.ServiceDiscovery; import org.apache.tuscany.sca.interfacedef.InterfaceContractMapper; import org.apache.tuscany.sca.monitor.Monitor; @@ -51,9 +54,11 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life private ExtensionPointRegistry registry; private final Map<String, CompositeBuilder> builders = new HashMap<String, CompositeBuilder>(); - private final Map<Class<?>, BindingBuilder> bindingBuilders = new HashMap<Class<?>, BindingBuilder>(); - private final Map<Class<?>, ImplementationBuilder> implementationBuilders = - new HashMap<Class<?>, ImplementationBuilder>(); + private final Map<QName, BindingBuilder> bindingBuilders = new HashMap<QName, BindingBuilder>(); + private final Map<QName, ImplementationBuilder> implementationBuilders = + new HashMap<QName, ImplementationBuilder>(); + private final Map<QName, PolicyBuilder> policyBuilders = new HashMap<QName, PolicyBuilder>(); + private boolean loaded; public DefaultBuilderExtensionPoint(ExtensionPointRegistry registry) { @@ -69,7 +74,7 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life implementationBuilders.clear(); loaded = false; } - + public void addCompositeBuilder(CompositeBuilder builder) { builders.put(builder.getID(), builder); } @@ -120,7 +125,7 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life for (ServiceDeclaration builderDeclaration : builderDeclarations) { BindingBuilder<?> builder = new LazyBindingBuilder(builderDeclaration); - bindingBuilders.put(builder.getModelType(), builder); + bindingBuilders.put(builder.getBindingType(), builder); } try { @@ -131,59 +136,64 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life for (ServiceDeclaration builderDeclaration : builderDeclarations) { ImplementationBuilder<?> builder = new LazyImplementationBuilder(builderDeclaration); - implementationBuilders.put(builder.getModelType(), builder); + implementationBuilders.put(builder.getImplementationType(), builder); } + try { + builderDeclarations = serviceDiscovery.getServiceDeclarations(PolicyBuilder.class); + } catch (Exception e) { + throw new IllegalStateException(e); + } + + for (ServiceDeclaration builderDeclaration : builderDeclarations) { + PolicyBuilder<?> builder = new LazyPolicyBuilder(builderDeclaration); + policyBuilders.put(builder.getPolicyType(), builder); + } + + loaded = true; } public void addBindingBuilder(BindingBuilder<?> bindingBuilder) { - bindingBuilders.put(bindingBuilder.getModelType(), bindingBuilder); + bindingBuilders.put(bindingBuilder.getBindingType(), bindingBuilder); + } + + public <B extends Binding> BindingBuilder<B> getBindingBuilder(QName bindingType) { + loadBuilders(); + return (BindingBuilder<B>)bindingBuilders.get(bindingType); + } + + public <B extends Binding> void removeBindingBuilder(BindingBuilder<B> builder) { + bindingBuilders.remove(builder.getBindingType()); } public void addImplementationBuilder(ImplementationBuilder<?> implementationBuilder) { - implementationBuilders.put(implementationBuilder.getModelType(), implementationBuilder); + implementationBuilders.put(implementationBuilder.getImplementationType(), implementationBuilder); } - public <B extends Binding> BindingBuilder<B> getBindingBuilder(Class<B> bindingType) { + public <I extends Implementation> ImplementationBuilder<I> getImplementationBuilder(QName implementationType) { loadBuilders(); - if (bindingType.isInterface()) { - return (BindingBuilder<B>)bindingBuilders.get(bindingType); - } - Class<?>[] classes = bindingType.getInterfaces(); - for (Class<?> i : classes) { - BindingBuilder<B> builder = (BindingBuilder<B>)bindingBuilders.get(i); - if (builder != null) { - return builder; - } - } - return null; + return (ImplementationBuilder<I>)implementationBuilders.get(implementationType); } - public <I extends Implementation> ImplementationBuilder<I> getImplementationBuilder(Class<I> implementationType) { - loadBuilders(); - if (implementationType.isInterface()) { - return (ImplementationBuilder<I>)implementationBuilders.get(implementationType); - } - Class<?>[] classes = implementationType.getInterfaces(); - for (Class<?> i : classes) { - ImplementationBuilder<I> builder = (ImplementationBuilder<I>)implementationBuilders.get(i); - if (builder != null) { - return builder; - } - } - return null; + public <I extends Implementation> void removeImplementationBuilder(ImplementationBuilder<I> builder) { + implementationBuilders.remove(builder.getImplementationType()); } - public <B extends Binding> void removeBindingBuilder(BindingBuilder<B> builder) { - bindingBuilders.remove(builder.getModelType()); + public void addPolicyBuilder(PolicyBuilder<?> policyBuilder) { + policyBuilders.put(policyBuilder.getPolicyType(), policyBuilder); } - public <I extends Implementation> void removeImplementationBuilder(ImplementationBuilder<I> builder) { - implementationBuilders.remove(builder.getModelType()); + public <B> PolicyBuilder<B> getPolicyBuilder(QName policyType) { + loadBuilders(); + return (PolicyBuilder<B>)policyBuilders.get(policyType); } + public <B> void removePolicyBuilder(PolicyBuilder<B> builder) { + policyBuilders.remove(builder.getPolicyType()); + } + /** * A wrapper around a composite builder allowing lazy * loading and initialization of implementation providers. @@ -219,9 +229,9 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life } public Composite build(Composite composite, - Definitions definitions, - Map<QName, List<String>> bindingBaseURIs, - Monitor monitor) throws CompositeBuilderException { + Definitions definitions, + Map<QName, List<String>> bindingBaseURIs, + Monitor monitor) throws CompositeBuilderException { return ((DeployedCompositeBuilder)getBuilder()).build(composite, definitions, bindingBaseURIs, monitor); } @@ -257,9 +267,8 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life private class LazyBindingBuilder implements BindingBuilder { private ServiceDeclaration sd; - private String model; private BindingBuilder<?> builder; - private Class<?> modelType; + private QName qname;; /** * @param sd @@ -267,24 +276,18 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life public LazyBindingBuilder(ServiceDeclaration sd) { super(); this.sd = sd; - this.model = sd.getAttributes().get("model"); + this.qname = ServiceDeclarationParser.getQName(sd.getAttributes().get("qname")); } public void build(Component component, Contract contract, Binding binding, Monitor monitor) { getBuilder().build(component, contract, binding, monitor); } - public Class getModelType() { - if (modelType == null) { - try { - modelType = sd.loadClass(model); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - return modelType; + public QName getBindingType() { + return qname; } + private synchronized BindingBuilder getBuilder() { if (builder == null) { try { @@ -308,9 +311,8 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life private class LazyImplementationBuilder implements ImplementationBuilder { private ServiceDeclaration sd; - private String model; private ImplementationBuilder<?> builder; - private Class<?> modelType; + private QName qname;; /** * @param sd @@ -318,34 +320,70 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life public LazyImplementationBuilder(ServiceDeclaration sd) { super(); this.sd = sd; - this.model = sd.getAttributes().get("model"); + this.qname = ServiceDeclarationParser.getQName(sd.getAttributes().get("qname")); } public void build(Component component, Implementation implementation, Monitor monitor) { getBuilder().build(component, implementation, monitor); } - public Class getModelType() { - if (modelType == null) { + public QName getImplementationType() { + return qname; + } + + private synchronized ImplementationBuilder getBuilder() { + if (builder == null) { try { - modelType = sd.loadClass(model); + Class<?> builderClass = sd.loadClass(); + try { + Constructor<?> constructor = builderClass.getConstructor(ExtensionPointRegistry.class); + builder = (ImplementationBuilder)constructor.newInstance(registry); + } catch (NoSuchMethodException e) { + Constructor<?> constructor = builderClass.getConstructor(); + builder = (ImplementationBuilder)constructor.newInstance(); + + } } catch (Exception e) { throw new IllegalStateException(e); } } - return modelType; + return builder; } - private synchronized ImplementationBuilder getBuilder() { + } + + private class LazyPolicyBuilder implements PolicyBuilder { + private ServiceDeclaration sd; + private PolicyBuilder<?> builder; + private QName qname;; + + /** + * @param sd + */ + public LazyPolicyBuilder(ServiceDeclaration sd) { + super(); + this.sd = sd; + this.qname = ServiceDeclarationParser.getQName(sd.getAttributes().get("qname")); + } + + public void build(Component component, Implementation implementation, Definitions definitions, Monitor monitor) { + getBuilder().build(component, implementation, definitions, monitor); + } + + public QName getPolicyType() { + return qname; + } + + private synchronized PolicyBuilder getBuilder() { if (builder == null) { try { Class<?> builderClass = sd.loadClass(); try { Constructor<?> constructor = builderClass.getConstructor(ExtensionPointRegistry.class); - builder = (ImplementationBuilder)constructor.newInstance(registry); + builder = (PolicyBuilder)constructor.newInstance(registry); } catch (NoSuchMethodException e) { Constructor<?> constructor = builderClass.getConstructor(); - builder = (ImplementationBuilder)constructor.newInstance(); + builder = (PolicyBuilder)constructor.newInstance(); } } catch (Exception e) { @@ -355,6 +393,14 @@ public class DefaultBuilderExtensionPoint implements BuilderExtensionPoint, Life return builder; } + public void build(Endpoint endpoint, Definitions definitions, Monitor monitor) { + getBuilder().build(endpoint, definitions, monitor); + } + + public void build(org.apache.tuscany.sca.assembly.EndpointReference endpointReference, Definitions definitions, Monitor monitor) { + getBuilder().build(endpointReference, definitions, monitor); + } + } } diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ImplementationBuilder.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ImplementationBuilder.java index 2c2b3c1cba..6790d0188b 100644 --- a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ImplementationBuilder.java +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/ImplementationBuilder.java @@ -19,6 +19,8 @@ package org.apache.tuscany.sca.assembly.builder; +import javax.xml.namespace.QName; + import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.Implementation; import org.apache.tuscany.sca.monitor.Monitor; @@ -38,6 +40,10 @@ public interface ImplementationBuilder<I extends Implementation> { */ void build(Component component, I implmentation, Monitor monitor); - Class<I> getModelType(); + /** + * Get the QName of the implementation type + * @return + */ + QName getImplementationType(); } diff --git a/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/PolicyBuilder.java b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/PolicyBuilder.java new file mode 100644 index 0000000000..b22bef8951 --- /dev/null +++ b/java/sca/modules/assembly/src/main/java/org/apache/tuscany/sca/assembly/builder/PolicyBuilder.java @@ -0,0 +1,62 @@ +/* + * 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.assembly.builder; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.Endpoint; +import org.apache.tuscany.sca.assembly.EndpointReference; +import org.apache.tuscany.sca.assembly.Implementation; +import org.apache.tuscany.sca.definitions.Definitions; +import org.apache.tuscany.sca.monitor.Monitor; + +/** + * A builder that is contributed by a specific policy languange to validate the configurations + * for SCA endpoints, endpoint references and component implementations + */ +public interface PolicyBuilder<T> { + QName getPolicyType(); + + /** + * Build (and validate) the policy settings on the endpoint + * @param endpoint + * @param definitions + * @param monitor + */ + void build(Endpoint endpoint, Definitions definitions, Monitor monitor); + + /** + * Build (and validate) the policy settings on the endpoint reference + * @param endpointReference + * @param definitions + * @param monitor + */ + void build(EndpointReference endpointReference, Definitions definitions, Monitor monitor); + + /** + * Build (and validate) the policy settings on the component implementation + * @param component + * @param implementation + * @param definitions + * @param monitor + */ + void build(Component component, Implementation implementation, Definitions definitions, Monitor monitor); +} |