diff options
author | nash <nash@13f79535-47bb-0310-9956-ffa450edef68> | 2011-12-04 18:10:28 +0000 |
---|---|---|
committer | nash <nash@13f79535-47bb-0310-9956-ffa450edef68> | 2011-12-04 18:10:28 +0000 |
commit | d7e5b6bef7f0ea0f062a0b715fdf4281ca65bcd5 (patch) | |
tree | d317d71fc9d49fd867d7802a57ca26c7818ffda1 /sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core | |
parent | d505f2c08f09cb2feaa3c7be5f55cc05f0556c93 (diff) |
TUSCANY-3984: Support binding.ws, interface.wsdl and policySets for serialized service references
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1210165 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core')
4 files changed, 272 insertions, 5 deletions
diff --git a/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/BusinessInterfaceImpl.java b/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/BusinessInterfaceImpl.java new file mode 100644 index 0000000000..f2fd3c7080 --- /dev/null +++ b/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/BusinessInterfaceImpl.java @@ -0,0 +1,74 @@ +/*
+ * 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.core.assembly;
+
+import org.apache.tuscany.sca.runtime.BusinessInterface;
+
+/**
+ * @version $Rev: 574648 $ $Date: 2007-09-11 18:45:36 +0100 (Tue, 11 Sep 2007) $
+ */
+public class BusinessInterfaceImpl implements BusinessInterface {
+ private String interfaze;
+
+ /**
+ * @return the interface class name
+ */
+ public String getInterface() {
+ return interfaze;
+ }
+
+ /**
+ * @param interfaze the interface class name
+ */
+ public void setInterface(String interfaze) {
+ this.interfaze = interfaze;
+ }
+
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((interfaze == null) ? 0 : interfaze.hashCode());
+ return result;
+ }
+
+ /**
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (!(obj instanceof BusinessInterfaceImpl))
+ return false;
+ final BusinessInterfaceImpl other = (BusinessInterfaceImpl)obj;
+ if (interfaze == null) {
+ if (other.interfaze != null)
+ return false;
+ } else if (!interfaze.equals(other.interfaze))
+ return false;
+ return true;
+ }
+}
diff --git a/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/BusinessInterfaceProcessor.java b/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/BusinessInterfaceProcessor.java new file mode 100644 index 0000000000..6d4caeb564 --- /dev/null +++ b/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/assembly/BusinessInterfaceProcessor.java @@ -0,0 +1,97 @@ +/*
+ * 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.core.assembly;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
+import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
+import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
+import org.apache.tuscany.sca.contribution.service.ContributionReadException;
+import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
+import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
+import org.apache.tuscany.sca.monitor.Monitor;
+import org.apache.tuscany.sca.runtime.BusinessInterface;
+
+/**
+ * Artifact processor for reference parameters.
+ *
+ * @version $Rev: 658664 $ $Date: 2008-05-21 13:46:26 +0100 (Wed, 21 May 2008) $
+ */
+public class BusinessInterfaceProcessor implements StAXArtifactProcessor<BusinessInterface> {
+ private static final QName BUSINESS_INTERFACE =
+ new QName("http://tuscany.apache.org/xmlns/sca/1.0", "businessInterface", "tuscany");
+
+ /**
+ * Constructs a new processor.
+ *
+ * @param modelFactories
+ */
+ public BusinessInterfaceProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor#getArtifactType()
+ */
+ public QName getArtifactType() {
+ return BUSINESS_INTERFACE;
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor#read(javax.xml.stream.XMLStreamReader)
+ */
+ public BusinessInterface read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {
+ BusinessInterface businessInterface = new BusinessInterfaceImpl();
+ businessInterface.setInterface(reader.getAttributeValue(null, "interface"));
+ return businessInterface;
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor#write(java.lang.Object, javax.xml.stream.XMLStreamWriter)
+ */
+ public void write(BusinessInterface model, XMLStreamWriter writer) throws ContributionWriteException,
+ XMLStreamException {
+ writer.writeStartElement(BUSINESS_INTERFACE.getPrefix(),
+ BUSINESS_INTERFACE.getLocalPart(),
+ BUSINESS_INTERFACE.getNamespaceURI());
+ writer.writeNamespace(BUSINESS_INTERFACE.getPrefix(), BUSINESS_INTERFACE.getNamespaceURI());
+ if (model.getInterface() != null) {
+ writer.writeAttribute("interface", model.getInterface().toString());
+ }
+ writer.writeEndElement();
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.contribution.processor.ArtifactProcessor#getModelType()
+ */
+ public Class<BusinessInterface> getModelType() {
+ return BusinessInterface.class;
+ }
+
+ /**
+ * @see org.apache.tuscany.sca.contribution.processor.ArtifactProcessor#resolve(java.lang.Object, org.apache.tuscany.sca.contribution.resolver.ModelResolver)
+ */
+ public void resolve(BusinessInterface model, ModelResolver resolver) throws ContributionResolveException {
+ }
+
+}
diff --git a/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java b/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java index 7d94e73f35..714268a634 100644 --- a/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java +++ b/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/CallableReferenceImpl.java @@ -24,6 +24,8 @@ import java.io.ObjectInput; import java.io.ObjectOutput; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import javax.xml.stream.XMLStreamReader; @@ -32,11 +34,16 @@ import org.apache.tuscany.sca.assembly.Binding; import org.apache.tuscany.sca.assembly.Component; import org.apache.tuscany.sca.assembly.ComponentService; import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.ConfiguredOperation; +import org.apache.tuscany.sca.assembly.OperationsConfigurator; import org.apache.tuscany.sca.assembly.OptimizableBinding; import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.SCABinding; import org.apache.tuscany.sca.assembly.Service; import org.apache.tuscany.sca.assembly.builder.BindingBuilderExtension; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; +import org.apache.tuscany.sca.contribution.resolver.ResolverExtension; +import org.apache.tuscany.sca.core.assembly.BusinessInterfaceImpl; import org.apache.tuscany.sca.core.assembly.CompositeActivator; import org.apache.tuscany.sca.core.assembly.CompositeActivatorImpl; import org.apache.tuscany.sca.core.assembly.EndpointReferenceImpl; @@ -50,6 +57,9 @@ import org.apache.tuscany.sca.core.invocation.ProxyFactory; import org.apache.tuscany.sca.interfacedef.Interface; import org.apache.tuscany.sca.interfacedef.InterfaceContract; import org.apache.tuscany.sca.interfacedef.java.JavaInterface; +import org.apache.tuscany.sca.policy.PolicySet; +import org.apache.tuscany.sca.policy.PolicySetAttachPoint; +import org.apache.tuscany.sca.runtime.BusinessInterface; import org.apache.tuscany.sca.runtime.EndpointReference; import org.apache.tuscany.sca.runtime.ReferenceParameters; import org.apache.tuscany.sca.runtime.RuntimeComponent; @@ -291,10 +301,13 @@ public class CallableReferenceImpl<B> implements CallableReference<B>, Externali this.reference.setComponent(this.component); clonedRef = reference; ReferenceParameters parameters = null; + BusinessInterface businessInterfaceExt = null; for (Object ext : reference.getExtensions()) { if (ext instanceof ReferenceParameters) { parameters = (ReferenceParameters)ext; - break; + } else if (ext instanceof BusinessInterface) { + // this extension will always be present + businessInterfaceExt = (BusinessInterface)ext; } } if (parameters != null) { @@ -344,6 +357,10 @@ public class CallableReferenceImpl<B> implements CallableReference<B>, Externali binding = reference.getBindings().get(0); } } + + ModelResolver resolver = ((ResolverExtension)ComponentContextHelper.getCurrentComponent()).getModelResolver(); + componentContextHelper.resolveInterfaceContract(reference.getInterfaceContract(), resolver); + Interface i = reference.getInterfaceContract().getInterface(); if (i instanceof JavaInterface) { JavaInterface javaInterface = (JavaInterface)i; @@ -360,10 +377,38 @@ public class CallableReferenceImpl<B> implements CallableReference<B>, Externali javaInterface.getJavaClass()); //FIXME: If the interface needs XSDs to be loaded (e.g., for static SDO), // this needs to be done here. We usually search for XSDs in the current - // contribution at resolve time. Is it possible to locate the current - // contribution at runtime? - } + // contribution at resolve time. If we need to add code here to do this, + // we can resolve XSDs using the model resolver for the current component. + } this.businessInterface = (Class<B>)javaInterface.getJavaClass(); + } else { + // Allow privileged access to get ClassLoader. Requires RuntimePermission in + // security policy. + ClassLoader classLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() { + public ClassLoader run() { + return Thread.currentThread().getContextClassLoader(); + } + }); + businessInterface = (Class<B>)classLoader.loadClass(businessInterfaceExt.getInterface()); + reference.setReference(componentContextHelper.createReference(businessInterface)); + } + + componentContextHelper.resolveBinding(binding, resolver); + if (binding instanceof PolicySetAttachPoint) { + PolicySetAttachPoint policiedBinding = (PolicySetAttachPoint)binding; + List<PolicySet> policySets = policiedBinding.getPolicySets(); + resolvePolicySets(policySets, resolver); + List<PolicySet> applicablePolicySets = policiedBinding.getApplicablePolicySets(); + applicablePolicySets.addAll(policySets); + } + if (binding instanceof OperationsConfigurator) { + OperationsConfigurator opConfigurator = (OperationsConfigurator)binding; + for (ConfiguredOperation confOp : opConfigurator.getConfiguredOperations()) { + List<PolicySet> policySets = confOp.getPolicySets(); + resolvePolicySets(policySets, resolver); + List<PolicySet> applicablePolicySets = confOp.getApplicablePolicySets(); + applicablePolicySets.addAll(policySets); + } } if (binding instanceof BindingBuilderExtension) { ((BindingBuilderExtension)binding).getBuilder().build(component, reference, binding, null); @@ -377,6 +422,26 @@ public class CallableReferenceImpl<B> implements CallableReference<B>, Externali } } } + + /** + * Resolve policy sets attached to a specific SCA Construct + * @param policySets list of attached policy sets + * @param resolver + */ + private void resolvePolicySets(List<PolicySet> policySets, ModelResolver resolver) { + List<PolicySet> resolvedPolicySets = new ArrayList<PolicySet>(); + PolicySet resolvedPolicySet = null; + for (PolicySet policySet : policySets) { + if (policySet.isUnresolved()) { + resolvedPolicySet = resolver.resolveModel(PolicySet.class, policySet); + resolvedPolicySets.add(resolvedPolicySet); + } else { + resolvedPolicySets.add(policySet); + } + } + policySets.clear(); + policySets.addAll(resolvedPolicySets); + } /** * Follow a service promotion chain down to the inner most (non composite) @@ -432,6 +497,9 @@ public class CallableReferenceImpl<B> implements CallableReference<B>, Externali } catch (CloneNotSupportedException e) { // will not happen } + BusinessInterface bizInterface = new BusinessInterfaceImpl(); + bizInterface.setInterface(businessInterface.getName()); + clonedRef.getExtensions().add(bizInterface); } if (refParams == null) { refParams = new ReferenceParametersImpl(); @@ -443,7 +511,6 @@ public class CallableReferenceImpl<B> implements CallableReference<B>, Externali toRemove = extension; } } - if (toRemove != null){ clonedRef.getExtensions().remove(toRemove); } diff --git a/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextHelper.java b/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextHelper.java index 78b0887482..5a93a4d67b 100644 --- a/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextHelper.java +++ b/sca-java-1.x/trunk/modules/core/src/main/java/org/apache/tuscany/sca/core/context/ComponentContextHelper.java @@ -45,6 +45,7 @@ import org.apache.tuscany.sca.assembly.Reference; import org.apache.tuscany.sca.assembly.Service; import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint; +import org.apache.tuscany.sca.contribution.resolver.ModelResolver; import org.apache.tuscany.sca.core.assembly.CompositeActivator; import org.apache.tuscany.sca.core.invocation.ThreadMessageContext; import org.apache.tuscany.sca.interfacedef.Interface; @@ -260,6 +261,34 @@ public class ComponentContextHelper { return read(streamReader); } + public void resolveInterfaceContract(InterfaceContract interfaceContract, ModelResolver resolver) throws Exception { + StAXArtifactProcessor processor = staxProcessors.getProcessor(interfaceContract.getClass()); + processor.resolve(interfaceContract, resolver); + } + + public void resolveBinding(Binding binding, ModelResolver resolver) throws Exception { + StAXArtifactProcessor processor = staxProcessors.getProcessor(binding.getClass()); + processor.resolve(binding, resolver); + } + + public Reference createReference(Class<?> businessInterface) throws InvalidInterfaceException { + InterfaceContract interfaceContract = createJavaInterfaceContract(businessInterface); + Reference reference = assemblyFactory.createReference(); + reference.setInterfaceContract(interfaceContract); + return reference; + } + + private InterfaceContract createJavaInterfaceContract(Class<?> businessInterface) throws InvalidInterfaceException { + InterfaceContract interfaceContract = javaInterfaceFactory.createJavaInterfaceContract(); + JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(businessInterface); + interfaceContract.setInterface(callInterface); + if (callInterface.getCallbackClass() != null) { + interfaceContract.setCallbackInterface(javaInterfaceFactory.createJavaInterface( + callInterface.getCallbackClass())); + } + return interfaceContract; + } + public static RuntimeComponent getCurrentComponent() { Message message = ThreadMessageContext.getMessageContext(); if (message != null) { |