diff options
Diffstat (limited to 'sca-java-2.x/tags/2.0-Beta3-RC2/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceImpl.java')
-rw-r--r-- | sca-java-2.x/tags/2.0-Beta3-RC2/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceImpl.java | 370 |
1 files changed, 0 insertions, 370 deletions
diff --git a/sca-java-2.x/tags/2.0-Beta3-RC2/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceImpl.java b/sca-java-2.x/tags/2.0-Beta3-RC2/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceImpl.java deleted file mode 100644 index 4a2d9a5dd5..0000000000 --- a/sca-java-2.x/tags/2.0-Beta3-RC2/modules/interface-java/src/main/java/org/apache/tuscany/sca/interfacedef/java/impl/JavaInterfaceImpl.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * 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.interfacedef.java.impl; - -import java.lang.ref.WeakReference; -import java.lang.reflect.Type; -import java.lang.reflect.TypeVariable; -import java.util.ArrayList; -import java.util.List; -import java.lang.reflect.ParameterizedType; - -import javax.xml.namespace.QName; - -import org.apache.tuscany.sca.assembly.xml.Constants; -import org.apache.tuscany.sca.contribution.Contribution; -import org.apache.tuscany.sca.interfacedef.DataType; -import org.apache.tuscany.sca.interfacedef.Operation; -import org.apache.tuscany.sca.interfacedef.impl.DataTypeImpl; -import org.apache.tuscany.sca.interfacedef.impl.InterfaceImpl; -import org.apache.tuscany.sca.interfacedef.java.JavaInterface; -import org.apache.tuscany.sca.interfacedef.java.JavaOperation; -import org.apache.tuscany.sca.interfacedef.util.XMLType; -import org.apache.tuscany.sca.policy.Intent; - -import static org.apache.tuscany.sca.interfacedef.Operation.IDL_INPUT; -import static org.apache.tuscany.sca.interfacedef.Operation.IDL_OUTPUT; - -import org.oasisopen.sca.ResponseDispatch; - -/** - * Represents a Java interface. - * - * @version $Rev$ $Date$ - */ -public class JavaInterfaceImpl extends InterfaceImpl implements JavaInterface { - - private String className; - private WeakReference<Class<?>> javaClass; - private Class<?> callbackClass; - private QName qname; - private String jaxwsWSDLLocation; - private String jaxwsJavaInterfaceName; - private Contribution contributionContainingClass; - - protected JavaInterfaceImpl() { - super(); - // Mark the interface as unresolved until all the basic processing is complete - // including Intent & Policy introspection - this.setUnresolved(true); - } - - public String getName() { - if (isUnresolved()) { - return className; - } else if (javaClass != null) { - return javaClass.get().getName(); - } else { - return null; - } - } - - public void setName(String className) { - if (!isUnresolved()) { - throw new IllegalStateException(); - } - this.className = className; - } - - public QName getQName() { - return qname; - } - - public void setQName(QName interfacename) { - qname = interfacename; - } - - public Class<?> getJavaClass() { - if (javaClass != null){ - return javaClass.get(); - } else { - return null; - } - } - - public void setJavaClass(Class<?> javaClass) { - this.javaClass = new WeakReference<Class<?>>(javaClass); - if (javaClass != null) { - this.className = javaClass.getName(); - } - } - - public Class<?> getCallbackClass() { - return callbackClass; - } - - public void setCallbackClass(Class<?> callbackClass) { - this.callbackClass = callbackClass; - } - - @Override - public String toString() { - return getName(); - } - - @Override - public Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((className == null) ? 0 : className.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - JavaInterfaceImpl other = (JavaInterfaceImpl)obj; - if (isUnresolved() || other.isUnresolved()) { - if (className == null) { - if (other.className != null) - return false; - } else if (!className.equals(other.className)) - return false; - } else { - if (javaClass == null) { - if (other.javaClass != null) - return false; - } else if (!javaClass.get().equals(other.javaClass.get())) - return false; - if (callbackClass == null) { - if (other.callbackClass != null) - return false; - } else if (!callbackClass.equals(other.callbackClass)) - return false; - } - - return true; - } - - public List<Operation> getOperations() { - if( !isUnresolved() && isAsyncServer() ) { - return equivalentSyncOperations(); - } else { - return super.getOperations(); - } - } // end method getOperations - - - private List<Operation> syncOperations = null; - private List<Operation> equivalentSyncOperations() { - if( syncOperations != null ) return syncOperations; - List<Operation> allOperations = super.getOperations(); - syncOperations = new ArrayList<Operation>(); - for( Operation operation: allOperations) { - syncOperations.add( getSyncFormOfOperation( (JavaOperation) operation ) ); - // Store the actual async operations under the attribute "ASYNC-SERVER-OPERATIONS" - this.getAttributes().put("ASYNC-SERVER-OPERATIONS", allOperations); - } // end for - - return syncOperations; - } // end method equivalentSyncOperations - - private static final String UNKNOWN_DATABINDING = null; - /** - * Prepares the synchronous form of an asynchronous operation - * - async form: void someOperationAsync( FooType inputParam, DispatchResponse<BarType> ) - * - sync form: BarType someOperation( FooType inputParam ) - * @param operation - the operation to convert - * @return - the synchronous form of the operation - for an input operation that is not async server in form, this - * method simply returns the original operation unchanged - */ - private Operation getSyncFormOfOperation( JavaOperation operation ) { - if( isAsyncServerOperation( operation ) ) { - JavaOperation syncOperation = new JavaOperationImpl(); - String opName = operation.getName().substring(0, operation.getName().length() - 5 ); - - // Prepare the list of equivalent input parameters, which simply excludes the (final) DispatchResponse object - // and the equivalent return parameter, which is the (generic) type from the DispatchResponse object - DataType<List<DataType>> requestParams = operation.getInputType(); - - DataType<List<DataType>> inputType = prepareSyncInputParams( requestParams ); - DataType<List<DataType>> returnDataType = prepareSyncReturnParam( requestParams ); - List<DataType> faultDataTypes = prepareSyncFaults( operation ); - - syncOperation.setName(opName); - syncOperation.setAsyncServer(true); - syncOperation.setInputType(inputType); - syncOperation.setOutputType(returnDataType); - syncOperation.setFaultTypes(faultDataTypes); - syncOperation.setNonBlocking(operation.isNonBlocking()); - syncOperation.setJavaMethod(operation.getJavaMethod()); - syncOperation.setInterface(this); - return syncOperation; - } else { - // If it's not Async form, then it's a synchronous operation - return operation; - } // end if - } // end getSyncFormOfOperation - - /** - * Produce the equivalent sync method input parameters from the input parameters of the async method - * @param requestParams - async method input parameters - * @return - the equivalent sync method input parameters - */ - private DataType<List<DataType>> prepareSyncInputParams( DataType<List<DataType>> requestParams ) { - List<DataType> requestLogical = requestParams.getLogical(); - int paramCount = requestLogical.size(); - - // Copy the list of async parameters, removing the final DispatchResponse - List<DataType> asyncParams = new ArrayList<DataType>( paramCount - 1); - for( int i = 0 ; i < (paramCount - 1) ; i++ ) { - asyncParams.add( requestLogical.get(i) ); - } // end for - - DataType<List<DataType>> inputType = - new DataTypeImpl<List<DataType>>(requestParams.getDataBinding(), - requestParams.getPhysical(), asyncParams); - return inputType; - } // end method prepareSyncInputParams - - /** - * Prepare the return data type of the equivalent sync operation, based on the parameterization of the ResponseDispatch object - * of the async operation - the return data type is the Generic type of the final DispatchResponse<?> - * @param requestParams - - async method input parameters - * @return - the sync method return parameter - */ - @SuppressWarnings("rawtypes") - private DataType<List<DataType>> prepareSyncReturnParam( DataType<List<DataType>> requestParams ) { - List<DataType> requestLogical = requestParams.getLogical(); - int paramCount = requestLogical.size(); - - DataType<?> finalParam = requestLogical.get( paramCount - 1 ); - ParameterizedType t = (ParameterizedType)finalParam.getGenericType(); - XMLType returnXMLType = (XMLType)finalParam.getLogical(); - - String namespace = null; - if( returnXMLType.isElement() ) { - namespace = returnXMLType.getElementName().getNamespaceURI(); - } else { - namespace = returnXMLType.getTypeName().getNamespaceURI(); - } - - Type[] typeArgs = t.getActualTypeArguments(); - if( typeArgs.length != 1 ) throw new IllegalArgumentException( "ResponseDispatch parameter is not parameterized correctly"); - - Class<?> returnType = (Class<?>)typeArgs[0]; - - // Set outputType to null for void - XMLType xmlReturnType = new XMLType(new QName(namespace, "return"), null); - DataType<XMLType> returnDataType = - returnType == void.class ? null : new DataTypeImpl<XMLType>(UNKNOWN_DATABINDING, returnType, xmlReturnType); - - ArrayList<DataType> returnTypes = new ArrayList<DataType>(); - returnTypes.add(returnDataType); - - DataType<List<DataType>> outputType = - new DataTypeImpl<List<DataType>>(IDL_OUTPUT, requestParams.getPhysical(), returnTypes); - - return outputType; - } // end method prepareSyncReturnParam - - /** - * Prepare the set of equivalent sync faults for a given async operation - * @return - the list of faults - */ - private List<DataType> prepareSyncFaults( JavaOperation operation ) { - //TODO - deal with Faults - for now just copy through whatever is associated with the async operation - return operation.getFaultTypes(); - } - - /** - * Determines if an interface operation has the form of an async server operation - * - async form: void someOperationAsync( FooType inputParam, ...., DispatchResponse<BarType> ) - * @param operation - the operation to examine - * @return - true if the operation has the form of an async operation, false otherwise - */ - private boolean isAsyncServerOperation( Operation operation ) { - // Async form operations have: - // 1) void return type (equivalent to an output logical List of size '0') - // 2) name ending in "Async" - // 3) final parameter which is of ResponseDispatch<?> type - int size = operation.getOutputType().getLogical().size(); - if (size != 0) { - return false; - } - - if ( !operation.getName().endsWith("Async") ) return false; - - DataType<List<DataType>> requestParams = operation.getInputType(); - int paramCount = requestParams.getLogical().size(); - if( paramCount < 1 ) return false; - DataType<?> finalParam = requestParams.getLogical().get( paramCount - 1 ); - if ( finalParam.getPhysical() != ResponseDispatch.class ) return false; - - return true; - } // end method isAsyncServerOperation - - static QName ASYNC_INVOCATION = new QName(Constants.SCA11_NS, "asyncInvocation"); - /** - * Indicates if this interface is an Async Server interface - * @return true if the interface is Async Server, false otherwise - */ - private boolean isAsyncServer() { - - List<Intent> intents = getRequiredIntents(); - for( Intent intent: intents ) { - if ( intent.getName().equals(ASYNC_INVOCATION) ) { - return true; - } - } // end for - return false; - } // end method isAsyncServer - - public String getJAXWSWSDLLocation() { - return jaxwsWSDLLocation; - } - - public void setJAXWSWSDLLocation(String wsdlLocation) { - this.jaxwsWSDLLocation = wsdlLocation; - } - - public String getJAXWSJavaInterfaceName() { - return jaxwsJavaInterfaceName; - } - - public void setJAXWSJavaInterfaceName(String javaInterfaceName) { - this.jaxwsJavaInterfaceName = javaInterfaceName; - } - - /** - * A Java class may reference a WSDL file via a JAXWS annotation. We need to resolve - * the WSDL file location in the context of the same contribution that holds the - * Java file. In order to do this we need to remember the actual contribution that - * was used to resolve a Java class. - * - * @return - */ - public Contribution getContributionContainingClass() { - return contributionContainingClass; - } - - public void setContributionContainingClass(Contribution contributionContainingClass) { - this.contributionContainingClass = contributionContainingClass; - } -} |