Compiled from "AbstractContract.java"
public interface org.apache.tuscany.sca.assembly.AbstractContract extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.assembly.Extensible,org.apache.tuscany.sca.policy.PolicySubject{
    public abstract java.lang.String getName();
    public abstract void setName(java.lang.String);
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getInterfaceContract();
    public abstract void setInterfaceContract(org.apache.tuscany.sca.interfacedef.InterfaceContract);
    public abstract boolean isForCallback();
    public abstract void setForCallback(boolean);
}

Compiled from "AbstractProperty.java"
public interface org.apache.tuscany.sca.assembly.AbstractProperty extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.assembly.Extensible{
    public abstract java.lang.String getName();
    public abstract void setName(java.lang.String);
    public abstract java.lang.Object getValue();
    public abstract void setValue(java.lang.Object);
    public abstract boolean isMany();
    public abstract void setMany(boolean);
    public abstract boolean isMustSupply();
    public abstract void setMustSupply(boolean);
    public abstract javax.xml.namespace.QName getXSDType();
    public abstract void setXSDType(javax.xml.namespace.QName);
    public abstract javax.xml.namespace.QName getXSDElement();
    public abstract void setXSDElement(javax.xml.namespace.QName);
    public abstract org.apache.tuscany.sca.interfacedef.DataType getDataType();
    public abstract void setDataType(org.apache.tuscany.sca.interfacedef.DataType);
    public abstract java.lang.Object getXSDDefinition();
    public abstract void setXSDDefinition(java.lang.Object);
}

Compiled from "AbstractReference.java"
public interface org.apache.tuscany.sca.assembly.AbstractReference extends org.apache.tuscany.sca.assembly.AbstractContract{
    public abstract org.apache.tuscany.sca.assembly.Multiplicity getMultiplicity();
    public abstract void setMultiplicity(org.apache.tuscany.sca.assembly.Multiplicity);
}

Compiled from "AbstractService.java"
public interface org.apache.tuscany.sca.assembly.AbstractService extends org.apache.tuscany.sca.assembly.AbstractContract{
}

Compiled from "AssemblyFactory.java"
public interface org.apache.tuscany.sca.assembly.AssemblyFactory{
    public abstract org.apache.tuscany.sca.assembly.AbstractProperty createAbstractProperty();
    public abstract org.apache.tuscany.sca.assembly.AbstractReference createAbstractReference();
    public abstract org.apache.tuscany.sca.assembly.AbstractService createAbstractService();
    public abstract org.apache.tuscany.sca.assembly.Callback createCallback();
    public abstract org.apache.tuscany.sca.assembly.Component createComponent();
    public abstract org.apache.tuscany.sca.assembly.ComponentProperty createComponentProperty();
    public abstract org.apache.tuscany.sca.assembly.ComponentReference createComponentReference();
    public abstract org.apache.tuscany.sca.assembly.ComponentService createComponentService();
    public abstract org.apache.tuscany.sca.assembly.ComponentType createComponentType();
    public abstract org.apache.tuscany.sca.assembly.Composite createComposite();
    public abstract org.apache.tuscany.sca.assembly.CompositeReference createCompositeReference();
    public abstract org.apache.tuscany.sca.assembly.CompositeService createCompositeService();
    public abstract org.apache.tuscany.sca.assembly.Property createProperty();
    public abstract org.apache.tuscany.sca.assembly.Reference createReference();
    public abstract org.apache.tuscany.sca.assembly.Service createService();
    public abstract org.apache.tuscany.sca.assembly.Wire createWire();
    public abstract org.apache.tuscany.sca.assembly.Extension createExtension();
    public abstract org.apache.tuscany.sca.assembly.Endpoint createEndpoint();
    public abstract org.apache.tuscany.sca.assembly.EndpointReference createEndpointReference();
    public abstract org.apache.tuscany.sca.assembly.ConfiguredOperation createConfiguredOperation();
}

Compiled from "Base.java"
public interface org.apache.tuscany.sca.assembly.Base{
    public static final java.lang.String SCA11_NS;
    public static final java.lang.String SCA11_TUSCANY_NS;
    public abstract boolean isUnresolved();
    public abstract void setUnresolved(boolean);
}

Compiled from "Binding.java"
public interface org.apache.tuscany.sca.assembly.Binding extends org.apache.tuscany.sca.assembly.Base,java.lang.Cloneable{
    public abstract java.lang.String getURI();
    public abstract void setURI(java.lang.String);
    public abstract java.lang.String getName();
    public abstract void setName(java.lang.String);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public abstract javax.xml.namespace.QName getType();
    public abstract org.apache.tuscany.sca.assembly.WireFormat getRequestWireFormat();
    public abstract void setRequestWireFormat(org.apache.tuscany.sca.assembly.WireFormat);
    public abstract org.apache.tuscany.sca.assembly.WireFormat getResponseWireFormat();
    public abstract void setResponseWireFormat(org.apache.tuscany.sca.assembly.WireFormat);
    public abstract org.apache.tuscany.sca.assembly.OperationSelector getOperationSelector();
    public abstract void setOperationSelector(org.apache.tuscany.sca.assembly.OperationSelector);
}

Compiled from "Callback.java"
public interface org.apache.tuscany.sca.assembly.Callback extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.assembly.Extensible,org.apache.tuscany.sca.policy.PolicySubject{
    public abstract java.util.List getBindings();
    public abstract org.apache.tuscany.sca.assembly.Contract getParentContract();
    public abstract void setParentContract(org.apache.tuscany.sca.assembly.Contract);
}

Compiled from "Component.java"
public interface org.apache.tuscany.sca.assembly.Component extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.assembly.Extensible,org.apache.tuscany.sca.policy.PolicySubject,java.lang.Cloneable{
    public abstract java.lang.String getURI();
    public abstract void setURI(java.lang.String);
    public abstract java.lang.String getName();
    public abstract void setName(java.lang.String);
    public abstract org.apache.tuscany.sca.assembly.Implementation getImplementation();
    public abstract void setImplementation(org.apache.tuscany.sca.assembly.Implementation);
    public abstract java.util.List getReferences();
    public abstract org.apache.tuscany.sca.assembly.ComponentReference getReference(java.lang.String);
    public abstract java.util.List getServices();
    public abstract org.apache.tuscany.sca.assembly.ComponentService getService(java.lang.String);
    public abstract java.util.List getProperties();
    public abstract org.apache.tuscany.sca.assembly.ComponentProperty getProperty(java.lang.String);
    public abstract java.lang.Boolean getAutowire();
    public abstract void setAutowire(java.lang.Boolean);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
}

Compiled from "ComponentProperty.java"
public interface org.apache.tuscany.sca.assembly.ComponentProperty extends org.apache.tuscany.sca.assembly.Property{
    public abstract org.apache.tuscany.sca.assembly.Property getProperty();
    public abstract void setProperty(org.apache.tuscany.sca.assembly.Property);
    public abstract java.lang.String getSource();
    public abstract void setSource(java.lang.String);
    public abstract javax.xml.xpath.XPathExpression getSourceXPathExpression();
    public abstract void setSourceXPathExpression(javax.xml.xpath.XPathExpression);
    public abstract java.lang.String getFile();
    public abstract void setFile(java.lang.String);
}

Compiled from "ComponentReference.java"
public interface org.apache.tuscany.sca.assembly.ComponentReference extends org.apache.tuscany.sca.assembly.Reference{
    public abstract org.apache.tuscany.sca.assembly.Reference getReference();
    public abstract void setReference(org.apache.tuscany.sca.assembly.Reference);
    public abstract java.lang.Boolean getAutowire();
    public abstract void setAutowire(java.lang.Boolean);
    public abstract org.apache.tuscany.sca.assembly.ComponentService getCallbackService();
    public abstract void setCallbackService(org.apache.tuscany.sca.assembly.ComponentService);
    public abstract boolean isNonOverridable();
    public abstract void setNonOverridable(boolean);
    public abstract void setPromoted(boolean);
    public abstract boolean isPromoted();
}

Compiled from "ComponentService.java"
public interface org.apache.tuscany.sca.assembly.ComponentService extends org.apache.tuscany.sca.assembly.Service{
    public abstract org.apache.tuscany.sca.assembly.Service getService();
    public abstract void setService(org.apache.tuscany.sca.assembly.Service);
    public abstract org.apache.tuscany.sca.assembly.ComponentReference getCallbackReference();
    public abstract void setCallbackReference(org.apache.tuscany.sca.assembly.ComponentReference);
}

Compiled from "ComponentType.java"
public interface org.apache.tuscany.sca.assembly.ComponentType extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.policy.PolicySubject{
    public abstract java.lang.String getURI();
    public abstract void setURI(java.lang.String);
    public abstract java.util.List getServices();
    public abstract org.apache.tuscany.sca.assembly.Service getService(java.lang.String);
    public abstract java.util.List getReferences();
    public abstract org.apache.tuscany.sca.assembly.Reference getReference(java.lang.String);
    public abstract java.util.List getProperties();
    public abstract org.apache.tuscany.sca.assembly.Property getProperty(java.lang.String);
}

Compiled from "Composite.java"
public interface org.apache.tuscany.sca.assembly.Composite extends org.apache.tuscany.sca.assembly.Implementation,org.apache.tuscany.sca.assembly.Extensible,java.lang.Cloneable,org.apache.tuscany.sca.policy.PolicySubject{
    public static final javax.xml.namespace.QName DOMAIN_COMPOSITE;
    public static final javax.xml.namespace.QName TYPE;
    public abstract java.lang.String getSpecVersion();
    public abstract void setSpecVersion(java.lang.String);
    public abstract javax.xml.namespace.QName getName();
    public abstract void setName(javax.xml.namespace.QName);
    public abstract java.util.List getIncludes();
    public abstract java.util.List getComponents();
    public abstract org.apache.tuscany.sca.assembly.Component getComponent(java.lang.String);
    public abstract java.util.List getWires();
    public abstract boolean isLocal();
    public abstract void setLocal(boolean);
    public abstract java.lang.Boolean getAutowire();
    public abstract void setAutowire(java.lang.Boolean);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    static {};
}

Compiled from "CompositeReference.java"
public interface org.apache.tuscany.sca.assembly.CompositeReference extends org.apache.tuscany.sca.assembly.Reference{
    public abstract java.util.List getPromotedComponents();
    public abstract java.util.List getPromotedReferences();
}

Compiled from "CompositeService.java"
public interface org.apache.tuscany.sca.assembly.CompositeService extends org.apache.tuscany.sca.assembly.Service{
    public abstract org.apache.tuscany.sca.assembly.Component getPromotedComponent();
    public abstract void setPromotedComponent(org.apache.tuscany.sca.assembly.Component);
    public abstract org.apache.tuscany.sca.assembly.ComponentService getPromotedService();
    public abstract void setPromotedService(org.apache.tuscany.sca.assembly.ComponentService);
}

Compiled from "ConfiguredOperation.java"
public interface org.apache.tuscany.sca.assembly.ConfiguredOperation extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.policy.PolicySubject{
    public abstract java.lang.String getName();
    public abstract void setName(java.lang.String);
    public abstract java.lang.String getContractName();
    public abstract void setContractName(java.lang.String);
}

Compiled from "Contract.java"
public interface org.apache.tuscany.sca.assembly.Contract extends org.apache.tuscany.sca.assembly.AbstractContract,org.apache.tuscany.sca.policy.PolicySubject,java.lang.Cloneable{
    public abstract java.util.List getBindings();
    public abstract java.lang.Object getBinding(java.lang.Class);
    public abstract java.lang.Object getCallbackBinding(java.lang.Class);
    public abstract org.apache.tuscany.sca.assembly.Callback getCallback();
    public abstract void setCallback(org.apache.tuscany.sca.assembly.Callback);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getInterfaceContract(org.apache.tuscany.sca.assembly.Binding);
    public abstract boolean isOverridingBindings();
    public abstract void setOverridingBindings(boolean);
}

Compiled from "DefaultAssemblyFactory.java"
public class org.apache.tuscany.sca.assembly.DefaultAssemblyFactory extends org.apache.tuscany.sca.assembly.impl.AssemblyFactoryImpl implements org.apache.tuscany.sca.assembly.AssemblyFactory{
    public org.apache.tuscany.sca.assembly.DefaultAssemblyFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.assembly.DefaultAssemblyFactory();
}

Compiled from "Endpoint.java"
public interface org.apache.tuscany.sca.assembly.Endpoint extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.policy.PolicySubject,java.lang.Cloneable,java.io.Serializable{
    public abstract java.lang.String getURI();
    public abstract void setURI(java.lang.String);
    public abstract org.apache.tuscany.sca.assembly.Component getComponent();
    public abstract void setComponent(org.apache.tuscany.sca.assembly.Component);
    public abstract org.apache.tuscany.sca.assembly.ComponentService getService();
    public abstract void setService(org.apache.tuscany.sca.assembly.ComponentService);
    public abstract org.apache.tuscany.sca.assembly.Binding getBinding();
    public abstract void setBinding(org.apache.tuscany.sca.assembly.Binding);
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getComponentServiceInterfaceContract();
    public abstract java.util.List getCallbackEndpointReferences();
    public abstract boolean isRemote();
    public abstract void setRemote(boolean);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public abstract boolean matches(java.lang.String);
    public abstract boolean isAsyncInvocation();
}

Compiled from "EndpointReference.java"
public interface org.apache.tuscany.sca.assembly.EndpointReference extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.policy.PolicySubject,java.lang.Cloneable,java.io.Serializable{
    public abstract java.lang.String getURI();
    public abstract void setURI(java.lang.String);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public abstract org.apache.tuscany.sca.assembly.Component getComponent();
    public abstract void setComponent(org.apache.tuscany.sca.assembly.Component);
    public abstract org.apache.tuscany.sca.assembly.ComponentReference getReference();
    public abstract void setReference(org.apache.tuscany.sca.assembly.ComponentReference);
    public abstract org.apache.tuscany.sca.assembly.Binding getBinding();
    public abstract void setBinding(org.apache.tuscany.sca.assembly.Binding);
    public abstract org.apache.tuscany.sca.assembly.Endpoint getTargetEndpoint();
    public abstract void setTargetEndpoint(org.apache.tuscany.sca.assembly.Endpoint);
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getComponentReferenceInterfaceContract();
    public abstract org.apache.tuscany.sca.assembly.Endpoint getCallbackEndpoint();
    public abstract void setCallbackEndpoint(org.apache.tuscany.sca.assembly.Endpoint);
    public abstract org.apache.tuscany.sca.assembly.EndpointReference$Status getStatus();
    public abstract void setStatus(org.apache.tuscany.sca.assembly.EndpointReference$Status);
    public abstract boolean isAsyncInvocation();
}

Compiled from "Extensible.java"
public interface org.apache.tuscany.sca.assembly.Extensible extends org.apache.tuscany.sca.assembly.Base{
    public abstract java.util.List getExtensions();
    public abstract java.util.List getAttributeExtensions();
}

Compiled from "Extension.java"
public interface org.apache.tuscany.sca.assembly.Extension{
    public abstract javax.xml.namespace.QName getQName();
    public abstract void setQName(javax.xml.namespace.QName);
    public abstract java.lang.Object getValue();
    public abstract void setValue(java.lang.Object);
    public abstract boolean isAttribute();
    public abstract void setAttribute(boolean);
}

Compiled from "Implementation.java"
public interface org.apache.tuscany.sca.assembly.Implementation extends org.apache.tuscany.sca.assembly.ComponentType{
    public abstract javax.xml.namespace.QName getType();
    public abstract java.util.List getOperations();
}

Compiled from "Multiplicity.java"
public final class org.apache.tuscany.sca.assembly.Multiplicity extends java.lang.Enum{
    public static final org.apache.tuscany.sca.assembly.Multiplicity ZERO_ONE;
    public static final org.apache.tuscany.sca.assembly.Multiplicity ONE_ONE;
    public static final org.apache.tuscany.sca.assembly.Multiplicity ZERO_N;
    public static final org.apache.tuscany.sca.assembly.Multiplicity ONE_N;
    public static org.apache.tuscany.sca.assembly.Multiplicity[] values();
    public static org.apache.tuscany.sca.assembly.Multiplicity valueOf(java.lang.String);
    static {};
}

Compiled from "OperationSelector.java"
public interface org.apache.tuscany.sca.assembly.OperationSelector extends org.apache.tuscany.sca.assembly.Base,java.lang.Cloneable{
}

Compiled from "OperationsConfigurator.java"
public interface org.apache.tuscany.sca.assembly.OperationsConfigurator{
    public abstract java.util.List getConfiguredOperations();
}

Compiled from "Property.java"
public interface org.apache.tuscany.sca.assembly.Property extends org.apache.tuscany.sca.assembly.AbstractProperty,java.lang.Cloneable{
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
}

Compiled from "Reference.java"
public interface org.apache.tuscany.sca.assembly.Reference extends org.apache.tuscany.sca.assembly.AbstractReference,org.apache.tuscany.sca.assembly.Contract{
    public abstract boolean isWiredByImpl();
    public abstract void setWiredByImpl(boolean);
    public abstract java.util.List getTargets();
    public abstract java.util.List getEndpointReferences();
    public abstract boolean isAllowsPassByReference();
    public abstract void setAllowsPassByReference(boolean);
}

Compiled from "SCABinding.java"
public interface org.apache.tuscany.sca.assembly.SCABinding extends org.apache.tuscany.sca.assembly.Binding{
    public static final javax.xml.namespace.QName TYPE;
    static {};
}

Compiled from "SCABindingFactory.java"
public interface org.apache.tuscany.sca.assembly.SCABindingFactory{
    public abstract org.apache.tuscany.sca.assembly.SCABinding createSCABinding();
}

Compiled from "Service.java"
public interface org.apache.tuscany.sca.assembly.Service extends org.apache.tuscany.sca.assembly.AbstractService,org.apache.tuscany.sca.assembly.Contract{
    public abstract java.util.List getEndpoints();
    public abstract boolean isJAXWSService();
    public abstract void setJAXWSService(boolean);
}

Compiled from "Wire.java"
public interface org.apache.tuscany.sca.assembly.Wire extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.assembly.Extensible,org.apache.tuscany.sca.policy.PolicySubject,java.lang.Cloneable{
    public abstract org.apache.tuscany.sca.assembly.ComponentReference getSource();
    public abstract void setSource(org.apache.tuscany.sca.assembly.ComponentReference);
    public abstract org.apache.tuscany.sca.assembly.ComponentService getTarget();
    public abstract void setTarget(org.apache.tuscany.sca.assembly.ComponentService);
    public abstract boolean isReplace();
    public abstract void setReplace(boolean);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
}

Compiled from "WireFormat.java"
public interface org.apache.tuscany.sca.assembly.WireFormat extends org.apache.tuscany.sca.assembly.Base,java.lang.Cloneable{
    public abstract javax.xml.namespace.QName getSchemaName();
}

Compiled from "DefaultDefinitionsFactory.java"
public class org.apache.tuscany.sca.definitions.DefaultDefinitionsFactory extends java.lang.Object implements org.apache.tuscany.sca.definitions.DefinitionsFactory{
    public org.apache.tuscany.sca.definitions.DefaultDefinitionsFactory();
    public org.apache.tuscany.sca.definitions.Definitions createDefinitions();
}

Compiled from "Definitions.java"
public interface org.apache.tuscany.sca.definitions.Definitions{
    public abstract java.lang.String getTargetNamespace();
    public abstract void setTargetNamespace(java.lang.String);
    public abstract java.util.List getIntents();
    public abstract java.util.List getPolicySets();
    public abstract java.util.List getBindingTypes();
    public abstract java.util.List getImplementationTypes();
    public abstract java.util.List getBindings();
    public abstract java.util.List getExternalAttachments();
}

Compiled from "DefinitionsBuilder.java"
public interface org.apache.tuscany.sca.definitions.DefinitionsBuilder{
    public abstract void build(org.apache.tuscany.sca.definitions.Definitions)       throws org.apache.tuscany.sca.definitions.DefinitionsBuilderException;
}

Compiled from "DefinitionsBuilderException.java"
public class org.apache.tuscany.sca.definitions.DefinitionsBuilderException extends java.lang.Exception{
    public org.apache.tuscany.sca.definitions.DefinitionsBuilderException();
    public org.apache.tuscany.sca.definitions.DefinitionsBuilderException(java.lang.String);
    public org.apache.tuscany.sca.definitions.DefinitionsBuilderException(java.lang.Throwable);
    public org.apache.tuscany.sca.definitions.DefinitionsBuilderException(java.lang.String, java.lang.Throwable);
}

Compiled from "DefinitionsFactory.java"
public interface org.apache.tuscany.sca.definitions.DefinitionsFactory{
    public abstract org.apache.tuscany.sca.definitions.Definitions createDefinitions();
}

Compiled from "Compatibility.java"
public final class org.apache.tuscany.sca.interfacedef.Compatibility extends java.lang.Enum{
    public static final org.apache.tuscany.sca.interfacedef.Compatibility SUPERSET;
    public static final org.apache.tuscany.sca.interfacedef.Compatibility SUBSET;
    public static final org.apache.tuscany.sca.interfacedef.Compatibility MUTUAL;
    public static final org.apache.tuscany.sca.interfacedef.Compatibility INCOMPATIBLE;
    public static org.apache.tuscany.sca.interfacedef.Compatibility[] values();
    public static org.apache.tuscany.sca.interfacedef.Compatibility valueOf(java.lang.String);
    static {};
}

Compiled from "DataType.java"
public interface org.apache.tuscany.sca.interfacedef.DataType extends java.lang.Cloneable{
    public abstract void setPhysical(java.lang.Class);
    public abstract java.lang.Class getPhysical();
    public abstract java.lang.reflect.Type getGenericType();
    public abstract void setGenericType(java.lang.reflect.Type);
    public abstract java.lang.Object getLogical();
    public abstract java.lang.String getDataBinding();
    public abstract void setDataBinding(java.lang.String);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public abstract void setLogical(java.lang.Object);
    public abstract java.lang.Object getMetaData(java.lang.Class);
    public abstract void setMetaData(java.lang.Class, java.lang.Object);
}

Compiled from "FaultExceptionMapper.java"
public interface org.apache.tuscany.sca.interfacedef.FaultExceptionMapper{
    public abstract boolean introspectFaultDataType(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public abstract java.lang.Throwable wrapFaultInfo(org.apache.tuscany.sca.interfacedef.DataType, java.lang.String, java.lang.Object, java.lang.Throwable, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract java.lang.Object getFaultInfo(java.lang.Throwable, java.lang.Class, org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "IncompatibleInterfaceContractException.java"
public class org.apache.tuscany.sca.interfacedef.IncompatibleInterfaceContractException extends java.lang.Exception{
    public org.apache.tuscany.sca.interfacedef.IncompatibleInterfaceContractException(java.lang.String, org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.InterfaceContract);
    public org.apache.tuscany.sca.interfacedef.IncompatibleInterfaceContractException(java.lang.String, org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public org.apache.tuscany.sca.interfacedef.InterfaceContract getTarget();
    public org.apache.tuscany.sca.interfacedef.InterfaceContract getSource();
    public org.apache.tuscany.sca.interfacedef.Operation getSourceOperation();
    public org.apache.tuscany.sca.interfacedef.Operation getTargetOperation();
}

Compiled from "Interface.java"
public interface org.apache.tuscany.sca.interfacedef.Interface extends java.lang.Cloneable,org.apache.tuscany.sca.policy.PolicySubject{
    public abstract boolean isRemotable();
    public abstract void setRemotable(boolean);
    public abstract boolean isRemotableSet();
    public abstract java.util.List getOperations();
    public abstract void setDefaultDataBinding(java.lang.String);
    public abstract void resetDataBinding(java.lang.String);
    public abstract void resetInterfaceInputTypes(org.apache.tuscany.sca.interfacedef.Interface);
    public abstract void resetInterfaceOutputTypes(org.apache.tuscany.sca.interfacedef.Interface);
    public abstract boolean isDynamic();
    public abstract java.util.Map getAttributes();
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
}

Compiled from "InterfaceContract.java"
public interface org.apache.tuscany.sca.interfacedef.InterfaceContract extends java.lang.Cloneable{
    public abstract org.apache.tuscany.sca.interfacedef.Interface getInterface();
    public abstract void setInterface(org.apache.tuscany.sca.interfacedef.Interface);
    public abstract org.apache.tuscany.sca.interfacedef.Interface getCallbackInterface();
    public abstract void setCallbackInterface(org.apache.tuscany.sca.interfacedef.Interface);
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract makeUnidirectional(boolean);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getNormalizedWSDLContract();
    public abstract void setNormailizedWSDLContract(org.apache.tuscany.sca.interfacedef.InterfaceContract);
}

Compiled from "InterfaceContractMapper.java"
public interface org.apache.tuscany.sca.interfacedef.InterfaceContractMapper{
    public abstract boolean checkCompatibility(org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.Compatibility, boolean, boolean)       throws org.apache.tuscany.sca.interfacedef.IncompatibleInterfaceContractException;
    public abstract boolean checkCompatibility(org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.Compatibility, boolean, boolean, org.apache.tuscany.sca.interfacedef.util.Audit)       throws org.apache.tuscany.sca.interfacedef.IncompatibleInterfaceContractException;
    public abstract boolean isCompatible(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, boolean);
    public abstract boolean isCompatible(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Compatibility);
    public abstract boolean isCompatibleByReference(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Compatibility);
    public abstract boolean isCompatibleByValue(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Compatibility);
    public abstract boolean isCompatibleWithoutUnwrapByValue(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Compatibility);
    public abstract boolean isCompatibleSubset(org.apache.tuscany.sca.interfacedef.Interface, org.apache.tuscany.sca.interfacedef.Interface);
    public abstract boolean isCompatibleSubset(org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.InterfaceContract);
    public abstract boolean isCompatibleSubset(org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.util.Audit);
    public abstract boolean isMutuallyCompatible(org.apache.tuscany.sca.interfacedef.Interface, org.apache.tuscany.sca.interfacedef.Interface);
    public abstract boolean isMutuallyCompatible(org.apache.tuscany.sca.interfacedef.InterfaceContract, org.apache.tuscany.sca.interfacedef.InterfaceContract);
    public abstract org.apache.tuscany.sca.interfacedef.Operation map(org.apache.tuscany.sca.interfacedef.Interface, org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "InvalidAnnotationException.java"
public class org.apache.tuscany.sca.interfacedef.InvalidAnnotationException extends org.apache.tuscany.sca.interfacedef.InvalidInterfaceException{
    public org.apache.tuscany.sca.interfacedef.InvalidAnnotationException(java.lang.String, java.lang.Class);
    public java.lang.Class getAnnotation();
}

Compiled from "InvalidCallbackException.java"
public class org.apache.tuscany.sca.interfacedef.InvalidCallbackException extends org.apache.tuscany.sca.interfacedef.InvalidInterfaceException{
    public org.apache.tuscany.sca.interfacedef.InvalidCallbackException(java.lang.String);
}

Compiled from "InvalidInterfaceException.java"
public abstract class org.apache.tuscany.sca.interfacedef.InvalidInterfaceException extends java.lang.Exception{
    public org.apache.tuscany.sca.interfacedef.InvalidInterfaceException();
    public org.apache.tuscany.sca.interfacedef.InvalidInterfaceException(java.lang.String);
    public org.apache.tuscany.sca.interfacedef.InvalidInterfaceException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.interfacedef.InvalidInterfaceException(java.lang.Throwable);
}

Compiled from "InvalidOperationException.java"
public class org.apache.tuscany.sca.interfacedef.InvalidOperationException extends org.apache.tuscany.sca.interfacedef.InvalidInterfaceException{
    public org.apache.tuscany.sca.interfacedef.InvalidOperationException(java.lang.String, java.lang.reflect.Method);
    public java.lang.reflect.Method getOperation();
}

Compiled from "Operation.java"
public interface org.apache.tuscany.sca.interfacedef.Operation extends java.lang.Cloneable,org.apache.tuscany.sca.policy.PolicySubject{
    public static final java.lang.String IDL_INPUT;
    public static final java.lang.String IDL_OUTPUT;
    public static final java.lang.String IDL_FAULT;
    public abstract java.lang.String getName();
    public abstract void setName(java.lang.String);
    public abstract boolean isUnresolved();
    public abstract void setUnresolved(boolean);
    public abstract org.apache.tuscany.sca.interfacedef.DataType getInputType();
    public abstract void setInputType(org.apache.tuscany.sca.interfacedef.DataType);
    public abstract org.apache.tuscany.sca.interfacedef.DataType getOutputType();
    public abstract void setOutputType(org.apache.tuscany.sca.interfacedef.DataType);
    public abstract java.util.List getFaultTypes();
    public abstract void setFaultTypes(java.util.List);
    public abstract org.apache.tuscany.sca.interfacedef.Interface getInterface();
    public abstract void setInterface(org.apache.tuscany.sca.interfacedef.Interface);
    public abstract boolean isNonBlocking();
    public abstract boolean isAsyncServer();
    public abstract void setNonBlocking(boolean);
    public abstract org.apache.tuscany.sca.interfacedef.util.WrapperInfo getWrapper();
    public abstract void setWrapper(org.apache.tuscany.sca.interfacedef.util.WrapperInfo);
    public abstract boolean isWrapperStyle();
    public abstract void setWrapperStyle(boolean);
    public abstract java.lang.String getDataBinding();
    public abstract void setDataBinding(java.lang.String);
    public abstract boolean isDynamic();
    public abstract void setDynamic(boolean);
    public abstract java.util.Map getFaultBeans();
    public abstract void setFaultBeans(java.util.Map);
    public abstract java.util.Map getAttributes();
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public abstract java.util.List getParameterModes();
    public abstract boolean hasArrayWrappedOutput();
    public abstract void setHasArrayWrappedOutput(boolean);
    public abstract void setNotSubjectToWrapping(boolean);
    public abstract boolean isNotSubjectToWrapping();
}

Compiled from "OverloadedOperationException.java"
public class org.apache.tuscany.sca.interfacedef.OverloadedOperationException extends org.apache.tuscany.sca.interfacedef.InvalidInterfaceException{
    public org.apache.tuscany.sca.interfacedef.OverloadedOperationException(java.lang.reflect.Method);
    public java.lang.reflect.Method getOperation();
}

Compiled from "ParameterMode.java"
public final class org.apache.tuscany.sca.interfacedef.ParameterMode extends java.lang.Enum{
    public static final org.apache.tuscany.sca.interfacedef.ParameterMode IN;
    public static final org.apache.tuscany.sca.interfacedef.ParameterMode OUT;
    public static final org.apache.tuscany.sca.interfacedef.ParameterMode INOUT;
    public static org.apache.tuscany.sca.interfacedef.ParameterMode[] values();
    public static org.apache.tuscany.sca.interfacedef.ParameterMode valueOf(java.lang.String);
    static {};
}

Compiled from "BindingType.java"
public interface org.apache.tuscany.sca.policy.BindingType extends org.apache.tuscany.sca.policy.ExtensionType{
}

Compiled from "DefaultPolicyFactory.java"
public class org.apache.tuscany.sca.policy.DefaultPolicyFactory extends org.apache.tuscany.sca.policy.impl.PolicyFactoryImpl implements org.apache.tuscany.sca.policy.PolicyFactory{
    public org.apache.tuscany.sca.policy.DefaultPolicyFactory();
}

Compiled from "ExtensionType.java"
public interface org.apache.tuscany.sca.policy.ExtensionType{
    public static final javax.xml.namespace.QName BINDING_BASE;
    public static final javax.xml.namespace.QName IMPLEMENTATION_BASE;
    public abstract javax.xml.namespace.QName getType();
    public abstract void setType(javax.xml.namespace.QName);
    public abstract javax.xml.namespace.QName getBaseType();
    public abstract java.util.List getAlwaysProvidedIntents();
    public abstract java.util.List getMayProvidedIntents();
    public abstract boolean isUnresolved();
    public abstract void setUnresolved(boolean);
    static {};
}

Compiled from "ExternalAttachment.java"
public interface org.apache.tuscany.sca.policy.ExternalAttachment{
    public abstract java.lang.String getAttachTo();
    public abstract void setAttachTo(java.lang.String);
    public abstract javax.xml.xpath.XPathExpression getAttachToXPathExpression();
    public abstract void setAttachToXPathExpression(javax.xml.xpath.XPathExpression);
    public abstract java.util.List getPolicySets();
    public abstract java.util.List getIntents();
    public abstract boolean isUnresolved();
    public abstract void setUnresolved(boolean);
}

Compiled from "ImplementationType.java"
public interface org.apache.tuscany.sca.policy.ImplementationType extends org.apache.tuscany.sca.policy.ExtensionType{
}

Compiled from "Intent.java"
public interface org.apache.tuscany.sca.policy.Intent{
    public abstract javax.xml.namespace.QName getName();
    public abstract void setName(javax.xml.namespace.QName);
    public abstract java.util.List getConstrainedTypes();
    public abstract java.util.List getRequiredIntents();
    public abstract java.util.List getExcludedIntents();
    public abstract java.util.List getQualifiedIntents();
    public abstract org.apache.tuscany.sca.policy.Intent getDefaultQualifiedIntent();
    public abstract void setDefaultQualifiedIntent(org.apache.tuscany.sca.policy.Intent);
    public abstract org.apache.tuscany.sca.policy.Intent$Type getType();
    public abstract void setType(org.apache.tuscany.sca.policy.Intent$Type);
    public abstract boolean isMutuallyExclusive();
    public abstract void setMutuallyExclusive(boolean);
    public abstract java.lang.String getDescription();
    public abstract void setDescription(java.lang.String);
    public abstract org.apache.tuscany.sca.policy.Intent getQualifiableIntent();
    public abstract void setQualifiableIntent(org.apache.tuscany.sca.policy.Intent);
    public abstract boolean isUnresolved();
    public abstract void setUnresolved(boolean);
}

Compiled from "IntentMap.java"
public interface org.apache.tuscany.sca.policy.IntentMap{
    public abstract org.apache.tuscany.sca.policy.Intent getProvidedIntent();
    public abstract void setProvidedIntent(org.apache.tuscany.sca.policy.Intent);
    public abstract java.util.List getQualifiers();
}

Compiled from "PolicyAttachment.java"
public interface org.apache.tuscany.sca.policy.PolicyAttachment{
    public abstract org.apache.tuscany.sca.policy.PolicySet getPolicySet();
    public abstract void setPolicySet(org.apache.tuscany.sca.policy.PolicySet);
    public abstract java.util.List getPolicySubjects();
}

Compiled from "PolicyContainer.java"
public interface org.apache.tuscany.sca.policy.PolicyContainer{
    public abstract java.lang.Object getChildPolicy(java.lang.Class);
}

Compiled from "PolicyExpression.java"
public interface org.apache.tuscany.sca.policy.PolicyExpression{
    public abstract javax.xml.namespace.QName getName();
    public abstract void setName(javax.xml.namespace.QName);
    public abstract java.lang.Object getPolicy();
    public abstract void setPolicy(java.lang.Object);
    public abstract void setUnresolved(boolean);
    public abstract boolean isUnresolved();
}

Compiled from "PolicyFactory.java"
public interface org.apache.tuscany.sca.policy.PolicyFactory{
    public abstract org.apache.tuscany.sca.policy.Intent createIntent();
    public abstract org.apache.tuscany.sca.policy.PolicySet createPolicySet();
    public abstract org.apache.tuscany.sca.policy.IntentMap createIntentMap();
    public abstract org.apache.tuscany.sca.policy.Qualifier createQualifier();
    public abstract org.apache.tuscany.sca.policy.PolicyExpression createPolicyExpression();
    public abstract org.apache.tuscany.sca.policy.ExtensionType createExtensionType();
    public abstract org.apache.tuscany.sca.policy.BindingType createBindingType();
    public abstract org.apache.tuscany.sca.policy.ImplementationType createImplementationType();
    public abstract org.apache.tuscany.sca.policy.ExternalAttachment createExternalAttachment();
}

Compiled from "PolicySet.java"
public interface org.apache.tuscany.sca.policy.PolicySet{
    public abstract javax.xml.namespace.QName getName();
    public abstract void setName(javax.xml.namespace.QName);
    public abstract java.util.List getReferencedPolicySets();
    public abstract java.util.List getProvidedIntents();
    public abstract java.util.List getPolicies();
    public abstract boolean isUnresolved();
    public abstract void setUnresolved(boolean);
    public abstract java.lang.String getAppliesTo();
    public abstract void setAppliesTo(java.lang.String);
    public abstract java.lang.String getAttachTo();
    public abstract void setAttachTo(java.lang.String);
    public abstract javax.xml.xpath.XPathExpression getAttachToXPathExpression();
    public abstract void setAttachToXPathExpression(javax.xml.xpath.XPathExpression);
    public abstract java.util.List getIntentMaps();
    public abstract javax.xml.xpath.XPathExpression getAppliesToXPathExpression();
    public abstract void setAppliesToXPathExpression(javax.xml.xpath.XPathExpression);
    public abstract boolean isExternalAttachment();
    public abstract void setIsExternalAttachment(boolean);
}

Compiled from "PolicySubject.java"
public interface org.apache.tuscany.sca.policy.PolicySubject{
    public abstract java.util.List getRequiredIntents();
    public abstract java.util.List getPolicySets();
    public abstract org.apache.tuscany.sca.policy.ExtensionType getExtensionType();
    public abstract void setExtensionType(org.apache.tuscany.sca.policy.ExtensionType);
}

Compiled from "Qualifier.java"
public interface org.apache.tuscany.sca.policy.Qualifier{
    public abstract org.apache.tuscany.sca.policy.Intent getIntent();
    public abstract void setIntent(org.apache.tuscany.sca.policy.Intent);
    public abstract java.util.List getPolicies();
}

Compiled from "Artifact.java"
public interface org.apache.tuscany.sca.contribution.Artifact extends org.apache.tuscany.sca.assembly.Base{
    public abstract java.lang.String getURI();
    public abstract void setURI(java.lang.String);
    public abstract java.lang.String getLocation();
    public abstract void setLocation(java.lang.String);
    public abstract java.lang.Object getModel();
    public abstract void setModel(java.lang.Object);
}

Compiled from "ContentType.java"
public interface org.apache.tuscany.sca.contribution.ContentType{
    public static final java.lang.String JAR;
    public static final java.lang.String FOLDER;
}

Compiled from "Contribution.java"
public interface org.apache.tuscany.sca.contribution.Contribution extends org.apache.tuscany.sca.contribution.Artifact,org.apache.tuscany.sca.assembly.Extensible{
    public static final java.lang.String SCA_CONTRIBUTION_META;
    public static final java.lang.String SCA_CONTRIBUTION_GENERATED_META;
    public abstract java.util.List getExports();
    public abstract java.util.List getImports();
    public abstract java.util.List getDeployables();
    public abstract java.util.List getArtifacts();
    public abstract org.apache.tuscany.sca.contribution.resolver.ModelResolver getModelResolver();
    public abstract void setModelResolver(org.apache.tuscany.sca.contribution.resolver.ModelResolver);
    public abstract java.util.List getDependencies();
    public abstract java.lang.ClassLoader getClassLoader();
    public abstract void setClassLoader(java.lang.ClassLoader);
    public abstract java.util.Set getTypes();
}

Compiled from "ContributionFactory.java"
public interface org.apache.tuscany.sca.contribution.ContributionFactory{
    public abstract org.apache.tuscany.sca.contribution.Contribution createContribution();
    public abstract org.apache.tuscany.sca.contribution.ContributionMetadata createContributionMetadata();
    public abstract org.apache.tuscany.sca.contribution.Artifact createArtifact();
    public abstract org.apache.tuscany.sca.contribution.DefaultImport createDefaultImport();
    public abstract org.apache.tuscany.sca.contribution.DefaultExport createDefaultExport();
}

Compiled from "ContributionMetadata.java"
public interface org.apache.tuscany.sca.contribution.ContributionMetadata extends org.apache.tuscany.sca.assembly.Base,org.apache.tuscany.sca.assembly.Extensible{
    public abstract java.lang.String getSpecVersion();
    public abstract void setSpecVersion(java.lang.String);
    public abstract java.util.List getExports();
    public abstract java.util.List getImports();
    public abstract java.util.List getDeployables();
}

Compiled from "DefaultContributionFactory.java"
public class org.apache.tuscany.sca.contribution.DefaultContributionFactory extends org.apache.tuscany.sca.contribution.impl.ContributionFactoryImpl{
    public org.apache.tuscany.sca.contribution.DefaultContributionFactory();
}

Compiled from "DefaultExport.java"
public interface org.apache.tuscany.sca.contribution.DefaultExport extends org.apache.tuscany.sca.contribution.Export{
}

Compiled from "DefaultImport.java"
public interface org.apache.tuscany.sca.contribution.DefaultImport extends org.apache.tuscany.sca.contribution.Import{
}

Compiled from "Export.java"
public interface org.apache.tuscany.sca.contribution.Export extends org.apache.tuscany.sca.assembly.Extensible{
    public abstract org.apache.tuscany.sca.contribution.resolver.ModelResolver getModelResolver();
    public abstract void setModelResolver(org.apache.tuscany.sca.contribution.resolver.ModelResolver);
}

Compiled from "Import.java"
public interface org.apache.tuscany.sca.contribution.Import extends org.apache.tuscany.sca.assembly.Extensible{
    public abstract org.apache.tuscany.sca.contribution.resolver.ModelResolver getModelResolver();
    public abstract void setModelResolver(org.apache.tuscany.sca.contribution.resolver.ModelResolver);
    public abstract boolean match(org.apache.tuscany.sca.contribution.Export);
}

Compiled from "PackageType.java"
public interface org.apache.tuscany.sca.contribution.PackageType{
    public static final java.lang.String JAR;
    public static final java.lang.String ZIP;
    public static final java.lang.String FOLDER;
    public static final java.lang.String BUNDLE;
    public static final java.lang.String WAR;
    public static final java.lang.String EAR;
}

Compiled from "ArtifactProcessor.java"
public interface org.apache.tuscany.sca.contribution.processor.ArtifactProcessor{
    public abstract void resolve(java.lang.Object, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
    public abstract java.lang.Class getModelType();
}

Compiled from "BaseStAXArtifactProcessor.java"
public abstract class org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor extends java.lang.Object{
    public org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor();
    protected javax.xml.namespace.QName getQNameValue(javax.xml.stream.XMLStreamReader, java.lang.String);
    protected boolean getBoolean(javax.xml.stream.XMLStreamReader, java.lang.String);
    protected javax.xml.namespace.QName getQName(javax.xml.stream.XMLStreamReader, java.lang.String);
    protected java.util.List getQNames(javax.xml.stream.XMLStreamReader, java.lang.String);
    protected java.lang.String getString(javax.xml.stream.XMLStreamReader, java.lang.String);
    protected java.lang.String getURIString(javax.xml.stream.XMLStreamReader, java.lang.String);
    protected boolean isSet(javax.xml.stream.XMLStreamReader, java.lang.String);
    protected javax.xml.namespace.QName getXSIType(javax.xml.stream.XMLStreamReader);
    protected boolean nextChildElement(javax.xml.stream.XMLStreamReader)       throws javax.xml.stream.XMLStreamException;
    protected void skipToEndElement(javax.xml.stream.XMLStreamReader)       throws javax.xml.stream.XMLStreamException;
    protected void writeStart(javax.xml.stream.XMLStreamWriter, java.lang.String, java.lang.String, org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor$XAttr[])       throws javax.xml.stream.XMLStreamException;
    protected void writeStart(javax.xml.stream.XMLStreamWriter, javax.xml.namespace.QName, org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor$XAttr[])       throws javax.xml.stream.XMLStreamException;
    protected void writeEnd(javax.xml.stream.XMLStreamWriter)       throws javax.xml.stream.XMLStreamException;
    protected void writeStartDocument(javax.xml.stream.XMLStreamWriter, java.lang.String, java.lang.String, org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor$XAttr[])       throws javax.xml.stream.XMLStreamException;
    protected void writeStartDocument(javax.xml.stream.XMLStreamWriter, javax.xml.namespace.QName, org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor$XAttr[])       throws javax.xml.stream.XMLStreamException;
    protected void writeEndDocument(javax.xml.stream.XMLStreamWriter)       throws javax.xml.stream.XMLStreamException;
    protected void writeAttributes(javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor$XAttr[])       throws javax.xml.stream.XMLStreamException;
    protected void readExtendedAttributes(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.assembly.Extensible, org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor, org.apache.tuscany.sca.assembly.AssemblyFactory, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    protected void writeExtendedAttributes(javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.assembly.Extensible, org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException, javax.xml.stream.XMLStreamException;
    protected void readExtendedElement(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.assembly.Extensible, org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    protected void writeExtendedElements(javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.assembly.Extensible, org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException, javax.xml.stream.XMLStreamException;
    static org.apache.tuscany.sca.common.xml.stax.StAXHelper access$000();
    static {};
}

Compiled from "ContributionException.java"
public class org.apache.tuscany.sca.contribution.processor.ContributionException extends java.lang.Exception{
    protected org.apache.tuscany.sca.contribution.processor.ContributionException();
    protected org.apache.tuscany.sca.contribution.processor.ContributionException(java.lang.String);
    protected org.apache.tuscany.sca.contribution.processor.ContributionException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.contribution.processor.ContributionException(java.lang.Throwable);
}

Compiled from "ContributionReadException.java"
public class org.apache.tuscany.sca.contribution.processor.ContributionReadException extends org.apache.tuscany.sca.contribution.processor.ContributionException{
    public static final int UNDEFINED;
    public org.apache.tuscany.sca.contribution.processor.ContributionReadException(java.lang.String);
    public org.apache.tuscany.sca.contribution.processor.ContributionReadException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.contribution.processor.ContributionReadException(java.lang.Throwable);
    public java.lang.String getResourceURI();
    public void setResourceURI(java.lang.String);
    public int getLine();
    public void setLine(int);
    public int getColumn();
    public void setColumn(int);
}

Compiled from "ContributionResolveException.java"
public class org.apache.tuscany.sca.contribution.processor.ContributionResolveException extends org.apache.tuscany.sca.contribution.processor.ContributionException{
    public org.apache.tuscany.sca.contribution.processor.ContributionResolveException(java.lang.String);
    public org.apache.tuscany.sca.contribution.processor.ContributionResolveException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.contribution.processor.ContributionResolveException(java.lang.Throwable);
}

Compiled from "ContributionRuntimeException.java"
public class org.apache.tuscany.sca.contribution.processor.ContributionRuntimeException extends java.lang.RuntimeException{
    protected org.apache.tuscany.sca.contribution.processor.ContributionRuntimeException();
    protected org.apache.tuscany.sca.contribution.processor.ContributionRuntimeException(java.lang.String);
    protected org.apache.tuscany.sca.contribution.processor.ContributionRuntimeException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.contribution.processor.ContributionRuntimeException(java.lang.Throwable);
}

Compiled from "ContributionWriteException.java"
public class org.apache.tuscany.sca.contribution.processor.ContributionWriteException extends org.apache.tuscany.sca.contribution.processor.ContributionException{
    public org.apache.tuscany.sca.contribution.processor.ContributionWriteException(java.lang.String);
    public org.apache.tuscany.sca.contribution.processor.ContributionWriteException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.contribution.processor.ContributionWriteException(java.lang.Throwable);
    public java.lang.String getResourceURI();
    public void setResourceURI(java.lang.String);
}

Compiled from "DefaultArtifactProcessorExtensionPoint.java"
abstract class org.apache.tuscany.sca.contribution.processor.DefaultArtifactProcessorExtensionPoint extends java.lang.Object{
    protected final java.util.Map processorsByArtifactType;
    protected final java.util.Map processorsByModelType;
    org.apache.tuscany.sca.contribution.processor.DefaultArtifactProcessorExtensionPoint();
    public org.apache.tuscany.sca.contribution.processor.ArtifactProcessor getProcessor(java.lang.Object);
    public org.apache.tuscany.sca.contribution.processor.ArtifactProcessor getProcessor(java.lang.Class);
}

Compiled from "DefaultStAXArtifactProcessorExtensionPoint.java"
public class org.apache.tuscany.sca.contribution.processor.DefaultStAXArtifactProcessorExtensionPoint extends org.apache.tuscany.sca.contribution.processor.DefaultArtifactProcessorExtensionPoint implements org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint{
    public org.apache.tuscany.sca.contribution.processor.DefaultStAXArtifactProcessorExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor);
    public void removeArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor);
    public org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor getProcessor(java.lang.Class);
    public org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor getProcessor(java.lang.Object);
    public org.apache.tuscany.sca.contribution.processor.ArtifactProcessor getProcessor(java.lang.Class);
    public org.apache.tuscany.sca.contribution.processor.ArtifactProcessor getProcessor(java.lang.Object);
}

Compiled from "DefaultStAXAttributeProcessorExtensionPoint.java"
public class org.apache.tuscany.sca.contribution.processor.DefaultStAXAttributeProcessorExtensionPoint extends org.apache.tuscany.sca.contribution.processor.DefaultArtifactProcessorExtensionPoint implements org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessorExtensionPoint{
    public org.apache.tuscany.sca.contribution.processor.DefaultStAXAttributeProcessorExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor);
    public void removeArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor);
    public org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor getProcessor(java.lang.Class);
    public org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor getProcessor(java.lang.Object);
    public org.apache.tuscany.sca.contribution.processor.ArtifactProcessor getProcessor(java.lang.Class);
    public org.apache.tuscany.sca.contribution.processor.ArtifactProcessor getProcessor(java.lang.Object);
}

Compiled from "DefaultURLArtifactProcessorExtensionPoint.java"
public class org.apache.tuscany.sca.contribution.processor.DefaultURLArtifactProcessorExtensionPoint extends org.apache.tuscany.sca.contribution.processor.DefaultArtifactProcessorExtensionPoint implements org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint{
    public org.apache.tuscany.sca.contribution.processor.DefaultURLArtifactProcessorExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addArtifactProcessor(org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor);
    public void removeArtifactProcessor(org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor);
    public org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor getProcessor(java.lang.Class);
    public java.util.Collection getProcessors(java.lang.Object);
    public org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor getProcessor(java.lang.Object);
    public org.apache.tuscany.sca.contribution.processor.ArtifactProcessor getProcessor(java.lang.Class);
    public org.apache.tuscany.sca.contribution.processor.ArtifactProcessor getProcessor(java.lang.Object);
}

Compiled from "DefaultValidatingXMLInputFactory.java"
public class org.apache.tuscany.sca.contribution.processor.DefaultValidatingXMLInputFactory extends org.apache.tuscany.sca.contribution.processor.ValidatingXMLInputFactory implements org.w3c.dom.ls.LSResourceResolver{
    public static final javax.xml.namespace.QName XSD;
    public org.apache.tuscany.sca.contribution.processor.DefaultValidatingXMLInputFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.contribution.processor.DefaultValidatingXMLInputFactory(javax.xml.stream.XMLInputFactory, org.apache.tuscany.sca.contribution.processor.ValidationSchemaExtensionPoint);
    public javax.xml.stream.XMLEventReader createFilteredReader(javax.xml.stream.XMLEventReader, javax.xml.stream.EventFilter)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLStreamReader createFilteredReader(javax.xml.stream.XMLStreamReader, javax.xml.stream.StreamFilter)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLEventReader createXMLEventReader(java.io.InputStream, java.lang.String)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLEventReader createXMLEventReader(java.io.InputStream)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLEventReader createXMLEventReader(java.io.Reader)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLEventReader createXMLEventReader(javax.xml.transform.Source)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLEventReader createXMLEventReader(java.lang.String, java.io.InputStream)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLEventReader createXMLEventReader(java.lang.String, java.io.Reader)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLEventReader createXMLEventReader(javax.xml.stream.XMLStreamReader)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLStreamReader createXMLStreamReader(java.io.InputStream, java.lang.String)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLStreamReader createXMLStreamReader(java.io.InputStream)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLStreamReader createXMLStreamReader(java.io.Reader)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLStreamReader createXMLStreamReader(javax.xml.transform.Source)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLStreamReader createXMLStreamReader(java.lang.String, java.io.InputStream)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.XMLStreamReader createXMLStreamReader(java.lang.String, java.io.Reader)       throws javax.xml.stream.XMLStreamException;
    public javax.xml.stream.util.XMLEventAllocator getEventAllocator();
    public java.lang.Object getProperty(java.lang.String)       throws java.lang.IllegalArgumentException;
    public javax.xml.stream.XMLReporter getXMLReporter();
    public javax.xml.stream.XMLResolver getXMLResolver();
    public boolean isPropertySupported(java.lang.String);
    public void setEventAllocator(javax.xml.stream.util.XMLEventAllocator);
    public void setProperty(java.lang.String, java.lang.Object)       throws java.lang.IllegalArgumentException;
    public void setXMLReporter(javax.xml.stream.XMLReporter);
    public void setXMLResolver(javax.xml.stream.XMLResolver);
    public org.w3c.dom.ls.LSInput resolveResource(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String);
    static {};
}

Compiled from "DefaultValidationSchemaExtensionPoint.java"
public class org.apache.tuscany.sca.contribution.processor.DefaultValidationSchemaExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.contribution.processor.ValidationSchemaExtensionPoint{
    public org.apache.tuscany.sca.contribution.processor.DefaultValidationSchemaExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry, java.util.Map);
    public void addSchema(java.lang.String);
    public void removeSchema(java.lang.String);
    public java.util.List getSchemas();
    public boolean isEnabled();
    public void setEnabled(boolean);
}

Compiled from "ExtendedArtifactProcessor.java"
public interface org.apache.tuscany.sca.contribution.processor.ExtendedArtifactProcessor extends org.apache.tuscany.sca.contribution.processor.ArtifactProcessor{
    public abstract void preResolve(java.lang.Object, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
}

Compiled from "ExtendedURLArtifactProcessor.java"
public interface org.apache.tuscany.sca.contribution.processor.ExtendedURLArtifactProcessor extends org.apache.tuscany.sca.contribution.processor.ExtendedArtifactProcessor,org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor{
}

Compiled from "ExtensibleStAXArtifactProcessor.java"
public class org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor extends java.lang.Object implements org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor{
    public static final javax.xml.namespace.QName ANY_ELEMENT;
    public org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint, javax.xml.stream.XMLInputFactory, javax.xml.stream.XMLOutputFactory);
    public org.apache.tuscany.sca.contribution.processor.ExtensibleStAXArtifactProcessor(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public java.lang.Object read(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    public void write(java.lang.Object, javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException, javax.xml.stream.XMLStreamException;
    public void resolve(java.lang.Object, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
    public java.lang.Object read(java.io.InputStream, java.lang.Class, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public void write(java.lang.Object, java.io.OutputStream, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
    public javax.xml.namespace.QName getArtifactType();
    public java.lang.Class getModelType();
    static {};
}

Compiled from "ExtensibleStAXAttributeProcessor.java"
public class org.apache.tuscany.sca.contribution.processor.ExtensibleStAXAttributeProcessor extends java.lang.Object implements org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor{
    public static final javax.xml.namespace.QName ANY_ATTRIBUTE;
    public org.apache.tuscany.sca.contribution.processor.ExtensibleStAXAttributeProcessor(org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessorExtensionPoint, javax.xml.stream.XMLInputFactory, javax.xml.stream.XMLOutputFactory);
    public java.lang.Object read(javax.xml.namespace.QName, javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    public void write(java.lang.Object, javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException, javax.xml.stream.XMLStreamException;
    public void resolve(java.lang.Object, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
    public java.lang.Object read(java.io.InputStream, java.lang.Class)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public void write(java.lang.Object, java.io.OutputStream, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
    public javax.xml.namespace.QName getArtifactType();
    public java.lang.Class getModelType();
    static {};
}

Compiled from "ExtensibleURLArtifactProcessor.java"
public class org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor extends java.lang.Object implements org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor{
    public org.apache.tuscany.sca.contribution.processor.ExtensibleURLArtifactProcessor(org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint);
    public java.lang.Object read(java.net.URL, java.net.URI, java.net.URL, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public void resolve(java.lang.Object, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
    public java.lang.Object read(java.net.URL, java.net.URI, java.net.URL, org.apache.tuscany.sca.contribution.processor.ProcessorContext, java.lang.Class)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public java.lang.String getArtifactType();
    public java.lang.Class getModelType();
}

Compiled from "ProcessorContext.java"
public class org.apache.tuscany.sca.contribution.processor.ProcessorContext extends java.lang.Object{
    protected org.apache.tuscany.sca.contribution.Contribution contribution;
    protected org.apache.tuscany.sca.contribution.Artifact artifact;
    protected org.apache.tuscany.sca.monitor.Monitor monitor;
    protected java.lang.Object parentModel;
    public org.apache.tuscany.sca.contribution.processor.ProcessorContext(org.apache.tuscany.sca.contribution.Contribution, org.apache.tuscany.sca.monitor.Monitor);
    public org.apache.tuscany.sca.contribution.processor.ProcessorContext(org.apache.tuscany.sca.monitor.Monitor);
    public org.apache.tuscany.sca.contribution.processor.ProcessorContext(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.contribution.processor.ProcessorContext();
    public org.apache.tuscany.sca.contribution.Contribution getContribution();
    public org.apache.tuscany.sca.contribution.Contribution setContribution(org.apache.tuscany.sca.contribution.Contribution);
    public org.apache.tuscany.sca.monitor.Monitor getMonitor();
    public org.apache.tuscany.sca.monitor.Monitor setMonitor(org.apache.tuscany.sca.monitor.Monitor);
    public java.lang.Object getParentModel();
    public java.lang.Object setParentModel(java.lang.Object);
    public org.apache.tuscany.sca.contribution.Artifact getArtifact();
    public org.apache.tuscany.sca.contribution.Artifact setArtifact(org.apache.tuscany.sca.contribution.Artifact);
}

Compiled from "StAXArtifactProcessor.java"
public interface org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor extends org.apache.tuscany.sca.contribution.processor.ArtifactProcessor{
    public abstract java.lang.Object read(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    public abstract void write(java.lang.Object, javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException, javax.xml.stream.XMLStreamException;
    public abstract javax.xml.namespace.QName getArtifactType();
}

Compiled from "StAXArtifactProcessorExtensionPoint.java"
public interface org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint{
    public abstract void addArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor);
    public abstract void removeArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor);
    public abstract org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor getProcessor(java.lang.Object);
    public abstract org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor getProcessor(java.lang.Class);
}

Compiled from "StAXAttributeProcessor.java"
public interface org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor extends org.apache.tuscany.sca.contribution.processor.ArtifactProcessor{
    public abstract java.lang.Object read(javax.xml.namespace.QName, javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    public abstract void write(java.lang.Object, javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException, javax.xml.stream.XMLStreamException;
    public abstract javax.xml.namespace.QName getArtifactType();
}

Compiled from "StAXAttributeProcessorExtensionPoint.java"
public interface org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessorExtensionPoint{
    public abstract void addArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor);
    public abstract void removeArtifactProcessor(org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor);
    public abstract org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor getProcessor(java.lang.Object);
    public abstract org.apache.tuscany.sca.contribution.processor.StAXAttributeProcessor getProcessor(java.lang.Class);
}

Compiled from "URLArtifactProcessor.java"
public interface org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor extends org.apache.tuscany.sca.contribution.processor.ArtifactProcessor{
    public abstract java.lang.Object read(java.net.URL, java.net.URI, java.net.URL, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public abstract java.lang.String getArtifactType();
}

Compiled from "URLArtifactProcessorExtensionPoint.java"
public interface org.apache.tuscany.sca.contribution.processor.URLArtifactProcessorExtensionPoint{
    public abstract void addArtifactProcessor(org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor);
    public abstract void removeArtifactProcessor(org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor);
    public abstract org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor getProcessor(java.lang.Object);
    public abstract org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor getProcessor(java.lang.Class);
    public abstract java.util.Collection getProcessors(java.lang.Object);
}

Compiled from "UnrecognizedElementException.java"
public class org.apache.tuscany.sca.contribution.processor.UnrecognizedElementException extends org.apache.tuscany.sca.contribution.processor.ContributionReadException{
    public org.apache.tuscany.sca.contribution.processor.UnrecognizedElementException(javax.xml.namespace.QName);
    public javax.xml.namespace.QName getElement();
}

Compiled from "UnsupportedContentTypeException.java"
public class org.apache.tuscany.sca.contribution.processor.UnsupportedContentTypeException extends org.apache.tuscany.sca.contribution.processor.ContributionException{
    public org.apache.tuscany.sca.contribution.processor.UnsupportedContentTypeException(java.lang.String);
}

Compiled from "UnsupportedPackageTypeException.java"
public class org.apache.tuscany.sca.contribution.processor.UnsupportedPackageTypeException extends org.apache.tuscany.sca.contribution.processor.ContributionException{
    public org.apache.tuscany.sca.contribution.processor.UnsupportedPackageTypeException(java.lang.String);
}

Compiled from "ValidatingXMLInputFactory.java"
public abstract class org.apache.tuscany.sca.contribution.processor.ValidatingXMLInputFactory extends javax.xml.stream.XMLInputFactory{
    public org.apache.tuscany.sca.contribution.processor.ValidatingXMLInputFactory();
    public static void setMonitor(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.monitor.Monitor);
}

Compiled from "ValidatingXMLStreamReader.java"
class org.apache.tuscany.sca.contribution.processor.ValidatingXMLStreamReader extends javax.xml.stream.util.StreamReaderDelegate implements javax.xml.stream.XMLStreamReader{
    org.apache.tuscany.sca.contribution.processor.ValidatingXMLStreamReader(javax.xml.stream.XMLStreamReader, javax.xml.validation.Schema, org.apache.tuscany.sca.monitor.Monitor)       throws javax.xml.stream.XMLStreamException;
    void setMonitor(org.apache.tuscany.sca.monitor.Monitor);
    public int next()       throws javax.xml.stream.XMLStreamException;
    public int nextTag()       throws javax.xml.stream.XMLStreamException;
    public java.lang.String getElementText()       throws javax.xml.stream.XMLStreamException;
    public javax.xml.namespace.NamespaceContext getNamespaceContext();
    static org.apache.tuscany.sca.monitor.Monitor access$100(org.apache.tuscany.sca.contribution.processor.ValidatingXMLStreamReader);
    static java.util.logging.Logger access$200();
    static void access$300(org.apache.tuscany.sca.contribution.processor.ValidatingXMLStreamReader, java.lang.String, java.lang.Object, java.lang.Object[]);
    static void access$400(org.apache.tuscany.sca.contribution.processor.ValidatingXMLStreamReader, java.lang.String, java.lang.Object, java.lang.Object[]);
    static {};
}

Compiled from "ValidationSchemaExtensionPoint.java"
public interface org.apache.tuscany.sca.contribution.processor.ValidationSchemaExtensionPoint{
    public abstract void setEnabled(boolean);
    public abstract boolean isEnabled();
    public abstract void addSchema(java.lang.String);
    public abstract void removeSchema(java.lang.String);
    public abstract java.util.List getSchemas();
}

Compiled from "ClassReference.java"
public class org.apache.tuscany.sca.contribution.resolver.ClassReference extends java.lang.Object implements org.apache.tuscany.sca.assembly.Base{
    public org.apache.tuscany.sca.contribution.resolver.ClassReference(java.lang.Class);
    public org.apache.tuscany.sca.contribution.resolver.ClassReference(java.lang.String);
    public java.lang.Class getJavaClass();
    public java.lang.String getClassName();
    public boolean isUnresolved();
    public void setUnresolved(boolean);
    public int hashCode();
    public boolean equals(java.lang.Object);
    public org.apache.tuscany.sca.contribution.Contribution getContributionContainingClass();
    public void setContributionContainingClass(org.apache.tuscany.sca.contribution.Contribution);
}

Compiled from "DefaultDelegatingModelResolver.java"
public class org.apache.tuscany.sca.contribution.resolver.DefaultDelegatingModelResolver extends java.lang.Object implements org.apache.tuscany.sca.contribution.resolver.ModelResolver{
    public org.apache.tuscany.sca.contribution.resolver.DefaultDelegatingModelResolver(java.util.List);
    public void addModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object removeModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object resolveModel(java.lang.Class, java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
}

Compiled from "DefaultImportAllModelResolver.java"
public class org.apache.tuscany.sca.contribution.resolver.DefaultImportAllModelResolver extends java.lang.Object implements org.apache.tuscany.sca.contribution.resolver.ModelResolver{
    public org.apache.tuscany.sca.contribution.resolver.DefaultImportAllModelResolver(org.apache.tuscany.sca.contribution.Import, java.util.List);
    public void addModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object removeModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object resolveModel(java.lang.Class, java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
}

Compiled from "DefaultImportModelResolver.java"
public class org.apache.tuscany.sca.contribution.resolver.DefaultImportModelResolver extends java.lang.Object implements org.apache.tuscany.sca.contribution.resolver.ModelResolver{
    public org.apache.tuscany.sca.contribution.resolver.DefaultImportModelResolver(java.util.List);
    public void addModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object removeModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object resolveModel(java.lang.Class, java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
}

Compiled from "DefaultModelResolver.java"
public class org.apache.tuscany.sca.contribution.resolver.DefaultModelResolver extends java.lang.Object implements org.apache.tuscany.sca.contribution.resolver.ModelResolver{
    public org.apache.tuscany.sca.contribution.resolver.DefaultModelResolver();
    public org.apache.tuscany.sca.contribution.resolver.DefaultModelResolver(org.apache.tuscany.sca.contribution.Contribution, org.apache.tuscany.sca.core.FactoryExtensionPoint);
    public java.lang.Object resolveModel(java.lang.Class, java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public void addModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object removeModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.util.Map getModels();
}

Compiled from "DefaultModelResolverExtensionPoint.java"
public class org.apache.tuscany.sca.contribution.resolver.DefaultModelResolverExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint{
    public org.apache.tuscany.sca.contribution.resolver.DefaultModelResolverExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addResolver(java.lang.Class, java.lang.Class);
    public void removeResolver(java.lang.Class);
    public java.lang.Class getResolver(java.lang.Class);
}

Compiled from "ExtensibleModelResolver.java"
public class org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver extends java.lang.Object implements org.apache.tuscany.sca.contribution.resolver.ModelResolver{
    public org.apache.tuscany.sca.contribution.resolver.ExtensibleModelResolver(org.apache.tuscany.sca.contribution.Contribution, org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint, org.apache.tuscany.sca.core.FactoryExtensionPoint);
    public void addModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object removeModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object resolveModel(java.lang.Class, java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public org.apache.tuscany.sca.contribution.resolver.ModelResolver getDefaultModelResolver();
}

Compiled from "ModelResolver.java"
public interface org.apache.tuscany.sca.contribution.resolver.ModelResolver{
    public abstract java.lang.Object resolveModel(java.lang.Class, java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public abstract void addModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public abstract java.lang.Object removeModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
}

Compiled from "ModelResolverExtensionPoint.java"
public interface org.apache.tuscany.sca.contribution.resolver.ModelResolverExtensionPoint{
    public abstract void addResolver(java.lang.Class, java.lang.Class);
    public abstract void removeResolver(java.lang.Class);
    public abstract java.lang.Class getResolver(java.lang.Class);
}

Compiled from "ResolverExtension.java"
public interface org.apache.tuscany.sca.contribution.resolver.ResolverExtension{
    public abstract org.apache.tuscany.sca.contribution.resolver.ModelResolver getModelResolver();
    public abstract void setModelResolver(org.apache.tuscany.sca.contribution.resolver.ModelResolver);
}

Compiled from "ResourceReference.java"
public class org.apache.tuscany.sca.contribution.resolver.ResourceReference extends java.lang.Object{
    public org.apache.tuscany.sca.contribution.resolver.ResourceReference(java.lang.String, java.net.URL);
    public org.apache.tuscany.sca.contribution.resolver.ResourceReference(java.lang.String);
    public java.net.URL getResource();
    public java.lang.String getResourceName();
    public boolean isUnresolved();
    public int hashCode();
    public boolean equals(java.lang.Object);
}

Compiled from "ComponentContextFactory.java"
public interface org.apache.tuscany.sca.context.ComponentContextFactory{
    public abstract org.oasisopen.sca.ComponentContext createComponentContext(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeComponent);
}

Compiled from "CompositeContext.java"
public class org.apache.tuscany.sca.context.CompositeContext extends java.lang.Object{
    protected org.apache.tuscany.sca.core.ExtensionPointRegistry extensionPointRegistry;
    protected org.apache.tuscany.sca.runtime.EndpointRegistry endpointRegistry;
    protected org.apache.tuscany.sca.context.ComponentContextFactory componentContextFactory;
    protected org.apache.tuscany.sca.assembly.Composite domainComposite;
    protected java.lang.String nodeURI;
    protected java.lang.String domainURI;
    protected org.apache.tuscany.sca.definitions.Definitions systemDefinitions;
    protected java.util.Map attributes;
    public org.apache.tuscany.sca.context.CompositeContext(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.runtime.EndpointRegistry, org.apache.tuscany.sca.assembly.Composite, java.lang.String, java.lang.String, org.apache.tuscany.sca.definitions.Definitions);
    public org.apache.tuscany.sca.context.CompositeContext(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.runtime.EndpointRegistry);
    public static org.apache.tuscany.sca.runtime.RuntimeComponent getCurrentComponent();
    public static org.apache.tuscany.sca.context.CompositeContext getCurrentCompositeContext();
    public void bindComponent(org.apache.tuscany.sca.runtime.RuntimeComponent);
    public void bindEndpointReference(org.apache.tuscany.sca.assembly.EndpointReference);
    public org.apache.tuscany.sca.core.ExtensionPointRegistry getExtensionPointRegistry();
    public org.apache.tuscany.sca.runtime.EndpointRegistry getEndpointRegistry();
    public org.apache.tuscany.sca.assembly.Composite getDomainComposite();
    public java.lang.String getNodeURI();
    public java.lang.String getDomainURI();
    public org.apache.tuscany.sca.definitions.Definitions getSystemDefinitions();
    public java.lang.Object getAttribute(java.lang.String);
    public void setAttribute(java.lang.String, java.lang.Object);
    public java.util.Map getAttributes();
}

Compiled from "ContextFactoryExtensionPoint.java"
public interface org.apache.tuscany.sca.context.ContextFactoryExtensionPoint{
    public abstract void addFactory(java.lang.Object);
    public abstract void removeFactory(java.lang.Object);
    public abstract java.lang.Object getFactory(java.lang.Class);
}

Compiled from "DefaultContextFactoryExtensionPoint.java"
public class org.apache.tuscany.sca.context.DefaultContextFactoryExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.context.ContextFactoryExtensionPoint{
    public org.apache.tuscany.sca.context.DefaultContextFactoryExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addFactory(java.lang.Object)       throws java.lang.IllegalArgumentException;
    public void removeFactory(java.lang.Object)       throws java.lang.IllegalArgumentException;
    public java.lang.Object getFactory(java.lang.Class)       throws java.lang.IllegalArgumentException;
}

Compiled from "PropertyValueFactory.java"
public interface org.apache.tuscany.sca.context.PropertyValueFactory{
    public abstract java.lang.Object createPropertyValue(org.apache.tuscany.sca.assembly.ComponentProperty, java.lang.Class);
}

Compiled from "RequestContextFactory.java"
public interface org.apache.tuscany.sca.context.RequestContextFactory{
    public abstract org.oasisopen.sca.RequestContext createRequestContext(org.apache.tuscany.sca.runtime.RuntimeComponent);
}

Compiled from "ThreadMessageContext.java"
public final class org.apache.tuscany.sca.context.ThreadMessageContext extends java.lang.Object{
    public static org.apache.tuscany.sca.invocation.Message setMessageContext(org.apache.tuscany.sca.invocation.Message);
    public static org.apache.tuscany.sca.invocation.Message getMessageContext();
    public static void removeMessageContext();
    static {};
}

Compiled from "DataExchangeSemantics.java"
public interface org.apache.tuscany.sca.invocation.DataExchangeSemantics{
    public abstract boolean allowsPassByReference();
}

Compiled from "Interceptor.java"
public interface org.apache.tuscany.sca.invocation.Interceptor extends org.apache.tuscany.sca.invocation.Invoker{
    public abstract void setNext(org.apache.tuscany.sca.invocation.Invoker);
    public abstract org.apache.tuscany.sca.invocation.Invoker getNext();
}

Compiled from "InterceptorAsync.java"
public interface org.apache.tuscany.sca.invocation.InterceptorAsync extends org.apache.tuscany.sca.invocation.Interceptor,org.apache.tuscany.sca.invocation.InvokerAsyncRequest,org.apache.tuscany.sca.invocation.InvokerAsyncResponse{
    public abstract void setPrevious(org.apache.tuscany.sca.invocation.InvokerAsyncResponse);
    public abstract org.apache.tuscany.sca.invocation.InvokerAsyncResponse getPrevious();
    public abstract org.apache.tuscany.sca.invocation.Message processRequest(org.apache.tuscany.sca.invocation.Message);
    public abstract org.apache.tuscany.sca.invocation.Message postProcessRequest(org.apache.tuscany.sca.invocation.Message);
    public abstract org.apache.tuscany.sca.invocation.Message postProcessRequest(org.apache.tuscany.sca.invocation.Message, java.lang.Throwable)       throws java.lang.Throwable;
    public abstract org.apache.tuscany.sca.invocation.Message processResponse(org.apache.tuscany.sca.invocation.Message);
}

Compiled from "InvocationChain.java"
public interface org.apache.tuscany.sca.invocation.InvocationChain{
    public abstract org.apache.tuscany.sca.interfacedef.Operation getTargetOperation();
    public abstract void setTargetOperation(org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.interfacedef.Operation getSourceOperation();
    public abstract void setSourceOperation(org.apache.tuscany.sca.interfacedef.Operation);
    public abstract void addInterceptor(org.apache.tuscany.sca.invocation.Interceptor);
    public abstract void addInterceptor(java.lang.String, org.apache.tuscany.sca.invocation.Interceptor);
    public abstract void addHeadInterceptor(org.apache.tuscany.sca.invocation.Interceptor);
    public abstract void addHeadInterceptor(java.lang.String, org.apache.tuscany.sca.invocation.Interceptor);
    public abstract void addInvoker(org.apache.tuscany.sca.invocation.Invoker);
    public abstract org.apache.tuscany.sca.invocation.Invoker getHeadInvoker();
    public abstract org.apache.tuscany.sca.invocation.Invoker getTailInvoker();
    public abstract org.apache.tuscany.sca.invocation.Invoker getHeadInvoker(java.lang.String);
    public abstract boolean allowsPassByReference();
    public abstract void setAllowsPassByReference(boolean);
    public abstract boolean isAsyncInvocation();
}

Compiled from "Invoker.java"
public interface org.apache.tuscany.sca.invocation.Invoker{
    public abstract org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.Message);
}

Compiled from "InvokerAsyncRequest.java"
public interface org.apache.tuscany.sca.invocation.InvokerAsyncRequest{
    public abstract void invokeAsyncRequest(org.apache.tuscany.sca.invocation.Message)       throws java.lang.Throwable;
}

Compiled from "InvokerAsyncResponse.java"
public interface org.apache.tuscany.sca.invocation.InvokerAsyncResponse{
    public abstract void invokeAsyncResponse(org.apache.tuscany.sca.invocation.Message);
}

Compiled from "Message.java"
public interface org.apache.tuscany.sca.invocation.Message{
    public abstract java.lang.Object getBody();
    public abstract void setBody(java.lang.Object);
    public abstract org.apache.tuscany.sca.assembly.EndpointReference getFrom();
    public abstract void setFrom(org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract org.apache.tuscany.sca.assembly.Endpoint getTo();
    public abstract void setTo(org.apache.tuscany.sca.assembly.Endpoint);
    public abstract java.lang.Object getMessageID();
    public abstract void setMessageID(java.lang.Object);
    public abstract boolean isFault();
    public abstract void setFaultBody(java.lang.Object);
    public abstract org.apache.tuscany.sca.interfacedef.Operation getOperation();
    public abstract void setOperation(org.apache.tuscany.sca.interfacedef.Operation);
    public abstract java.util.Map getHeaders();
    public abstract java.lang.Object getBindingContext();
    public abstract void setBindingContext(java.lang.Object);
}

Compiled from "MessageFactory.java"
public interface org.apache.tuscany.sca.invocation.MessageFactory{
    public abstract org.apache.tuscany.sca.invocation.Message createMessage();
}

Compiled from "Phase.java"
public interface org.apache.tuscany.sca.invocation.Phase{
    public static final java.lang.String REFERENCE;
    public static final java.lang.String REFERENCE_INTERFACE;
    public static final java.lang.String REFERENCE_POLICY;
    public static final java.lang.String REFERENCE_BINDING;
    public static final java.lang.String REFERENCE_BINDING_WIREFORMAT;
    public static final java.lang.String REFERENCE_BINDING_POLICY;
    public static final java.lang.String REFERENCE_BINDING_TRANSPORT;
    public static final java.lang.String SERVICE_BINDING_TRANSPORT;
    public static final java.lang.String SERVICE_BINDING_OPERATION_SELECTOR;
    public static final java.lang.String SERVICE_BINDING_WIREFORMAT;
    public static final java.lang.String SERVICE_BINDING_POLICY;
    public static final java.lang.String SERVICE_BINDING;
    public static final java.lang.String SERVICE_INTERFACE;
    public static final java.lang.String SERVICE_POLICY;
    public static final java.lang.String SERVICE;
    public static final java.lang.String IMPLEMENTATION_POLICY;
    public static final java.lang.String IMPLEMENTATION;
}

Compiled from "PhasedInterceptor.java"
public interface org.apache.tuscany.sca.invocation.PhasedInterceptor extends org.apache.tuscany.sca.invocation.Interceptor{
    public abstract java.lang.String getPhase();
}

Compiled from "BaseBindingImpl.java"
public abstract class org.apache.tuscany.sca.provider.BaseBindingImpl extends java.lang.Object implements org.apache.tuscany.sca.assembly.Binding{
    public org.apache.tuscany.sca.provider.BaseBindingImpl();
    public java.lang.String getName();
    public java.lang.String getURI();
    public void setURI(java.lang.String);
    public void setName(java.lang.String);
    public java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public boolean isUnresolved();
    public void setUnresolved(boolean);
    public abstract javax.xml.namespace.QName getType();
    public org.apache.tuscany.sca.assembly.WireFormat getRequestWireFormat();
    public void setRequestWireFormat(org.apache.tuscany.sca.assembly.WireFormat);
    public org.apache.tuscany.sca.assembly.WireFormat getResponseWireFormat();
    public void setResponseWireFormat(org.apache.tuscany.sca.assembly.WireFormat);
    public org.apache.tuscany.sca.assembly.OperationSelector getOperationSelector();
    public void setOperationSelector(org.apache.tuscany.sca.assembly.OperationSelector);
}

Compiled from "BasePolicyProvider.java"
public abstract class org.apache.tuscany.sca.provider.BasePolicyProvider extends java.lang.Object implements org.apache.tuscany.sca.provider.PolicyProvider{
    protected java.lang.Class policyType;
    protected org.apache.tuscany.sca.policy.PolicySubject subject;
    protected org.apache.tuscany.sca.provider.BasePolicyProvider(java.lang.Class, org.apache.tuscany.sca.policy.PolicySubject);
    protected java.util.List findPolicies();
    protected java.util.List findPolicySets();
    protected org.apache.tuscany.sca.policy.PolicySet findPolicySet();
    protected java.lang.String getContext();
    public void start();
    public void stop();
    public org.apache.tuscany.sca.invocation.PhasedInterceptor createInterceptor(org.apache.tuscany.sca.interfacedef.Operation);
    public org.apache.tuscany.sca.invocation.PhasedInterceptor createBindingInterceptor();
    public void configureBinding(java.lang.Object);
    protected org.apache.tuscany.sca.invocation.InvocationChain getInvocationChain();
    protected void configure(org.apache.tuscany.sca.invocation.InvocationChain, org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "BindingPolicyProvider.java"
public interface org.apache.tuscany.sca.provider.BindingPolicyProvider extends org.apache.tuscany.sca.provider.PolicyProvider{
    public abstract org.apache.tuscany.sca.invocation.PhasedInterceptor createBindingInterceptor();
}

Compiled from "BindingProviderFactory.java"
public interface org.apache.tuscany.sca.provider.BindingProviderFactory extends org.apache.tuscany.sca.provider.ProviderFactory{
    public abstract org.apache.tuscany.sca.provider.ReferenceBindingProvider createReferenceBindingProvider(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public abstract org.apache.tuscany.sca.provider.ServiceBindingProvider createServiceBindingProvider(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
}

Compiled from "DefaultProviderFactoryExtensionPoint.java"
public class org.apache.tuscany.sca.provider.DefaultProviderFactoryExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint{
    public org.apache.tuscany.sca.provider.DefaultProviderFactoryExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addProviderFactory(org.apache.tuscany.sca.provider.ProviderFactory);
    public void removeProviderFactory(org.apache.tuscany.sca.provider.ProviderFactory);
    public org.apache.tuscany.sca.provider.ProviderFactory getProviderFactory(java.lang.Class);
    public java.util.List getPolicyProviderFactories();
    public java.util.Collection getProviderFactories(java.lang.Class);
}

Compiled from "EndpointAsyncProvider.java"
public interface org.apache.tuscany.sca.provider.EndpointAsyncProvider extends org.apache.tuscany.sca.provider.EndpointProvider{
    public abstract boolean supportsNativeAsync();
    public abstract org.apache.tuscany.sca.invocation.InvokerAsyncResponse createAsyncResponseInvoker();
}

Compiled from "EndpointProvider.java"
public interface org.apache.tuscany.sca.provider.EndpointProvider extends org.apache.tuscany.sca.provider.ServiceBindingProvider{
    public abstract void configure();
}

Compiled from "EndpointReferenceAsyncProvider.java"
public interface org.apache.tuscany.sca.provider.EndpointReferenceAsyncProvider extends org.apache.tuscany.sca.provider.EndpointReferenceProvider{
    public abstract boolean supportsNativeAsync();
}

Compiled from "EndpointReferenceProvider.java"
public interface org.apache.tuscany.sca.provider.EndpointReferenceProvider extends org.apache.tuscany.sca.provider.ReferenceBindingProvider{
    public abstract void configure();
}

Compiled from "ImplementationAsyncProvider.java"
public interface org.apache.tuscany.sca.provider.ImplementationAsyncProvider extends org.apache.tuscany.sca.provider.ImplementationProvider{
    public abstract org.apache.tuscany.sca.invocation.InvokerAsyncRequest createAsyncInvoker(org.apache.tuscany.sca.runtime.RuntimeComponentService, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.invocation.InvokerAsyncResponse createAsyncResponseInvoker(org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "ImplementationProvider.java"
public interface org.apache.tuscany.sca.provider.ImplementationProvider extends org.apache.tuscany.sca.provider.RuntimeProvider{
    public abstract org.apache.tuscany.sca.invocation.Invoker createInvoker(org.apache.tuscany.sca.runtime.RuntimeComponentService, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract boolean supportsOneWayInvocation();
}

Compiled from "ImplementationProviderFactory.java"
public interface org.apache.tuscany.sca.provider.ImplementationProviderFactory extends org.apache.tuscany.sca.provider.ProviderFactory{
    public abstract org.apache.tuscany.sca.provider.ImplementationProvider createImplementationProvider(org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.assembly.Implementation);
}

Compiled from "OperationSelectorProvider.java"
public interface org.apache.tuscany.sca.provider.OperationSelectorProvider{
    public abstract org.apache.tuscany.sca.invocation.Interceptor createInterceptor();
    public abstract java.lang.String getPhase();
}

Compiled from "OperationSelectorProviderFactory.java"
public interface org.apache.tuscany.sca.provider.OperationSelectorProviderFactory extends org.apache.tuscany.sca.provider.ProviderFactory{
    public abstract org.apache.tuscany.sca.provider.OperationSelectorProvider createReferenceOperationSelectorProvider(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public abstract org.apache.tuscany.sca.provider.OperationSelectorProvider createServiceOperationSelectorProvider(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
}

Compiled from "OptimisingBindingProvider.java"
public interface org.apache.tuscany.sca.provider.OptimisingBindingProvider{
    public abstract void optimiseBinding(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
}

Compiled from "PolicyImplementor.java"
public interface org.apache.tuscany.sca.provider.PolicyImplementor{
    public abstract java.util.List getImplementedPolicies();
}

Compiled from "PolicyProvider.java"
public interface org.apache.tuscany.sca.provider.PolicyProvider extends org.apache.tuscany.sca.provider.RuntimeProvider{
    public abstract org.apache.tuscany.sca.invocation.PhasedInterceptor createInterceptor(org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.invocation.PhasedInterceptor createBindingInterceptor();
    public abstract void configureBinding(java.lang.Object);
}

Compiled from "PolicyProviderFactory.java"
public interface org.apache.tuscany.sca.provider.PolicyProviderFactory extends org.apache.tuscany.sca.provider.ProviderFactory{
    public abstract org.apache.tuscany.sca.provider.PolicyProvider createReferencePolicyProvider(org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract org.apache.tuscany.sca.provider.PolicyProvider createServicePolicyProvider(org.apache.tuscany.sca.assembly.Endpoint);
    public abstract org.apache.tuscany.sca.provider.PolicyProvider createImplementationPolicyProvider(org.apache.tuscany.sca.runtime.RuntimeComponent);
}

Compiled from "ProviderFactory.java"
public interface org.apache.tuscany.sca.provider.ProviderFactory{
    public abstract java.lang.Class getModelType();
}

Compiled from "ProviderFactoryExtensionPoint.java"
public interface org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint{
    public abstract void addProviderFactory(org.apache.tuscany.sca.provider.ProviderFactory);
    public abstract void removeProviderFactory(org.apache.tuscany.sca.provider.ProviderFactory);
    public abstract org.apache.tuscany.sca.provider.ProviderFactory getProviderFactory(java.lang.Class);
    public abstract java.util.List getPolicyProviderFactories();
    public abstract java.util.Collection getProviderFactories(java.lang.Class);
}

Compiled from "ReferenceBindingProvider.java"
public interface org.apache.tuscany.sca.provider.ReferenceBindingProvider extends org.apache.tuscany.sca.provider.RuntimeProvider{
    public abstract org.apache.tuscany.sca.invocation.Invoker createInvoker(org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getBindingInterfaceContract();
    public abstract boolean supportsOneWayInvocation();
}

Compiled from "RuntimeProvider.java"
public interface org.apache.tuscany.sca.provider.RuntimeProvider{
    public abstract void start();
    public abstract void stop();
}

Compiled from "SCABindingMapper.java"
public interface org.apache.tuscany.sca.provider.SCABindingMapper{
    public abstract org.apache.tuscany.sca.runtime.RuntimeEndpoint map(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public abstract org.apache.tuscany.sca.runtime.RuntimeEndpointReference map(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public abstract boolean isRemotable(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public abstract boolean isRemotable(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
}

Compiled from "ServiceBindingProvider.java"
public interface org.apache.tuscany.sca.provider.ServiceBindingProvider extends org.apache.tuscany.sca.provider.RuntimeProvider{
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getBindingInterfaceContract();
    public abstract boolean supportsOneWayInvocation();
}

Compiled from "WireFormatProvider.java"
public interface org.apache.tuscany.sca.provider.WireFormatProvider{
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract configureWireFormatInterfaceContract(org.apache.tuscany.sca.interfacedef.InterfaceContract);
    public abstract org.apache.tuscany.sca.invocation.Interceptor createInterceptor();
    public abstract java.lang.String getPhase();
}

Compiled from "WireFormatProviderFactory.java"
public interface org.apache.tuscany.sca.provider.WireFormatProviderFactory extends org.apache.tuscany.sca.provider.ProviderFactory{
    public abstract org.apache.tuscany.sca.provider.WireFormatProvider createReferenceWireFormatProvider(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public abstract org.apache.tuscany.sca.provider.WireFormatProvider createServiceWireFormatProvider(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
}

Compiled from "ActivationException.java"
public class org.apache.tuscany.sca.runtime.ActivationException extends java.lang.Exception{
    public org.apache.tuscany.sca.runtime.ActivationException(java.lang.String);
    public org.apache.tuscany.sca.runtime.ActivationException(java.lang.Throwable);
}

Compiled from "BaseDomainRegistryFactory.java"
public abstract class org.apache.tuscany.sca.runtime.BaseDomainRegistryFactory extends java.lang.Object implements org.apache.tuscany.sca.runtime.DomainRegistryFactory,org.apache.tuscany.sca.core.LifeCycleListener{
    protected org.apache.tuscany.sca.core.ExtensionPointRegistry registry;
    protected java.util.Map endpointRegistries;
    protected java.util.List listeners;
    public org.apache.tuscany.sca.runtime.BaseDomainRegistryFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void start();
    public synchronized org.apache.tuscany.sca.runtime.EndpointRegistry getEndpointRegistry(java.lang.String, java.lang.String);
    protected java.lang.Object getKey(java.lang.String, java.lang.String);
    protected abstract org.apache.tuscany.sca.runtime.EndpointRegistry createEndpointRegistry(java.lang.String, java.lang.String);
    public void stop();
    public synchronized java.util.Collection getEndpointRegistries();
    public synchronized void addListener(org.apache.tuscany.sca.runtime.EndpointListener);
    public synchronized java.util.List getListeners();
    public synchronized void removeListener(org.apache.tuscany.sca.runtime.EndpointListener);
}

Compiled from "BaseEndpointRegistry.java"
public abstract class org.apache.tuscany.sca.runtime.BaseEndpointRegistry extends java.lang.Object implements org.apache.tuscany.sca.runtime.EndpointRegistry,org.apache.tuscany.sca.core.LifeCycleListener{
    protected static final java.util.logging.Logger logger;
    protected java.lang.String domainRegistryURI;
    protected java.lang.String domainURI;
    protected java.util.List endpointreferences;
    protected java.util.List listeners;
    protected org.apache.tuscany.sca.core.ExtensionPointRegistry registry;
    protected java.util.Map attributes;
    public org.apache.tuscany.sca.runtime.BaseEndpointRegistry(org.apache.tuscany.sca.core.ExtensionPointRegistry, java.util.Map, java.lang.String, java.lang.String);
    public abstract void addEndpoint(org.apache.tuscany.sca.assembly.Endpoint);
    public void addEndpointReference(org.apache.tuscany.sca.assembly.EndpointReference);
    public void addListener(org.apache.tuscany.sca.runtime.EndpointListener);
    protected void endpointAdded(org.apache.tuscany.sca.assembly.Endpoint);
    protected void endpointRemoved(org.apache.tuscany.sca.assembly.Endpoint);
    protected void endpointUpdated(org.apache.tuscany.sca.assembly.Endpoint, org.apache.tuscany.sca.assembly.Endpoint);
    public java.util.List findEndpoint(org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract java.util.List findEndpoint(java.lang.String);
    public java.util.List findEndpointReference(org.apache.tuscany.sca.assembly.Endpoint);
    public java.util.List findEndpointReferences(java.lang.String);
    public abstract org.apache.tuscany.sca.assembly.Endpoint getEndpoint(java.lang.String);
    public java.util.List getEndpointReferences();
    public abstract java.util.Collection getEndpoints();
    public java.util.List getListeners();
    public abstract void removeEndpoint(org.apache.tuscany.sca.assembly.Endpoint);
    public void removeEndpointReference(org.apache.tuscany.sca.assembly.EndpointReference);
    public void removeListener(org.apache.tuscany.sca.runtime.EndpointListener);
    public java.lang.String getDomainURI();
    static {};
}

Compiled from "CompositeActivator.java"
public interface org.apache.tuscany.sca.runtime.CompositeActivator{
    public abstract void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Composite)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public abstract void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentReference);
    public abstract void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentService);
    public abstract void deactivate(org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentReference);
    public abstract void deactivate(org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentService);
    public abstract void deactivate(org.apache.tuscany.sca.assembly.Composite)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public abstract void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentReference);
    public abstract void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Component)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public abstract void stop(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Component)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public abstract void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Composite)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public abstract void stop(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Composite)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public abstract void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public abstract void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public abstract void deactivate(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public abstract void deactivate(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public abstract void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public abstract void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public abstract void stop(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public abstract void stop(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
}

Compiled from "DefaultDomainRegistryFactoryExtensionPoint.java"
public class org.apache.tuscany.sca.runtime.DefaultDomainRegistryFactoryExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.runtime.DomainRegistryFactoryExtensionPoint,org.apache.tuscany.sca.core.LifeCycleListener{
    public org.apache.tuscany.sca.runtime.DefaultDomainRegistryFactoryExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry, java.util.Map);
    public void addDomainRegistryFactory(org.apache.tuscany.sca.runtime.DomainRegistryFactory);
    public java.util.List getDomainRegistryFactories();
    public void removeDomainRegistryFactory(org.apache.tuscany.sca.runtime.DomainRegistryFactory);
    public void start();
    public void stop();
    public java.util.Map getDomainRegistryMapping();
}

Compiled from "DefaultWireProcessorExtensionPoint.java"
public class org.apache.tuscany.sca.runtime.DefaultWireProcessorExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.runtime.RuntimeWireProcessorExtensionPoint,org.apache.tuscany.sca.core.LifeCycleListener{
    public org.apache.tuscany.sca.runtime.DefaultWireProcessorExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addWireProcessor(org.apache.tuscany.sca.runtime.RuntimeWireProcessor);
    public void removeWireProcessor(org.apache.tuscany.sca.runtime.RuntimeWireProcessor);
    public java.util.List getWireProcessors();
    public void start();
    public void stop();
}

Compiled from "DomainRegistryFactory.java"
public interface org.apache.tuscany.sca.runtime.DomainRegistryFactory{
    public abstract org.apache.tuscany.sca.runtime.EndpointRegistry getEndpointRegistry(java.lang.String, java.lang.String);
    public abstract java.util.Collection getEndpointRegistries();
    public abstract void addListener(org.apache.tuscany.sca.runtime.EndpointListener);
    public abstract void removeListener(org.apache.tuscany.sca.runtime.EndpointListener);
    public abstract java.lang.String[] getSupportedSchemes();
}

Compiled from "DomainRegistryFactoryExtensionPoint.java"
public interface org.apache.tuscany.sca.runtime.DomainRegistryFactoryExtensionPoint{
    public abstract java.util.Map getDomainRegistryMapping();
    public abstract void addDomainRegistryFactory(org.apache.tuscany.sca.runtime.DomainRegistryFactory);
    public abstract void removeDomainRegistryFactory(org.apache.tuscany.sca.runtime.DomainRegistryFactory);
    public abstract java.util.List getDomainRegistryFactories();
}

Compiled from "DomainRegistryURI.java"
public class org.apache.tuscany.sca.runtime.DomainRegistryURI extends java.lang.Object{
    public org.apache.tuscany.sca.runtime.DomainRegistryURI(java.lang.String);
    public java.lang.String getDomainName();
    public java.lang.String getBindAddress();
    public int getListenPort();
    public java.lang.String getPassword();
    public boolean isMulticastDisabled();
    public java.lang.String getMulticastAddress();
    public int getMulticastPort();
    public java.util.List getRemotes();
    public java.lang.String toString();
}

Compiled from "EndpointListener.java"
public interface org.apache.tuscany.sca.runtime.EndpointListener extends java.util.EventListener{
    public abstract void endpointAdded(org.apache.tuscany.sca.assembly.Endpoint);
    public abstract void endpointRemoved(org.apache.tuscany.sca.assembly.Endpoint);
    public abstract void endpointUpdated(org.apache.tuscany.sca.assembly.Endpoint, org.apache.tuscany.sca.assembly.Endpoint);
}

Compiled from "EndpointReferenceBinder.java"
public interface org.apache.tuscany.sca.runtime.EndpointReferenceBinder{
    public abstract void bindBuildTime(org.apache.tuscany.sca.runtime.EndpointRegistry, org.apache.tuscany.sca.assembly.EndpointReference, org.apache.tuscany.sca.assembly.builder.BuilderContext);
    public abstract void bindRunTime(org.apache.tuscany.sca.runtime.EndpointRegistry, org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract boolean isOutOfDate(org.apache.tuscany.sca.runtime.EndpointRegistry, org.apache.tuscany.sca.assembly.EndpointReference);
}

Compiled from "EndpointRegistry.java"
public interface org.apache.tuscany.sca.runtime.EndpointRegistry{
    public abstract void addEndpoint(org.apache.tuscany.sca.assembly.Endpoint);
    public abstract void removeEndpoint(org.apache.tuscany.sca.assembly.Endpoint);
    public abstract org.apache.tuscany.sca.assembly.Endpoint getEndpoint(java.lang.String);
    public abstract java.util.Collection getEndpoints();
    public abstract java.util.List findEndpoint(java.lang.String);
    public abstract java.util.List findEndpoint(org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract void addEndpointReference(org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract void removeEndpointReference(org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract java.util.List getEndpointReferences();
    public abstract java.util.List findEndpointReferences(java.lang.String);
    public abstract void addListener(org.apache.tuscany.sca.runtime.EndpointListener);
    public abstract void removeListener(org.apache.tuscany.sca.runtime.EndpointListener);
    public abstract java.lang.String getDomainURI();
}

Compiled from "EndpointSerializer.java"
public interface org.apache.tuscany.sca.runtime.EndpointSerializer{
    public abstract org.apache.tuscany.sca.assembly.EndpointReference readEndpointReference(java.lang.String);
    public abstract java.lang.String write(org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract org.apache.tuscany.sca.assembly.Endpoint readEndpoint(java.lang.String);
    public abstract java.lang.String write(org.apache.tuscany.sca.assembly.Endpoint);
}

Compiled from "ExtensibleDomainRegistryFactory.java"
public class org.apache.tuscany.sca.runtime.ExtensibleDomainRegistryFactory extends java.lang.Object implements org.apache.tuscany.sca.runtime.DomainRegistryFactory{
    public org.apache.tuscany.sca.runtime.ExtensibleDomainRegistryFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.runtime.ExtensibleDomainRegistryFactory(org.apache.tuscany.sca.runtime.DomainRegistryFactoryExtensionPoint);
    public static org.apache.tuscany.sca.runtime.ExtensibleDomainRegistryFactory getInstance(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addListener(org.apache.tuscany.sca.runtime.EndpointListener);
    public java.util.Collection getEndpointRegistries();
    public org.apache.tuscany.sca.runtime.EndpointRegistry getEndpointRegistry(java.lang.String, java.lang.String);
    public void removeListener(org.apache.tuscany.sca.runtime.EndpointListener);
    public synchronized java.lang.String[] getSupportedSchemes();
}

Compiled from "Invocable.java"
public interface org.apache.tuscany.sca.runtime.Invocable{
    public abstract void bind(org.apache.tuscany.sca.context.CompositeContext);
    public abstract void bind(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.runtime.EndpointRegistry);
    public abstract org.apache.tuscany.sca.context.CompositeContext getCompositeContext();
    public abstract void unbind();
    public abstract org.apache.tuscany.sca.assembly.Component getComponent();
    public abstract org.apache.tuscany.sca.assembly.Contract getContract();
    public abstract org.apache.tuscany.sca.assembly.Binding getBinding();
    public abstract java.util.List getInvocationChains();
    public abstract org.apache.tuscany.sca.invocation.InvocationChain getInvocationChain(org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.invocation.InvocationChain getBindingInvocationChain();
    public abstract org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.Message);
    public abstract java.lang.Object invoke(org.apache.tuscany.sca.interfacedef.Operation, java.lang.Object[])       throws java.lang.reflect.InvocationTargetException;
    public abstract org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.invocation.Message);
    public abstract void invokeAsync(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.invocation.Message);
    public abstract void invokeAsync(org.apache.tuscany.sca.invocation.Message);
    public abstract void invokeAsyncResponse(org.apache.tuscany.sca.invocation.Message);
    public abstract java.util.List getPolicyProviders();
}

Compiled from "ReferenceParameters.java"
public interface org.apache.tuscany.sca.runtime.ReferenceParameters extends java.lang.Cloneable{
    public abstract java.lang.Object getCallbackID();
    public abstract void setCallbackID(java.lang.Object);
    public abstract java.lang.Object getCallbackObjectID();
    public abstract void setCallbackObjectID(java.lang.Object);
    public abstract org.apache.tuscany.sca.assembly.EndpointReference getCallbackReference();
    public abstract void setCallbackReference(org.apache.tuscany.sca.assembly.EndpointReference);
    public abstract java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
}

Compiled from "RuntimeComponent.java"
public interface org.apache.tuscany.sca.runtime.RuntimeComponent extends org.apache.tuscany.sca.assembly.Component{
    public abstract void setImplementationProvider(org.apache.tuscany.sca.provider.ImplementationProvider);
    public abstract org.apache.tuscany.sca.provider.ImplementationProvider getImplementationProvider();
    public abstract org.apache.tuscany.sca.runtime.RuntimeComponentContext getComponentContext();
    public abstract void setComponentContext(org.apache.tuscany.sca.runtime.RuntimeComponentContext);
    public abstract boolean isStarted();
    public abstract void setStarted(boolean);
    public abstract void addPolicyProvider(org.apache.tuscany.sca.provider.PolicyProvider);
    public abstract java.util.List getPolicyProviders();
    public abstract org.oasisopen.sca.ServiceReference getServiceReference(java.lang.Class, java.lang.String);
}

Compiled from "RuntimeComponentContext.java"
public interface org.apache.tuscany.sca.runtime.RuntimeComponentContext extends org.oasisopen.sca.ComponentContext{
    public abstract org.oasisopen.sca.ServiceReference getServiceReference(java.lang.Class, org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public abstract org.oasisopen.sca.ServiceReference getServiceReference(java.lang.Class, org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public abstract org.oasisopen.sca.ServiceReference createSelfReference(java.lang.Class, org.apache.tuscany.sca.assembly.ComponentService);
    public abstract org.apache.tuscany.sca.core.ExtensionPointRegistry getExtensionPointRegistry();
    public abstract org.apache.tuscany.sca.context.CompositeContext getCompositeContext();
}

Compiled from "RuntimeComponentReference.java"
public interface org.apache.tuscany.sca.runtime.RuntimeComponentReference extends org.apache.tuscany.sca.assembly.ComponentReference{
    public abstract void setComponent(org.apache.tuscany.sca.runtime.RuntimeComponent);
    public abstract org.apache.tuscany.sca.runtime.RuntimeComponent getComponent();
}

Compiled from "RuntimeComponentService.java"
public interface org.apache.tuscany.sca.runtime.RuntimeComponentService extends org.apache.tuscany.sca.assembly.ComponentService{
}

Compiled from "RuntimeEndpoint.java"
public interface org.apache.tuscany.sca.runtime.RuntimeEndpoint extends org.apache.tuscany.sca.assembly.Endpoint,org.apache.tuscany.sca.runtime.Invocable,java.io.Serializable{
    public abstract void setBindingProvider(org.apache.tuscany.sca.provider.ServiceBindingProvider);
    public abstract org.apache.tuscany.sca.provider.ServiceBindingProvider getBindingProvider();
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getBindingInterfaceContract();
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getComponentTypeServiceInterfaceContract();
    public abstract void validateServiceInterfaceCompatibility();
    public abstract org.apache.tuscany.sca.context.CompositeContext getCompositeContext();
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getGeneratedWSDLContract(org.apache.tuscany.sca.interfacedef.InterfaceContract);
    public abstract void createAsyncServerCallback();
    public abstract org.apache.tuscany.sca.runtime.RuntimeEndpointReference getAsyncServerCallback();
}

Compiled from "RuntimeEndpointReference.java"
public interface org.apache.tuscany.sca.runtime.RuntimeEndpointReference extends org.apache.tuscany.sca.assembly.EndpointReference,org.apache.tuscany.sca.runtime.Invocable,java.io.Serializable{
    public abstract void setBindingProvider(org.apache.tuscany.sca.provider.ReferenceBindingProvider);
    public abstract org.apache.tuscany.sca.provider.ReferenceBindingProvider getBindingProvider();
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getBindingInterfaceContract();
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getComponentTypeReferenceInterfaceContract();
    public abstract void validateReferenceInterfaceCompatibility();
    public abstract boolean isOutOfDate();
    public abstract void rebuild();
    public abstract boolean isStarted();
    public abstract org.apache.tuscany.sca.interfacedef.InterfaceContract getGeneratedWSDLContract(org.apache.tuscany.sca.interfacedef.InterfaceContract);
    public abstract void createAsyncCallbackEndpoint();
}

Compiled from "RuntimeProperties.java"
public interface org.apache.tuscany.sca.runtime.RuntimeProperties{
    public static final java.lang.String QUIET_LOGGING;
    public abstract java.util.Properties getProperties();
    public abstract void setProperties(java.util.Properties);
}

Compiled from "RuntimeWireProcessor.java"
public interface org.apache.tuscany.sca.runtime.RuntimeWireProcessor{
    public abstract void process(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public abstract void process(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
}

Compiled from "RuntimeWireProcessorExtensionPoint.java"
public interface org.apache.tuscany.sca.runtime.RuntimeWireProcessorExtensionPoint{
    public abstract void addWireProcessor(org.apache.tuscany.sca.runtime.RuntimeWireProcessor);
    public abstract void removeWireProcessor(org.apache.tuscany.sca.runtime.RuntimeWireProcessor);
    public abstract java.util.List getWireProcessors();
}

Compiled from "UnknownEndpointHandler.java"
public interface org.apache.tuscany.sca.runtime.UnknownEndpointHandler{
    public abstract org.apache.tuscany.sca.assembly.Binding handleUnknownEndpoint(org.apache.tuscany.sca.assembly.EndpointReference);
}

Compiled from "Version.java"
public class org.apache.tuscany.sca.runtime.Version extends java.lang.Object{
    public static final java.lang.String VERSION;
    public static final java.lang.String REVISION;
    public static final java.lang.String BUILDTIME;
    public org.apache.tuscany.sca.runtime.Version();
    public static java.lang.String getVersion();
    public static java.lang.String getRevsion();
    public static java.lang.String getBuildTime();
    static {};
}

Compiled from "NotificationListener.java"
public interface org.apache.tuscany.sca.work.NotificationListener{
    public abstract void workAccepted(java.lang.Runnable);
    public abstract void workCompleted(java.lang.Runnable);
    public abstract void workStarted(java.lang.Runnable);
    public abstract void workRejected(java.lang.Runnable);
    public abstract void workFailed(java.lang.Runnable, java.lang.Throwable);
}

Compiled from "WorkScheduler.java"
public interface org.apache.tuscany.sca.work.WorkScheduler{
    public abstract void scheduleWork(java.lang.Runnable, org.apache.tuscany.sca.work.NotificationListener);
    public abstract void scheduleWork(java.lang.Runnable);
    public abstract java.util.concurrent.ExecutorService getExecutorService();
}

Compiled from "WorkSchedulerException.java"
public class org.apache.tuscany.sca.work.WorkSchedulerException extends java.lang.RuntimeException{
    public org.apache.tuscany.sca.work.WorkSchedulerException();
    public org.apache.tuscany.sca.work.WorkSchedulerException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.work.WorkSchedulerException(java.lang.String);
    public org.apache.tuscany.sca.work.WorkSchedulerException(java.lang.Throwable);
}

Compiled from "RuntimeAssemblyFactory.java"
public class org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory extends org.apache.tuscany.sca.assembly.DefaultAssemblyFactory implements org.apache.tuscany.sca.assembly.AssemblyFactory{
    public org.apache.tuscany.sca.core.assembly.RuntimeAssemblyFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.assembly.Component createComponent();
    public org.apache.tuscany.sca.assembly.ComponentReference createComponentReference();
    public org.apache.tuscany.sca.assembly.ComponentService createComponentService();
    public org.apache.tuscany.sca.assembly.Endpoint createEndpoint();
    public org.apache.tuscany.sca.assembly.EndpointReference createEndpointReference();
}

Compiled from "CompositeActivatorImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.CompositeActivatorImpl extends java.lang.Object implements org.apache.tuscany.sca.runtime.CompositeActivator{
    final java.util.logging.Logger logger;
    public org.apache.tuscany.sca.core.assembly.impl.CompositeActivatorImpl(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Composite)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public void deactivate(org.apache.tuscany.sca.assembly.Composite)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public void activateComponent(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Component)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public void deactivateComponent(org.apache.tuscany.sca.assembly.Component)       throws org.apache.tuscany.sca.runtime.ActivationException;
    public void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentService);
    public void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public void deactivate(org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentService);
    public void deactivate(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentReference);
    public void deactivate(org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentReference);
    public void activate(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public void deactivate(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Composite);
    public void stop(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Composite);
    public void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Component);
    public void stop(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.assembly.Component);
    public void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.core.scope.ScopedRuntimeComponent);
    public void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public void stop(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeComponent, org.apache.tuscany.sca.runtime.RuntimeComponentReference);
    public void stop(org.apache.tuscany.sca.assembly.Component, org.apache.tuscany.sca.assembly.ComponentReference);
    public void start(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public void stop(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
}

Compiled from "EndpointRegistryImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.EndpointRegistryImpl extends org.apache.tuscany.sca.runtime.BaseEndpointRegistry implements org.apache.tuscany.sca.runtime.EndpointRegistry,org.apache.tuscany.sca.core.LifeCycleListener{
    protected boolean quietLogging;
    public org.apache.tuscany.sca.core.assembly.impl.EndpointRegistryImpl(org.apache.tuscany.sca.core.ExtensionPointRegistry, java.lang.String, java.lang.String);
    public synchronized void addEndpoint(org.apache.tuscany.sca.assembly.Endpoint);
    public java.util.List findEndpoint(java.lang.String);
    public synchronized void removeEndpoint(org.apache.tuscany.sca.assembly.Endpoint);
    public synchronized java.util.List getEndpoints();
    public synchronized org.apache.tuscany.sca.assembly.Endpoint getEndpoint(java.lang.String);
    public synchronized void updateEndpoint(java.lang.String, org.apache.tuscany.sca.assembly.Endpoint);
    public synchronized void start();
    public synchronized void stop();
    public java.util.Collection getEndpoints();
}

Compiled from "EndpointSerializerImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.EndpointSerializerImpl extends java.lang.Object implements org.apache.tuscany.sca.runtime.EndpointSerializer{
    public org.apache.tuscany.sca.core.assembly.impl.EndpointSerializerImpl(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.assembly.Endpoint readEndpoint(java.lang.String);
    public java.lang.String write(org.apache.tuscany.sca.assembly.Endpoint);
    public org.apache.tuscany.sca.assembly.EndpointReference readEndpointReference(java.lang.String);
    public java.lang.String write(org.apache.tuscany.sca.assembly.EndpointReference);
}

Compiled from "LocalDomainRegistryFactory.java"
public class org.apache.tuscany.sca.core.assembly.impl.LocalDomainRegistryFactory extends org.apache.tuscany.sca.runtime.BaseDomainRegistryFactory{
    public org.apache.tuscany.sca.core.assembly.impl.LocalDomainRegistryFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    protected org.apache.tuscany.sca.runtime.EndpointRegistry createEndpointRegistry(java.lang.String, java.lang.String);
    public java.lang.String[] getSupportedSchemes();
    static {};
}

Compiled from "ReferenceParameterProcessor.java"
public class org.apache.tuscany.sca.core.assembly.impl.ReferenceParameterProcessor extends java.lang.Object implements org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor{
    public org.apache.tuscany.sca.core.assembly.impl.ReferenceParameterProcessor(org.apache.tuscany.sca.core.FactoryExtensionPoint);
    public javax.xml.namespace.QName getArtifactType();
    public org.apache.tuscany.sca.runtime.ReferenceParameters read(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    public void write(org.apache.tuscany.sca.runtime.ReferenceParameters, javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException, javax.xml.stream.XMLStreamException;
    public java.lang.Class getModelType();
    public void resolve(org.apache.tuscany.sca.runtime.ReferenceParameters, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
    public void write(java.lang.Object, javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionWriteException, javax.xml.stream.XMLStreamException;
    public java.lang.Object read(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    public void resolve(java.lang.Object, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
    static {};
}

Compiled from "ReferenceParametersImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.ReferenceParametersImpl extends java.lang.Object implements org.apache.tuscany.sca.runtime.ReferenceParameters{
    public org.apache.tuscany.sca.core.assembly.impl.ReferenceParametersImpl();
    public java.lang.Object getCallbackID();
    public void setCallbackID(java.lang.Object);
    public org.apache.tuscany.sca.assembly.EndpointReference getCallbackReference();
    public void setCallbackReference(org.apache.tuscany.sca.assembly.EndpointReference);
    public java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public java.lang.Object getCallbackObjectID();
    public void setCallbackObjectID(java.lang.Object);
    public int hashCode();
    public boolean equals(java.lang.Object);
}

Compiled from "RuntimeComponentImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.RuntimeComponentImpl extends org.apache.tuscany.sca.assembly.impl.ComponentImpl implements org.apache.tuscany.sca.runtime.RuntimeComponent,org.apache.tuscany.sca.core.scope.ScopedRuntimeComponent,org.apache.tuscany.sca.contribution.resolver.ResolverExtension{
    protected org.apache.tuscany.sca.runtime.RuntimeComponentContext componentContext;
    protected org.apache.tuscany.sca.provider.ImplementationProvider implementationProvider;
    protected java.util.List policyProviders;
    protected org.apache.tuscany.sca.core.scope.ScopeContainer scopeContainer;
    protected boolean started;
    protected org.apache.tuscany.sca.contribution.resolver.ModelResolver modelResolver;
    public org.apache.tuscany.sca.core.assembly.impl.RuntimeComponentImpl();
    public org.apache.tuscany.sca.provider.ImplementationProvider getImplementationProvider();
    public void setImplementationProvider(org.apache.tuscany.sca.provider.ImplementationProvider);
    public org.apache.tuscany.sca.core.scope.ScopeContainer getScopeContainer();
    public void setScopeContainer(org.apache.tuscany.sca.core.scope.ScopeContainer);
    public boolean isStarted();
    public void setStarted(boolean);
    public org.apache.tuscany.sca.runtime.RuntimeComponentContext getComponentContext();
    public void setComponentContext(org.apache.tuscany.sca.runtime.RuntimeComponentContext);
    public void addPolicyProvider(org.apache.tuscany.sca.provider.PolicyProvider);
    public java.util.List getPolicyProviders();
    public org.apache.tuscany.sca.contribution.resolver.ModelResolver getModelResolver();
    public void setModelResolver(org.apache.tuscany.sca.contribution.resolver.ModelResolver);
    public java.lang.String toString();
    public org.oasisopen.sca.ServiceReference getServiceReference(java.lang.Class, java.lang.String);
}

Compiled from "RuntimeComponentReferenceImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.RuntimeComponentReferenceImpl extends org.apache.tuscany.sca.assembly.impl.ComponentReferenceImpl implements org.apache.tuscany.sca.runtime.RuntimeComponentReference{
    public org.apache.tuscany.sca.core.assembly.impl.RuntimeComponentReferenceImpl();
    public org.apache.tuscany.sca.runtime.RuntimeComponent getComponent();
    public void setComponent(org.apache.tuscany.sca.runtime.RuntimeComponent);
    public java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public java.lang.String toString();
}

Compiled from "RuntimeComponentServiceImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.RuntimeComponentServiceImpl extends org.apache.tuscany.sca.assembly.impl.ComponentServiceImpl implements org.apache.tuscany.sca.runtime.RuntimeComponentService{
    public org.apache.tuscany.sca.core.assembly.impl.RuntimeComponentServiceImpl();
    public java.lang.String toString();
}

Compiled from "RuntimeEndpointImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl extends org.apache.tuscany.sca.assembly.impl.EndpointImpl implements org.apache.tuscany.sca.runtime.RuntimeEndpoint,java.io.Externalizable{
    protected org.apache.tuscany.sca.interfacedef.InterfaceContract bindingInterfaceContract;
    protected org.apache.tuscany.sca.interfacedef.InterfaceContract serviceInterfaceContract;
    public org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl();
    public org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    protected void copyFrom(org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointImpl);
    public void bind(org.apache.tuscany.sca.context.CompositeContext);
    public void bind(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.runtime.EndpointRegistry);
    public void unbind();
    public synchronized java.util.List getInvocationChains();
    public synchronized org.apache.tuscany.sca.invocation.InvocationChain getBindingInvocationChain();
    public org.apache.tuscany.sca.invocation.InvocationChain getInvocationChain(org.apache.tuscany.sca.interfacedef.Operation);
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.Message);
    public java.lang.Object invoke(org.apache.tuscany.sca.interfacedef.Operation, java.lang.Object[])       throws java.lang.reflect.InvocationTargetException;
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.invocation.Message);
    public void invokeAsync(org.apache.tuscany.sca.invocation.Message);
    public void invokeAsync(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.invocation.Message);
    public void invokeAsyncResponse(org.apache.tuscany.sca.invocation.Message);
    public void createAsyncServerCallback();
    public org.apache.tuscany.sca.runtime.RuntimeEndpointReference getAsyncServerCallback();
    public void validateServiceInterfaceCompatibility();
    public java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public synchronized org.apache.tuscany.sca.provider.ServiceBindingProvider getBindingProvider();
    public synchronized java.util.List getPolicyProviders();
    public void setBindingProvider(org.apache.tuscany.sca.provider.ServiceBindingProvider);
    public org.apache.tuscany.sca.assembly.Contract getContract();
    public org.apache.tuscany.sca.context.CompositeContext getCompositeContext();
    protected void reset();
    protected synchronized void resolve();
    public org.apache.tuscany.sca.interfacedef.InterfaceContract getBindingInterfaceContract();
    public org.apache.tuscany.sca.interfacedef.InterfaceContract getComponentTypeServiceInterfaceContract();
    public void readExternal(java.io.ObjectInput)       throws java.io.IOException, java.lang.ClassNotFoundException;
    public void writeExternal(java.io.ObjectOutput)       throws java.io.IOException;
    public org.apache.tuscany.sca.interfacedef.InterfaceContract getGeneratedWSDLContract(org.apache.tuscany.sca.interfacedef.InterfaceContract);
    static {};
}

Compiled from "RuntimeEndpointReferenceImpl.java"
public class org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointReferenceImpl extends org.apache.tuscany.sca.assembly.impl.EndpointReferenceImpl implements org.apache.tuscany.sca.runtime.RuntimeEndpointReference,java.io.Externalizable{
    protected org.apache.tuscany.sca.interfacedef.InterfaceContract bindingInterfaceContract;
    protected org.apache.tuscany.sca.interfacedef.InterfaceContract referenceInterfaceContract;
    public org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointReferenceImpl();
    public org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointReferenceImpl(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    protected void copyFrom(org.apache.tuscany.sca.core.assembly.impl.RuntimeEndpointReferenceImpl);
    public void bind(org.apache.tuscany.sca.context.CompositeContext);
    public void bind(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.runtime.EndpointRegistry);
    public synchronized java.util.List getInvocationChains();
    public synchronized org.apache.tuscany.sca.invocation.InvocationChain getBindingInvocationChain();
    public org.apache.tuscany.sca.invocation.InvocationChain getInvocationChain(org.apache.tuscany.sca.interfacedef.Operation);
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.Message);
    public java.lang.Object invoke(org.apache.tuscany.sca.interfacedef.Operation, java.lang.Object[])       throws java.lang.reflect.InvocationTargetException;
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.invocation.Message);
    public void invokeAsync(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.invocation.Message);
    public void invokeAsync(org.apache.tuscany.sca.invocation.Message);
    public void invokeAsyncResponse(org.apache.tuscany.sca.invocation.Message);
    public void validateReferenceInterfaceCompatibility();
    public void rebuild();
    public java.lang.Object clone()       throws java.lang.CloneNotSupportedException;
    public boolean isOutOfDate();
    public synchronized org.apache.tuscany.sca.provider.ReferenceBindingProvider getBindingProvider();
    public void setBindingProvider(org.apache.tuscany.sca.provider.ReferenceBindingProvider);
    public synchronized java.util.List getPolicyProviders();
    public void unbind();
    public org.apache.tuscany.sca.assembly.Contract getContract();
    public org.apache.tuscany.sca.context.CompositeContext getCompositeContext();
    public org.apache.tuscany.sca.interfacedef.InterfaceContract getBindingInterfaceContract();
    public org.apache.tuscany.sca.interfacedef.InterfaceContract getComponentTypeReferenceInterfaceContract();
    protected synchronized void resolve();
    public void readExternal(java.io.ObjectInput)       throws java.io.IOException, java.lang.ClassNotFoundException;
    public void writeExternal(java.io.ObjectOutput)       throws java.io.IOException;
    public boolean isStarted();
    public org.apache.tuscany.sca.interfacedef.InterfaceContract getGeneratedWSDLContract(org.apache.tuscany.sca.interfacedef.InterfaceContract);
    public void createAsyncCallbackEndpoint();
}

Compiled from "DefaultComponentContextFactory.java"
public class org.apache.tuscany.sca.core.context.DefaultComponentContextFactory extends java.lang.Object implements org.apache.tuscany.sca.context.ComponentContextFactory{
    public org.apache.tuscany.sca.core.context.DefaultComponentContextFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.oasisopen.sca.ComponentContext createComponentContext(org.apache.tuscany.sca.context.CompositeContext, org.apache.tuscany.sca.runtime.RuntimeComponent);
}

Compiled from "DefaultRequestContextFactory.java"
public class org.apache.tuscany.sca.core.context.DefaultRequestContextFactory extends java.lang.Object implements org.apache.tuscany.sca.context.RequestContextFactory{
    public org.apache.tuscany.sca.core.context.DefaultRequestContextFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.oasisopen.sca.RequestContext createRequestContext(org.apache.tuscany.sca.runtime.RuntimeComponent);
}

Compiled from "ServiceReferenceExt.java"
public interface org.apache.tuscany.sca.core.context.ServiceReferenceExt extends org.oasisopen.sca.ServiceReference,java.io.Externalizable{
    public abstract org.apache.tuscany.sca.runtime.RuntimeEndpointReference getEndpointReference();
    public abstract java.lang.Object getProxy();
    public abstract void setProxy(java.lang.Object);
}

Compiled from "InstanceWrapper.java"
public interface org.apache.tuscany.sca.core.factory.InstanceWrapper{
    public abstract java.lang.Object getInstance();
    public abstract void start()       throws org.apache.tuscany.sca.core.scope.TargetInitializationException;
    public abstract void stop()       throws org.apache.tuscany.sca.core.scope.TargetDestructionException;
}

Compiled from "ObjectCreationException.java"
public class org.apache.tuscany.sca.core.factory.ObjectCreationException extends java.lang.RuntimeException{
    public org.apache.tuscany.sca.core.factory.ObjectCreationException();
    public org.apache.tuscany.sca.core.factory.ObjectCreationException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.core.factory.ObjectCreationException(java.lang.String);
    public org.apache.tuscany.sca.core.factory.ObjectCreationException(java.lang.Throwable);
}

Compiled from "ObjectFactory.java"
public interface org.apache.tuscany.sca.core.factory.ObjectFactory{
    public abstract java.lang.Object getInstance()       throws org.apache.tuscany.sca.core.factory.ObjectCreationException;
}

Compiled from "AsyncFaultWrapper.java"
public class org.apache.tuscany.sca.core.invocation.AsyncFaultWrapper extends java.lang.Object{
    public org.apache.tuscany.sca.core.invocation.AsyncFaultWrapper();
    public org.apache.tuscany.sca.core.invocation.AsyncFaultWrapper(java.lang.Throwable);
    public void storeFault(java.lang.Throwable);
    public java.lang.Throwable retrieveFault();
    public void setFaultClassName(java.lang.String);
    public java.lang.String getFaultClassName();
    public java.lang.String getFaultMessage();
    public void setFaultMessage(java.lang.String);
    public org.apache.tuscany.sca.core.invocation.AsyncFaultWrapper getContainedFault();
    public void setContainedFault(org.apache.tuscany.sca.core.invocation.AsyncFaultWrapper);
}

Compiled from "AsyncResponseException.java"
public class org.apache.tuscany.sca.core.invocation.AsyncResponseException extends java.lang.RuntimeException{
    public org.apache.tuscany.sca.core.invocation.AsyncResponseException();
    public org.apache.tuscany.sca.core.invocation.AsyncResponseException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.core.invocation.AsyncResponseException(java.lang.String);
    public org.apache.tuscany.sca.core.invocation.AsyncResponseException(java.lang.Throwable);
}

Compiled from "AsyncResponseHandler.java"
public interface org.apache.tuscany.sca.core.invocation.AsyncResponseHandler extends org.apache.tuscany.sca.core.invocation.AsyncResponseService{
    public abstract void setWrappedFault(org.apache.tuscany.sca.core.invocation.AsyncFaultWrapper);
    public abstract void setFault(java.lang.Throwable);
    public abstract void setResponse(java.lang.Object);
}

Compiled from "AsyncResponseInvoker.java"
public class org.apache.tuscany.sca.core.invocation.AsyncResponseInvoker extends java.lang.Object implements org.apache.tuscany.sca.invocation.InvokerAsyncResponse,java.io.Serializable{
    public org.apache.tuscany.sca.core.invocation.AsyncResponseInvoker(org.apache.tuscany.sca.runtime.RuntimeEndpoint, org.apache.tuscany.sca.runtime.RuntimeEndpointReference, java.lang.Object, java.lang.String, java.lang.String, org.apache.tuscany.sca.invocation.MessageFactory);
    public void invokeAsyncResponse(org.apache.tuscany.sca.invocation.Message);
    public java.lang.Object getResponseTargetAddress();
    public void setResponseTargetAddress(java.lang.Object);
    public java.lang.String getRelatesToMsgID();
    public void setRelatesToMsgID(java.lang.String);
    public void invokeAsyncResponse(java.lang.Object, java.util.Map);
    public void setBindingType(java.lang.String);
    public java.lang.String getBindingType();
    public org.apache.tuscany.sca.runtime.RuntimeEndpoint getRequestEndpoint();
    public org.apache.tuscany.sca.runtime.RuntimeEndpointReference getResponseEndpointReference();
    public void setResponseEndpointReference(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
}

Compiled from "AsyncResponseService.java"
public interface org.apache.tuscany.sca.core.invocation.AsyncResponseService{
    public abstract void setWrappedFault(org.apache.tuscany.sca.core.invocation.AsyncFaultWrapper);
    public abstract void setResponse(java.lang.Object);
}

Compiled from "CallableReferenceObjectFactory.java"
public class org.apache.tuscany.sca.core.invocation.CallableReferenceObjectFactory extends java.lang.Object implements org.apache.tuscany.sca.core.factory.ObjectFactory{
    public org.apache.tuscany.sca.core.invocation.CallableReferenceObjectFactory(java.lang.Class, org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
    public org.oasisopen.sca.ServiceReference getInstance()       throws org.apache.tuscany.sca.core.factory.ObjectCreationException;
    public java.lang.Object getInstance()       throws org.apache.tuscany.sca.core.factory.ObjectCreationException;
}

Compiled from "CallbackInterfaceInterceptor.java"
public class org.apache.tuscany.sca.core.invocation.CallbackInterfaceInterceptor extends java.lang.Object implements org.apache.tuscany.sca.invocation.Interceptor{
    public org.apache.tuscany.sca.core.invocation.CallbackInterfaceInterceptor();
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.Message);
    public void setNext(org.apache.tuscany.sca.invocation.Invoker);
    public org.apache.tuscany.sca.invocation.Invoker getNext();
}

Compiled from "CallbackReferenceObjectFactory.java"
public class org.apache.tuscany.sca.core.invocation.CallbackReferenceObjectFactory extends java.lang.Object implements org.apache.tuscany.sca.core.factory.ObjectFactory{
    public org.apache.tuscany.sca.core.invocation.CallbackReferenceObjectFactory(java.lang.Class, org.apache.tuscany.sca.core.invocation.ProxyFactory, java.util.List);
    public org.oasisopen.sca.ServiceReference getInstance()       throws org.apache.tuscany.sca.core.factory.ObjectCreationException;
    public java.lang.Object getInstance()       throws org.apache.tuscany.sca.core.factory.ObjectCreationException;
}

Compiled from "CallbackWireObjectFactory.java"
public class org.apache.tuscany.sca.core.invocation.CallbackWireObjectFactory extends java.lang.Object implements org.apache.tuscany.sca.core.factory.ObjectFactory{
    public org.apache.tuscany.sca.core.invocation.CallbackWireObjectFactory(java.lang.Class, org.apache.tuscany.sca.core.invocation.ProxyFactory, java.util.List);
    public java.lang.Object getInstance()       throws org.apache.tuscany.sca.core.factory.ObjectCreationException;
}

Compiled from "CglibProxyFactory.java"
public class org.apache.tuscany.sca.core.invocation.CglibProxyFactory extends java.lang.Object implements org.apache.tuscany.sca.core.invocation.ProxyFactory{
    public org.apache.tuscany.sca.core.invocation.CglibProxyFactory(org.apache.tuscany.sca.invocation.MessageFactory, org.apache.tuscany.sca.interfacedef.InterfaceContractMapper);
    public java.lang.Object createProxy(java.lang.Class, org.apache.tuscany.sca.runtime.Invocable)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public java.lang.Object createProxy(org.oasisopen.sca.ServiceReference)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public java.lang.Object createCallbackProxy(java.lang.Class, java.util.List)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public java.lang.Object createCallbackProxy(org.oasisopen.sca.ServiceReference)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public org.oasisopen.sca.ServiceReference cast(java.lang.Object)       throws java.lang.IllegalArgumentException;
    public boolean isProxyClass(java.lang.Class);
    static org.apache.tuscany.sca.invocation.MessageFactory access$100(org.apache.tuscany.sca.core.invocation.CglibProxyFactory);
}

Compiled from "Constants.java"
public interface org.apache.tuscany.sca.core.invocation.Constants{
    public static final java.lang.String MESSAGE_ID;
    public static final java.lang.String RELATES_TO;
    public static final java.lang.String ASYNC_RESPONSE_INVOKER;
    public static final java.lang.String ASYNC_CALLBACK;
}

Compiled from "DefaultProxyFactoryExtensionPoint.java"
public class org.apache.tuscany.sca.core.invocation.DefaultProxyFactoryExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint,org.apache.tuscany.sca.core.LifeCycleListener{
    public org.apache.tuscany.sca.core.invocation.DefaultProxyFactoryExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.core.invocation.ProxyFactory getClassProxyFactory();
    public org.apache.tuscany.sca.core.invocation.ProxyFactory getInterfaceProxyFactory();
    public void setClassProxyFactory(org.apache.tuscany.sca.core.invocation.ProxyFactory);
    public void setInterfaceProxyFactory(org.apache.tuscany.sca.core.invocation.ProxyFactory);
    public void start();
    public void stop();
}

Compiled from "ExtensibleProxyFactory.java"
public class org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory extends java.lang.Object implements org.apache.tuscany.sca.core.invocation.ProxyFactory{
    public org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory(org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint);
    public org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public static org.apache.tuscany.sca.core.invocation.ExtensibleProxyFactory getInstance(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.oasisopen.sca.ServiceReference cast(java.lang.Object)       throws java.lang.IllegalArgumentException;
    public java.lang.Object createCallbackProxy(java.lang.Class, java.util.List)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public java.lang.Object createProxy(org.oasisopen.sca.ServiceReference)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public java.lang.Object createCallbackProxy(org.oasisopen.sca.ServiceReference)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public java.lang.Object createProxy(java.lang.Class, org.apache.tuscany.sca.runtime.Invocable)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public boolean isProxyClass(java.lang.Class);
}

Compiled from "ExtensibleWireProcessor.java"
public class org.apache.tuscany.sca.core.invocation.ExtensibleWireProcessor extends java.lang.Object implements org.apache.tuscany.sca.runtime.RuntimeWireProcessor{
    public org.apache.tuscany.sca.core.invocation.ExtensibleWireProcessor(org.apache.tuscany.sca.runtime.RuntimeWireProcessorExtensionPoint);
    public void process(org.apache.tuscany.sca.runtime.RuntimeEndpoint);
    public void process(org.apache.tuscany.sca.runtime.RuntimeEndpointReference);
}

Compiled from "InterceptorAsyncImpl.java"
public abstract class org.apache.tuscany.sca.core.invocation.InterceptorAsyncImpl extends java.lang.Object implements org.apache.tuscany.sca.invocation.InterceptorAsync{
    protected org.apache.tuscany.sca.invocation.Invoker next;
    protected org.apache.tuscany.sca.invocation.InvokerAsyncResponse previous;
    public org.apache.tuscany.sca.core.invocation.InterceptorAsyncImpl();
    public org.apache.tuscany.sca.invocation.Invoker getNext();
    public void setNext(org.apache.tuscany.sca.invocation.Invoker);
    public org.apache.tuscany.sca.invocation.InvokerAsyncResponse getPrevious();
    public void setPrevious(org.apache.tuscany.sca.invocation.InvokerAsyncResponse);
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.Message);
    public void invokeAsyncRequest(org.apache.tuscany.sca.invocation.Message)       throws java.lang.Throwable;
    public void invokeAsyncResponse(org.apache.tuscany.sca.invocation.Message);
    public org.apache.tuscany.sca.invocation.Message postProcessRequest(org.apache.tuscany.sca.invocation.Message);
    public org.apache.tuscany.sca.invocation.Message postProcessRequest(org.apache.tuscany.sca.invocation.Message, java.lang.Throwable)       throws java.lang.Throwable;
    public boolean isLocalSCABIndingInvoker();
}

Compiled from "JDKAsyncResponseInvoker.java"
public interface org.apache.tuscany.sca.core.invocation.JDKAsyncResponseInvoker extends org.apache.tuscany.sca.invocation.InvokerAsyncResponse{
    public abstract void registerAsyncResponse(java.lang.String, java.lang.Object);
}

Compiled from "NonBlockingInterceptor.java"
public class org.apache.tuscany.sca.core.invocation.NonBlockingInterceptor extends org.apache.tuscany.sca.core.invocation.InterceptorAsyncImpl{
    public org.apache.tuscany.sca.core.invocation.NonBlockingInterceptor(org.apache.tuscany.sca.work.WorkScheduler);
    public org.apache.tuscany.sca.core.invocation.NonBlockingInterceptor(org.apache.tuscany.sca.work.WorkScheduler, org.apache.tuscany.sca.invocation.Interceptor);
    public void setWorkScheduler(org.apache.tuscany.sca.work.WorkScheduler);
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.Message);
    public org.apache.tuscany.sca.invocation.Message processRequest(org.apache.tuscany.sca.invocation.Message);
    public org.apache.tuscany.sca.invocation.Message processResponse(org.apache.tuscany.sca.invocation.Message);
    static java.util.logging.Logger access$100();
    static {};
}

Compiled from "ProxyCreationException.java"
public class org.apache.tuscany.sca.core.invocation.ProxyCreationException extends org.apache.tuscany.sca.core.factory.ObjectCreationException{
    public org.apache.tuscany.sca.core.invocation.ProxyCreationException();
    public org.apache.tuscany.sca.core.invocation.ProxyCreationException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.core.invocation.ProxyCreationException(java.lang.String);
    public org.apache.tuscany.sca.core.invocation.ProxyCreationException(java.lang.Throwable);
}

Compiled from "ProxyFactory.java"
public interface org.apache.tuscany.sca.core.invocation.ProxyFactory{
    public abstract java.lang.Object createProxy(java.lang.Class, org.apache.tuscany.sca.runtime.Invocable)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public abstract java.lang.Object createProxy(org.oasisopen.sca.ServiceReference)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public abstract java.lang.Object createCallbackProxy(java.lang.Class, java.util.List)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public abstract java.lang.Object createCallbackProxy(org.oasisopen.sca.ServiceReference)       throws org.apache.tuscany.sca.core.invocation.ProxyCreationException;
    public abstract org.oasisopen.sca.ServiceReference cast(java.lang.Object)       throws java.lang.IllegalArgumentException;
    public abstract boolean isProxyClass(java.lang.Class);
}

Compiled from "ProxyFactoryExtensionPoint.java"
public interface org.apache.tuscany.sca.core.invocation.ProxyFactoryExtensionPoint{
    public abstract org.apache.tuscany.sca.core.invocation.ProxyFactory getInterfaceProxyFactory();
    public abstract org.apache.tuscany.sca.core.invocation.ProxyFactory getClassProxyFactory();
    public abstract void setInterfaceProxyFactory(org.apache.tuscany.sca.core.invocation.ProxyFactory);
    public abstract void setClassProxyFactory(org.apache.tuscany.sca.core.invocation.ProxyFactory);
}

Compiled from "RuntimeInvoker.java"
public class org.apache.tuscany.sca.core.invocation.RuntimeInvoker extends java.lang.Object implements org.apache.tuscany.sca.invocation.Invoker,org.apache.tuscany.sca.invocation.InvokerAsyncRequest{
    protected org.apache.tuscany.sca.core.ExtensionPointRegistry registry;
    protected org.apache.tuscany.sca.invocation.MessageFactory messageFactory;
    protected org.apache.tuscany.sca.runtime.Invocable invocable;
    public org.apache.tuscany.sca.core.invocation.RuntimeInvoker(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.runtime.Invocable);
    public org.apache.tuscany.sca.invocation.Message invokeBinding(org.apache.tuscany.sca.invocation.Message);
    public void invokeBindingAsync(org.apache.tuscany.sca.invocation.Message);
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.Message);
    public java.lang.Object invoke(org.apache.tuscany.sca.interfacedef.Operation, java.lang.Object[])       throws java.lang.reflect.InvocationTargetException;
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.invocation.Message);
    public org.apache.tuscany.sca.invocation.Message invoke(org.apache.tuscany.sca.invocation.InvocationChain, org.apache.tuscany.sca.invocation.Message);
    public void invokeAsync(org.apache.tuscany.sca.invocation.Message);
    public void invokeAsyncResponse(org.apache.tuscany.sca.invocation.Message);
    public void invokeAsyncRequest(org.apache.tuscany.sca.invocation.Message)       throws java.lang.Throwable;
}

Compiled from "WireObjectFactory.java"
public class org.apache.tuscany.sca.core.invocation.WireObjectFactory extends java.lang.Object implements org.apache.tuscany.sca.core.factory.ObjectFactory{
    public org.apache.tuscany.sca.core.invocation.WireObjectFactory(java.lang.Class, org.apache.tuscany.sca.runtime.Invocable, org.apache.tuscany.sca.core.invocation.ProxyFactory);
    public java.lang.Object getInstance()       throws org.apache.tuscany.sca.core.factory.ObjectCreationException;
}

Compiled from "AbstractScopeContainer.java"
public abstract class org.apache.tuscany.sca.core.scope.AbstractScopeContainer extends java.lang.Object implements org.apache.tuscany.sca.core.scope.ScopeContainer{
    protected java.util.Map wrappers;
    protected final org.apache.tuscany.sca.core.scope.Scope scope;
    protected org.apache.tuscany.sca.runtime.RuntimeComponent component;
    protected volatile int lifecycleState;
    public org.apache.tuscany.sca.core.scope.AbstractScopeContainer(org.apache.tuscany.sca.core.scope.Scope, org.apache.tuscany.sca.runtime.RuntimeComponent);
    protected void checkInit();
    protected org.apache.tuscany.sca.core.factory.InstanceWrapper createInstanceWrapper()       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    public org.apache.tuscany.sca.core.factory.InstanceWrapper getAssociatedWrapper(java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    public org.apache.tuscany.sca.core.scope.Scope getScope();
    public org.apache.tuscany.sca.core.factory.InstanceWrapper getWrapper(java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    public void addWrapperReference(java.lang.Object, java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    public void registerWrapper(org.apache.tuscany.sca.core.factory.InstanceWrapper, java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    protected boolean isEagerInit();
    public void returnWrapper(org.apache.tuscany.sca.core.factory.InstanceWrapper, java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetDestructionException;
    public void remove(java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetDestructionException;
    public synchronized void start();
    public void startContext(java.lang.Object);
    public synchronized void stop();
    public void stopContext(java.lang.Object);
    public java.lang.String toString();
    public org.apache.tuscany.sca.runtime.RuntimeComponent getComponent();
    public void setComponent(org.apache.tuscany.sca.runtime.RuntimeComponent);
    public int getLifecycleState();
    protected void setLifecycleState(int);
}

Compiled from "DefaultScopeRegistry.java"
public class org.apache.tuscany.sca.core.scope.DefaultScopeRegistry extends org.apache.tuscany.sca.core.scope.impl.ScopeRegistryImpl implements org.apache.tuscany.sca.core.scope.ScopeRegistry{
    public org.apache.tuscany.sca.core.scope.DefaultScopeRegistry();
}

Compiled from "Scope.java"
public class org.apache.tuscany.sca.core.scope.Scope extends java.lang.Object{
    public static final org.apache.tuscany.sca.core.scope.Scope STATELESS;
    public static final org.apache.tuscany.sca.core.scope.Scope COMPOSITE;
    public static final org.apache.tuscany.sca.core.scope.Scope INVALID;
    public org.apache.tuscany.sca.core.scope.Scope(java.lang.String);
    public java.lang.String getScope();
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
    static {};
}

Compiled from "ScopeContainer.java"
public interface org.apache.tuscany.sca.core.scope.ScopeContainer{
    public static final int CONFIG_ERROR;
    public static final int UNINITIALIZED;
    public static final int INITIALIZING;
    public static final int INITIALIZED;
    public static final int RUNNING;
    public static final int STOPPING;
    public static final int STOPPED;
    public static final int ERROR;
    public abstract org.apache.tuscany.sca.core.scope.Scope getScope();
    public abstract void startContext(java.lang.Object);
    public abstract void stopContext(java.lang.Object);
    public abstract org.apache.tuscany.sca.core.factory.InstanceWrapper getWrapper(java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    public abstract void addWrapperReference(java.lang.Object, java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    public abstract void registerWrapper(org.apache.tuscany.sca.core.factory.InstanceWrapper, java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    public abstract org.apache.tuscany.sca.core.factory.InstanceWrapper getAssociatedWrapper(java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetResolutionException;
    public abstract void returnWrapper(org.apache.tuscany.sca.core.factory.InstanceWrapper, java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetDestructionException;
    public abstract void remove(java.lang.Object)       throws org.apache.tuscany.sca.core.scope.TargetDestructionException;
    public abstract int getLifecycleState();
    public abstract void start();
    public abstract void stop();
}

Compiled from "ScopeContainerFactory.java"
public interface org.apache.tuscany.sca.core.scope.ScopeContainerFactory{
    public abstract org.apache.tuscany.sca.core.scope.ScopeContainer createScopeContainer(org.apache.tuscany.sca.runtime.RuntimeComponent);
    public abstract org.apache.tuscany.sca.core.scope.Scope getScope();
}

Compiled from "ScopeRegistry.java"
public interface org.apache.tuscany.sca.core.scope.ScopeRegistry{
    public abstract org.apache.tuscany.sca.core.scope.ScopeContainer getScopeContainer(org.apache.tuscany.sca.runtime.RuntimeComponent);
    public abstract void register(org.apache.tuscany.sca.core.scope.ScopeContainerFactory);
}

Compiled from "ScopedImplementationProvider.java"
public interface org.apache.tuscany.sca.core.scope.ScopedImplementationProvider extends org.apache.tuscany.sca.provider.ImplementationProvider{
    public abstract org.apache.tuscany.sca.core.scope.Scope getScope();
    public abstract boolean isEagerInit();
    public abstract org.apache.tuscany.sca.core.factory.InstanceWrapper createInstanceWrapper();
}

Compiled from "ScopedRuntimeComponent.java"
public interface org.apache.tuscany.sca.core.scope.ScopedRuntimeComponent extends org.apache.tuscany.sca.runtime.RuntimeComponent{
    public abstract void setScopeContainer(org.apache.tuscany.sca.core.scope.ScopeContainer);
    public abstract org.apache.tuscany.sca.core.scope.ScopeContainer getScopeContainer();
}

Compiled from "TargetDestructionException.java"
public class org.apache.tuscany.sca.core.scope.TargetDestructionException extends org.apache.tuscany.sca.core.scope.TargetResolutionException{
    public org.apache.tuscany.sca.core.scope.TargetDestructionException();
    public org.apache.tuscany.sca.core.scope.TargetDestructionException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.core.scope.TargetDestructionException(java.lang.String);
    public org.apache.tuscany.sca.core.scope.TargetDestructionException(java.lang.Throwable);
}

Compiled from "TargetInitializationException.java"
public class org.apache.tuscany.sca.core.scope.TargetInitializationException extends org.apache.tuscany.sca.core.scope.TargetResolutionException{
    public org.apache.tuscany.sca.core.scope.TargetInitializationException();
    public org.apache.tuscany.sca.core.scope.TargetInitializationException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.core.scope.TargetInitializationException(java.lang.String);
    public org.apache.tuscany.sca.core.scope.TargetInitializationException(java.lang.Throwable);
}

Compiled from "TargetNotFoundException.java"
public class org.apache.tuscany.sca.core.scope.TargetNotFoundException extends org.apache.tuscany.sca.core.scope.TargetResolutionException{
    public org.apache.tuscany.sca.core.scope.TargetNotFoundException();
    public org.apache.tuscany.sca.core.scope.TargetNotFoundException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.core.scope.TargetNotFoundException(java.lang.String);
    public org.apache.tuscany.sca.core.scope.TargetNotFoundException(java.lang.Throwable);
}

Compiled from "TargetResolutionException.java"
public class org.apache.tuscany.sca.core.scope.TargetResolutionException extends java.lang.Exception{
    public org.apache.tuscany.sca.core.scope.TargetResolutionException();
    public org.apache.tuscany.sca.core.scope.TargetResolutionException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.core.scope.TargetResolutionException(java.lang.String);
    public org.apache.tuscany.sca.core.scope.TargetResolutionException(java.lang.Throwable);
}

Compiled from "BaseDataBinding.java"
public abstract class org.apache.tuscany.sca.databinding.BaseDataBinding extends java.lang.Object implements org.apache.tuscany.sca.databinding.DataBinding{
    static final boolean $assertionsDisabled;
    protected org.apache.tuscany.sca.databinding.BaseDataBinding(java.lang.Class);
    protected org.apache.tuscany.sca.databinding.BaseDataBinding(java.lang.String, java.lang.Class);
    public boolean introspect(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation);
    public org.apache.tuscany.sca.interfacedef.DataType introspect(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    public final java.lang.String getName();
    public org.apache.tuscany.sca.databinding.WrapperHandler getWrapperHandler();
    public java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public org.apache.tuscany.sca.databinding.XMLTypeHelper getXMLTypeHelper();
    static {};
}

Compiled from "BaseTransformer.java"
public abstract class org.apache.tuscany.sca.databinding.BaseTransformer extends java.lang.Object implements org.apache.tuscany.sca.databinding.Transformer{
    protected org.apache.tuscany.sca.databinding.BaseTransformer();
    protected abstract java.lang.Class getSourceType();
    protected abstract java.lang.Class getTargetType();
    public java.lang.String getSourceDataBinding();
    public java.lang.String getTargetDataBinding();
    public int getWeight();
}

Compiled from "DataBinding.java"
public interface org.apache.tuscany.sca.databinding.DataBinding{
    public abstract java.lang.String getName();
    public abstract boolean introspect(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.interfacedef.DataType introspect(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.databinding.WrapperHandler getWrapperHandler();
    public abstract java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.databinding.XMLTypeHelper getXMLTypeHelper();
}

Compiled from "DataBindingContext.java"
public class org.apache.tuscany.sca.databinding.DataBindingContext extends java.lang.Object{
    public org.apache.tuscany.sca.databinding.DataBindingContext(java.lang.Class, java.lang.reflect.Type, java.lang.annotation.Annotation[], org.apache.tuscany.sca.interfacedef.Operation, java.lang.String);
    public org.apache.tuscany.sca.databinding.DataBindingContext(java.lang.Class, java.lang.reflect.Type, java.lang.annotation.Annotation[]);
    public org.apache.tuscany.sca.databinding.DataBindingContext(java.lang.Class);
    public java.lang.Class getType();
    public java.lang.reflect.Type getGenericType();
    public java.lang.annotation.Annotation[] getAnnotations();
    public org.apache.tuscany.sca.interfacedef.Operation getOperation();
    public java.lang.annotation.Annotation getAnnotation(java.lang.Class);
    public java.lang.String getContentType();
}

Compiled from "DataBindingExtensionPoint.java"
public interface org.apache.tuscany.sca.databinding.DataBindingExtensionPoint{
    public abstract void addDataBinding(org.apache.tuscany.sca.databinding.DataBinding);
    public abstract org.apache.tuscany.sca.databinding.DataBinding getDataBinding(java.lang.String);
    public abstract org.apache.tuscany.sca.databinding.DataBinding removeDataBinding(java.lang.String);
    public abstract boolean introspectType(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.interfacedef.DataType introspectType(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "DataPipe.java"
public interface org.apache.tuscany.sca.databinding.DataPipe{
    public abstract java.lang.Object getSink();
    public abstract java.lang.Object getResult();
}

Compiled from "DataPipeTransformer.java"
public interface org.apache.tuscany.sca.databinding.DataPipeTransformer extends org.apache.tuscany.sca.databinding.Transformer{
    public abstract org.apache.tuscany.sca.databinding.DataPipe newInstance();
}

Compiled from "DefaultDataBindingExtensionPoint.java"
public class org.apache.tuscany.sca.databinding.DefaultDataBindingExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.databinding.DataBindingExtensionPoint{
    public org.apache.tuscany.sca.databinding.DefaultDataBindingExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.databinding.DataBinding getDataBinding(java.lang.String);
    public void addDataBinding(org.apache.tuscany.sca.databinding.DataBinding);
    public org.apache.tuscany.sca.databinding.DataBinding removeDataBinding(java.lang.String);
    public boolean introspectType(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation);
    public org.apache.tuscany.sca.interfacedef.DataType introspectType(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    static org.apache.tuscany.sca.core.ExtensionPointRegistry access$200(org.apache.tuscany.sca.databinding.DefaultDataBindingExtensionPoint);
    static {};
}

Compiled from "DefaultTransformerExtensionPoint.java"
public class org.apache.tuscany.sca.databinding.DefaultTransformerExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.databinding.TransformerExtensionPoint{
    public org.apache.tuscany.sca.databinding.DefaultTransformerExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addTransformer(java.lang.String, java.lang.String, int, org.apache.tuscany.sca.databinding.Transformer, boolean);
    public void addTransformer(org.apache.tuscany.sca.databinding.Transformer, boolean);
    public boolean removeTransformer(java.lang.String, java.lang.String);
    public org.apache.tuscany.sca.databinding.Transformer getTransformer(java.lang.String, java.lang.String);
    public java.util.List getTransformerChain(java.lang.String, java.lang.String);
    public java.lang.String toString();
    static org.apache.tuscany.sca.core.ExtensionPointRegistry access$200(org.apache.tuscany.sca.databinding.DefaultTransformerExtensionPoint);
    static {};
}

Compiled from "Mediator.java"
public interface org.apache.tuscany.sca.databinding.Mediator{
    public static final java.lang.String SOURCE_OPERATION;
    public static final java.lang.String TARGET_OPERATION;
    public static final java.lang.String BODY_TYPE;
    public static final java.lang.String BODY_TYPE_INPUT;
    public static final java.lang.String BODY_TYPE_OUTPUT;
    public static final java.lang.String BODY_TYPE_FAULT;
    public abstract java.lang.Object mediate(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, java.util.Map);
    public abstract void mediate(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, java.util.Map);
    public abstract java.lang.Object mediateInput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, java.util.Map);
    public abstract java.lang.Object mediateOutput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, java.util.Map);
    public abstract java.lang.Object mediateFault(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, java.util.Map);
    public abstract java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType);
    public abstract java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType);
    public abstract java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract java.lang.Object copyInput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract java.lang.Object copyInput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract java.lang.Object copyOutput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract java.lang.Object copyOutput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract java.lang.Object copyFault(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract java.lang.Object copyFault(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.databinding.DataBindingExtensionPoint getDataBindings();
    public abstract org.apache.tuscany.sca.databinding.TransformerExtensionPoint getTransformers();
    public abstract org.apache.tuscany.sca.databinding.TransformationContext createTransformationContext();
    public abstract org.apache.tuscany.sca.databinding.TransformationContext createTransformationContext(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, java.util.Map);
}

Compiled from "PullTransformer.java"
public interface org.apache.tuscany.sca.databinding.PullTransformer extends org.apache.tuscany.sca.databinding.Transformer{
    public abstract java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "PushTransformer.java"
public interface org.apache.tuscany.sca.databinding.PushTransformer extends org.apache.tuscany.sca.databinding.Transformer{
    public abstract void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "SimpleTypeMapper.java"
public interface org.apache.tuscany.sca.databinding.SimpleTypeMapper{
    public abstract java.lang.Object toJavaObject(javax.xml.namespace.QName, java.lang.String, org.apache.tuscany.sca.databinding.TransformationContext);
    public abstract java.lang.String toXMLLiteral(javax.xml.namespace.QName, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
    public abstract java.lang.Class getJavaType(javax.xml.namespace.QName);
    public abstract org.apache.tuscany.sca.interfacedef.util.TypeInfo getXMLType(java.lang.Class);
    public abstract boolean isSimpleXSDType(javax.xml.namespace.QName);
}

Compiled from "TransformationContext.java"
public interface org.apache.tuscany.sca.databinding.TransformationContext{
    public abstract org.apache.tuscany.sca.interfacedef.Operation getSourceOperation();
    public abstract void setSourceOperation(org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.interfacedef.Operation getTargetOperation();
    public abstract void setTargetOperation(org.apache.tuscany.sca.interfacedef.Operation);
    public abstract org.apache.tuscany.sca.interfacedef.DataType getSourceDataType();
    public abstract org.apache.tuscany.sca.interfacedef.DataType getTargetDataType();
    public abstract void setSourceDataType(org.apache.tuscany.sca.interfacedef.DataType);
    public abstract void setTargetDataType(org.apache.tuscany.sca.interfacedef.DataType);
    public abstract java.util.Map getMetadata();
}

Compiled from "TransformationException.java"
public class org.apache.tuscany.sca.databinding.TransformationException extends java.lang.RuntimeException{
    public org.apache.tuscany.sca.databinding.TransformationException();
    public org.apache.tuscany.sca.databinding.TransformationException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.databinding.TransformationException(java.lang.String);
    public org.apache.tuscany.sca.databinding.TransformationException(java.lang.Throwable);
    public java.lang.String getSourceDataBinding();
    public void setSourceDataBinding(java.lang.String);
    public java.lang.String getTargetDataBinding();
    public void setTargetDataBinding(java.lang.String);
}

Compiled from "Transformer.java"
public interface org.apache.tuscany.sca.databinding.Transformer{
    public abstract java.lang.String getSourceDataBinding();
    public abstract java.lang.String getTargetDataBinding();
    public abstract int getWeight();
}

Compiled from "TransformerExtensionPoint.java"
public interface org.apache.tuscany.sca.databinding.TransformerExtensionPoint{
    public abstract void addTransformer(java.lang.String, java.lang.String, int, org.apache.tuscany.sca.databinding.Transformer, boolean);
    public abstract void addTransformer(org.apache.tuscany.sca.databinding.Transformer, boolean);
    public abstract boolean removeTransformer(java.lang.String, java.lang.String);
    public abstract org.apache.tuscany.sca.databinding.Transformer getTransformer(java.lang.String, java.lang.String);
    public abstract java.util.List getTransformerChain(java.lang.String, java.lang.String);
}

Compiled from "WrapperHandler.java"
public interface org.apache.tuscany.sca.databinding.WrapperHandler{
    public abstract java.lang.Object create(org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public abstract org.apache.tuscany.sca.interfacedef.DataType getWrapperType(org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public abstract boolean isInstance(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public abstract void setChildren(java.lang.Object, java.lang.Object[], org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public abstract java.util.List getChildren(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, boolean);
}

Compiled from "XMLTypeHelper.java"
public interface org.apache.tuscany.sca.databinding.XMLTypeHelper{
    public abstract org.apache.tuscany.sca.interfacedef.util.TypeInfo getTypeInfo(java.lang.Class, java.lang.Object);
    public abstract java.util.List getSchemaDefinitions(org.apache.tuscany.sca.xsd.XSDFactory, org.apache.tuscany.sca.contribution.resolver.ModelResolver, java.util.List);
    public abstract java.util.List getSchemaDefinitions(org.apache.tuscany.sca.xsd.XSDFactory, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.interfacedef.Interface);
}

Compiled from "DataBinding.java"
public interface org.apache.tuscany.sca.databinding.annotation.DataBinding extends java.lang.annotation.Annotation{
    public abstract java.lang.String value();
    public abstract boolean wrapped();
}

Compiled from "DataType.java"
public interface org.apache.tuscany.sca.databinding.annotation.DataType extends java.lang.annotation.Annotation{
    public abstract java.lang.String value();
}

Compiled from "DirectedGraph.java"
public class org.apache.tuscany.sca.databinding.impl.DirectedGraph extends java.lang.Object implements java.lang.Cloneable{
    public org.apache.tuscany.sca.databinding.impl.DirectedGraph();
    public void addEdge(java.lang.Object, java.lang.Object, java.lang.Object, int, boolean);
    public void addEdge(java.lang.Object, java.lang.Object);
    public org.apache.tuscany.sca.databinding.impl.DirectedGraph$Vertex getVertex(java.lang.Object);
    public boolean removeEdge(java.lang.Object, java.lang.Object);
    public void removeEdge(org.apache.tuscany.sca.databinding.impl.DirectedGraph$Edge);
    public void removeVertex(org.apache.tuscany.sca.databinding.impl.DirectedGraph$Vertex);
    public org.apache.tuscany.sca.databinding.impl.DirectedGraph$Edge getEdge(org.apache.tuscany.sca.databinding.impl.DirectedGraph$Vertex, org.apache.tuscany.sca.databinding.impl.DirectedGraph$Vertex);
    public org.apache.tuscany.sca.databinding.impl.DirectedGraph$Edge getEdge(java.lang.Object, java.lang.Object);
    public org.apache.tuscany.sca.databinding.impl.DirectedGraph$Path getShortestPath(java.lang.Object, java.lang.Object);
    public java.lang.String toString();
    public java.util.Map getVertices();
    public void addGraph(org.apache.tuscany.sca.databinding.impl.DirectedGraph);
    public java.util.List topologicalSort(boolean);
    public java.lang.Object clone();
    static {};
}

Compiled from "Group2GroupTransformer.java"
public class org.apache.tuscany.sca.databinding.impl.Group2GroupTransformer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    protected org.apache.tuscany.sca.databinding.Mediator mediator;
    public org.apache.tuscany.sca.databinding.impl.Group2GroupTransformer(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public java.lang.String getSourceDataBinding();
    public java.lang.String getTargetDataBinding();
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "GroupDataBinding.java"
public abstract class org.apache.tuscany.sca.databinding.impl.GroupDataBinding extends org.apache.tuscany.sca.databinding.BaseDataBinding{
    public static final java.lang.String NAME;
    protected java.lang.Class[] markerTypes;
    public org.apache.tuscany.sca.databinding.impl.GroupDataBinding(java.lang.Class[]);
    public boolean introspect(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation);
    protected boolean isTypeOf(java.lang.Class, java.lang.Class);
    protected java.lang.String getDataBinding(java.lang.Class);
    protected abstract java.lang.Object getLogical(java.lang.Class, org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "Java2SimpleTypeTransformer.java"
public abstract class org.apache.tuscany.sca.databinding.impl.Java2SimpleTypeTransformer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    protected org.apache.tuscany.sca.databinding.SimpleTypeMapper mapper;
    public org.apache.tuscany.sca.databinding.impl.Java2SimpleTypeTransformer();
    public org.apache.tuscany.sca.databinding.impl.Java2SimpleTypeTransformer(org.apache.tuscany.sca.databinding.SimpleTypeMapper);
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.Class getSourceType();
    public int getWeight();
    protected abstract java.lang.Object createElement(javax.xml.namespace.QName, java.lang.String, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.String getSourceDataBinding();
}

Compiled from "MediatorImpl.java"
public class org.apache.tuscany.sca.databinding.impl.MediatorImpl extends java.lang.Object implements org.apache.tuscany.sca.databinding.Mediator{
    org.apache.tuscany.sca.databinding.impl.MediatorImpl(org.apache.tuscany.sca.databinding.DataBindingExtensionPoint, org.apache.tuscany.sca.databinding.TransformerExtensionPoint);
    public org.apache.tuscany.sca.databinding.impl.MediatorImpl(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public java.lang.Object mediate(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, java.util.Map);
    public void mediate(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, java.util.Map);
    public org.apache.tuscany.sca.databinding.DataBindingExtensionPoint getDataBindings();
    public org.apache.tuscany.sca.databinding.TransformerExtensionPoint getTransformers();
    public java.lang.Object mediateFault(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, java.util.Map);
    public java.lang.Object mediateOutput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, java.util.Map);
    public java.lang.Object mediateInput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation, java.util.Map);
    public org.apache.tuscany.sca.databinding.TransformationContext createTransformationContext();
    public org.apache.tuscany.sca.databinding.TransformationContext createTransformationContext(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, java.util.Map);
    public java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType);
    public java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType);
    public java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public java.lang.Object copyInput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    public java.lang.Object copyInput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public java.lang.Object copyOutput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    public java.lang.Object copyOutput(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public java.lang.Object copyFault(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation);
    public java.lang.Object copyFault(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "PipedTransformer.java"
public class org.apache.tuscany.sca.databinding.impl.PipedTransformer extends java.lang.Object implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.impl.PipedTransformer(org.apache.tuscany.sca.databinding.PushTransformer, org.apache.tuscany.sca.databinding.DataPipeTransformer);
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.String getSourceDataBinding();
    public java.lang.String getTargetDataBinding();
    public int getWeight();
}

Compiled from "SimpleType2JavaTransformer.java"
public abstract class org.apache.tuscany.sca.databinding.impl.SimpleType2JavaTransformer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    protected org.apache.tuscany.sca.databinding.SimpleTypeMapper mapper;
    public org.apache.tuscany.sca.databinding.impl.SimpleType2JavaTransformer();
    public org.apache.tuscany.sca.databinding.impl.SimpleType2JavaTransformer(org.apache.tuscany.sca.databinding.SimpleTypeMapper);
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getTargetType();
    public int getWeight();
    protected abstract java.lang.String getText(java.lang.Object);
    protected void close(java.lang.Object);
    public java.lang.String getTargetDataBinding();
}

Compiled from "SimpleTypeMapperImpl.java"
public class org.apache.tuscany.sca.databinding.impl.SimpleTypeMapperImpl extends org.apache.tuscany.sca.databinding.impl.XSDDataTypeConverter implements org.apache.tuscany.sca.databinding.SimpleTypeMapper{
    public static final java.util.Map JAVA2XML;
    public static final java.lang.String URI_2001_SCHEMA_XSD;
    public static final java.util.Map XML2JAVA;
    public static final javax.xml.namespace.QName XSD_ANY;
    public static final javax.xml.namespace.QName XSD_ANYSIMPLETYPE;
    public static final javax.xml.namespace.QName XSD_ANYTYPE;
    public static final javax.xml.namespace.QName XSD_ANYURI;
    public static final javax.xml.namespace.QName XSD_BASE64;
    public static final javax.xml.namespace.QName XSD_BOOLEAN;
    public static final javax.xml.namespace.QName XSD_BYTE;
    public static final javax.xml.namespace.QName XSD_DATE;
    public static final javax.xml.namespace.QName XSD_DATETIME;
    public static final javax.xml.namespace.QName XSD_DAY;
    public static final javax.xml.namespace.QName XSD_DECIMAL;
    public static final javax.xml.namespace.QName XSD_DOUBLE;
    public static final javax.xml.namespace.QName XSD_DURATION;
    public static final javax.xml.namespace.QName XSD_ENTITIES;
    public static final javax.xml.namespace.QName XSD_ENTITY;
    public static final javax.xml.namespace.QName XSD_FLOAT;
    public static final javax.xml.namespace.QName XSD_HEXBIN;
    public static final javax.xml.namespace.QName XSD_IDREF;
    public static final javax.xml.namespace.QName XSD_IDREFS;
    public static final javax.xml.namespace.QName XSD_INT;
    public static final javax.xml.namespace.QName XSD_INTEGER;
    public static final javax.xml.namespace.QName XSD_LONG;
    public static final javax.xml.namespace.QName XSD_MONTH;
    public static final javax.xml.namespace.QName XSD_MONTHDAY;
    public static final javax.xml.namespace.QName XSD_NAME;
    public static final javax.xml.namespace.QName XSD_NCNAME;
    public static final javax.xml.namespace.QName XSD_NEGATIVEINTEGER;
    public static final javax.xml.namespace.QName XSD_NMTOKEN;
    public static final javax.xml.namespace.QName XSD_NMTOKENS;
    public static final javax.xml.namespace.QName XSD_NONNEGATIVEINTEGER;
    public static final javax.xml.namespace.QName XSD_NONPOSITIVEINTEGER;
    public static final javax.xml.namespace.QName XSD_NORMALIZEDSTRING;
    public static final javax.xml.namespace.QName XSD_NOTATION;
    public static final javax.xml.namespace.QName XSD_POSITIVEINTEGER;
    public static final javax.xml.namespace.QName XSD_QNAME;
    public static final javax.xml.namespace.QName XSD_SHORT;
    public static final java.util.Map XSD_SIMPLE_TYPES;
    public static final javax.xml.namespace.QName XSD_STRING;
    public static final javax.xml.namespace.QName XSD_TIME;
    public static final javax.xml.namespace.QName XSD_TOKEN;
    public static final javax.xml.namespace.QName XSD_UNSIGNEDBYTE;
    public static final javax.xml.namespace.QName XSD_UNSIGNEDINT;
    public static final javax.xml.namespace.QName XSD_UNSIGNEDLONG;
    public static final javax.xml.namespace.QName XSD_UNSIGNEDSHORT;
    public static final javax.xml.namespace.QName XSD_YEAR;
    public static final javax.xml.namespace.QName XSD_YEARMONTH;
    public org.apache.tuscany.sca.databinding.impl.SimpleTypeMapperImpl();
    public java.lang.Class getJavaType(javax.xml.namespace.QName);
    public org.apache.tuscany.sca.interfacedef.util.TypeInfo getXMLType(java.lang.Class);
    public java.lang.Object toJavaObject(javax.xml.namespace.QName, java.lang.String, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.String toXMLLiteral(javax.xml.namespace.QName, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
    public boolean isSimpleXSDType(javax.xml.namespace.QName);
    static {};
}

Compiled from "TransformationContextImpl.java"
public class org.apache.tuscany.sca.databinding.impl.TransformationContextImpl extends java.lang.Object implements org.apache.tuscany.sca.databinding.TransformationContext{
    public org.apache.tuscany.sca.databinding.impl.TransformationContextImpl();
    public org.apache.tuscany.sca.databinding.impl.TransformationContextImpl(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, java.util.Map);
    public org.apache.tuscany.sca.interfacedef.DataType getSourceDataType();
    public org.apache.tuscany.sca.interfacedef.DataType getTargetDataType();
    public void setSourceDataType(org.apache.tuscany.sca.interfacedef.DataType);
    public void setTargetDataType(org.apache.tuscany.sca.interfacedef.DataType);
    public java.util.Map getMetadata();
    public org.apache.tuscany.sca.interfacedef.Operation getSourceOperation();
    public void setSourceOperation(org.apache.tuscany.sca.interfacedef.Operation);
    public org.apache.tuscany.sca.interfacedef.Operation getTargetOperation();
    public void setTargetOperation(org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "XSDDataTypeConverter.java"
public class org.apache.tuscany.sca.databinding.impl.XSDDataTypeConverter extends java.lang.Object{
    public org.apache.tuscany.sca.databinding.impl.XSDDataTypeConverter();
    public java.lang.String parseAnySimpleType(java.lang.String);
    public byte[] parseBase64Binary(java.lang.String);
    public boolean parseBoolean(java.lang.String);
    public byte parseByte(java.lang.String);
    public java.util.Calendar parseDate(java.lang.String);
    public java.util.Calendar parseDateTime(java.lang.String);
    public java.math.BigDecimal parseDecimal(java.lang.String);
    public double parseDouble(java.lang.String);
    public javax.xml.datatype.Duration parseDuration(java.lang.String);
    public float parseFloat(java.lang.String);
    public byte[] parseHexBinary(java.lang.String);
    public int parseInt(java.lang.String);
    public java.math.BigInteger parseInteger(java.lang.String);
    public long parseLong(java.lang.String);
    public javax.xml.namespace.QName parseQName(java.lang.String, javax.xml.namespace.NamespaceContext);
    public short parseShort(java.lang.String);
    public java.lang.String parseString(java.lang.String);
    public java.util.Calendar parseTime(java.lang.String);
    public long parseUnsignedInt(java.lang.String);
    public int parseUnsignedShort(java.lang.String);
    public java.lang.String printAnySimpleType(java.lang.String);
    public java.lang.String printBase64Binary(byte[]);
    public java.lang.String printBoolean(boolean);
    public java.lang.String printByte(byte);
    public java.lang.String printDate(java.util.Calendar);
    public java.lang.String printDateTime(java.util.Calendar);
    public java.lang.String printDecimal(java.math.BigDecimal);
    public java.lang.String printDouble(double);
    public java.lang.String printDuration(javax.xml.datatype.Duration);
    public java.lang.String printFloat(float);
    public java.lang.String printHexBinary(byte[]);
    public java.lang.String printInt(int);
    public java.lang.String printInteger(java.math.BigInteger);
    public java.lang.String printLong(long);
    public java.lang.String printQName(javax.xml.namespace.QName, javax.xml.namespace.NamespaceContext);
    public java.lang.String printShort(short);
    public java.lang.String printString(java.lang.String);
    public java.lang.String printTime(java.util.Calendar);
    public java.lang.String printUnsignedInt(long);
    public java.lang.String printUnsignedShort(int);
}

Compiled from "BeanXMLStreamReaderImpl.java"
public class org.apache.tuscany.sca.databinding.xml.BeanXMLStreamReaderImpl extends org.apache.tuscany.sca.common.xml.stax.reader.XmlTreeStreamReaderImpl{
    public org.apache.tuscany.sca.databinding.xml.BeanXMLStreamReaderImpl(javax.xml.namespace.QName, java.lang.Object);
    static java.util.Map access$000(java.lang.Object)       throws java.lang.Exception;
    static java.util.Comparator access$100();
    static {};
}

Compiled from "DOMDataBinding.java"
public class org.apache.tuscany.sca.databinding.xml.DOMDataBinding extends org.apache.tuscany.sca.databinding.BaseDataBinding{
    public static final java.lang.String NAME;
    public static final java.lang.String ROOT_NAMESPACE;
    public static final javax.xml.namespace.QName ROOT_ELEMENT;
    public org.apache.tuscany.sca.databinding.xml.DOMDataBinding(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.databinding.WrapperHandler getWrapperHandler();
    public java.lang.Object copy(java.lang.Object, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation, org.apache.tuscany.sca.interfacedef.Operation);
    public boolean introspect(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation);
    public static org.w3c.dom.Element adjustElementName(org.apache.tuscany.sca.databinding.TransformationContext, org.w3c.dom.Element);
    static {};
}

Compiled from "DOMWrapperHandler.java"
public class org.apache.tuscany.sca.databinding.xml.DOMWrapperHandler extends java.lang.Object implements org.apache.tuscany.sca.databinding.WrapperHandler{
    static final boolean $assertionsDisabled;
    public org.apache.tuscany.sca.databinding.xml.DOMWrapperHandler(org.apache.tuscany.sca.common.xml.dom.DOMHelper);
    public org.w3c.dom.Node create(org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public void setChildren(org.w3c.dom.Node, java.lang.Object[], org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public void setChild(org.w3c.dom.Node, int, org.apache.tuscany.sca.interfacedef.util.ElementInfo, java.lang.Object);
    public java.util.List getChildren(org.w3c.dom.Node, org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public org.apache.tuscany.sca.interfacedef.DataType getWrapperType(org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public boolean isInstance(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public java.util.List getChildren(java.lang.Object, org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public void setChildren(java.lang.Object, java.lang.Object[], org.apache.tuscany.sca.interfacedef.Operation, boolean);
    public java.lang.Object create(org.apache.tuscany.sca.interfacedef.Operation, boolean);
    static {};
}

Compiled from "InputSource2Node.java"
public class org.apache.tuscany.sca.databinding.xml.InputSource2Node extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.InputSource2Node(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.w3c.dom.Node transform(org.xml.sax.InputSource, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.Class getSourceType();
    public java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "InputSource2SAX.java"
public class org.apache.tuscany.sca.databinding.xml.InputSource2SAX extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PushTransformer{
    public org.apache.tuscany.sca.databinding.xml.InputSource2SAX();
    public void transform(org.xml.sax.InputSource, org.xml.sax.ContentHandler, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.Class getSourceType();
    public java.lang.Class getTargetType();
    public int getWeight();
    public void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "InputStream2Node.java"
public class org.apache.tuscany.sca.databinding.xml.InputStream2Node extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.InputStream2Node(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.w3c.dom.Node transform(java.io.InputStream, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.Class getSourceType();
    public java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "InputStream2SAX.java"
public class org.apache.tuscany.sca.databinding.xml.InputStream2SAX extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PushTransformer{
    public org.apache.tuscany.sca.databinding.xml.InputStream2SAX();
    public void transform(java.io.InputStream, org.xml.sax.ContentHandler, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.Class getSourceType();
    public java.lang.Class getTargetType();
    public int getWeight();
    public void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Node2OutputStream.java"
public class org.apache.tuscany.sca.databinding.xml.Node2OutputStream extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PushTransformer{
    public org.apache.tuscany.sca.databinding.xml.Node2OutputStream(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void transform(org.w3c.dom.Node, java.io.OutputStream, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Node2SimpleJavaType.java"
public class org.apache.tuscany.sca.databinding.xml.Node2SimpleJavaType extends org.apache.tuscany.sca.databinding.impl.SimpleType2JavaTransformer{
    public org.apache.tuscany.sca.databinding.xml.Node2SimpleJavaType();
    protected java.lang.String getText(org.w3c.dom.Node);
    public java.lang.Class getSourceType();
    protected java.lang.String getText(java.lang.Object);
}

Compiled from "Node2SourceTransformer.java"
public class org.apache.tuscany.sca.databinding.xml.Node2SourceTransformer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.Node2SourceTransformer();
    public javax.xml.transform.Source transform(org.w3c.dom.Node, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Node2String.java"
public class org.apache.tuscany.sca.databinding.xml.Node2String extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.Node2String(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public java.lang.String transform(org.w3c.dom.Node, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.Class getSourceType();
    public java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Node2Writer.java"
public class org.apache.tuscany.sca.databinding.xml.Node2Writer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PushTransformer{
    public org.apache.tuscany.sca.databinding.xml.Node2Writer(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void transform(org.w3c.dom.Node, java.io.Writer, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Node2XMLStreamReader.java"
public class org.apache.tuscany.sca.databinding.xml.Node2XMLStreamReader extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.Node2XMLStreamReader();
    public javax.xml.stream.XMLStreamReader transform(org.w3c.dom.Node, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Reader2Node.java"
public class org.apache.tuscany.sca.databinding.xml.Reader2Node extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.Reader2Node(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.w3c.dom.Node transform(java.io.Reader, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Reader2SAX.java"
public class org.apache.tuscany.sca.databinding.xml.Reader2SAX extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PushTransformer{
    public org.apache.tuscany.sca.databinding.xml.Reader2SAX();
    public void transform(java.io.Reader, org.xml.sax.ContentHandler, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "SAX2DOMPipe.java"
public class org.apache.tuscany.sca.databinding.xml.SAX2DOMPipe extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.DataPipeTransformer{
    public org.apache.tuscany.sca.databinding.xml.SAX2DOMPipe(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.apache.tuscany.sca.databinding.DataPipe newInstance();
    protected java.lang.Class getTargetType();
    protected java.lang.Class getSourceType();
    public int getWeight();
    static org.apache.tuscany.sca.common.xml.dom.DOMHelper access$000(org.apache.tuscany.sca.databinding.xml.SAX2DOMPipe);
}

Compiled from "SimpleJavaType2Node.java"
public class org.apache.tuscany.sca.databinding.xml.SimpleJavaType2Node extends org.apache.tuscany.sca.databinding.impl.Java2SimpleTypeTransformer{
    public org.apache.tuscany.sca.databinding.xml.SimpleJavaType2Node(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    protected org.w3c.dom.Node createElement(javax.xml.namespace.QName, java.lang.String, org.apache.tuscany.sca.databinding.TransformationContext);
    public java.lang.Class getTargetType();
    protected java.lang.Object createElement(javax.xml.namespace.QName, java.lang.String, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Source2NodeTransformer.java"
public class org.apache.tuscany.sca.databinding.xml.Source2NodeTransformer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.Source2NodeTransformer(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.w3c.dom.Node transform(javax.xml.transform.Source, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Source2ResultTransformer.java"
public class org.apache.tuscany.sca.databinding.xml.Source2ResultTransformer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PushTransformer{
    public org.apache.tuscany.sca.databinding.xml.Source2ResultTransformer(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void transform(javax.xml.transform.Source, javax.xml.transform.Result, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Source2StringTransformer.java"
public class org.apache.tuscany.sca.databinding.xml.Source2StringTransformer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.Source2StringTransformer(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public java.lang.String transform(javax.xml.transform.Source, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "StAXDataBinding.java"
public class org.apache.tuscany.sca.databinding.xml.StAXDataBinding extends org.apache.tuscany.sca.databinding.BaseDataBinding{
    public static final java.lang.String NAME;
    public org.apache.tuscany.sca.databinding.xml.StAXDataBinding();
    public boolean introspect(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation);
    static {};
}

Compiled from "StreamDataPipe.java"
public class org.apache.tuscany.sca.databinding.xml.StreamDataPipe extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.DataPipeTransformer{
    public org.apache.tuscany.sca.databinding.xml.StreamDataPipe();
    public org.apache.tuscany.sca.databinding.DataPipe newInstance();
    protected java.lang.Class getTargetType();
    public int getWeight();
    protected java.lang.Class getSourceType();
}

Compiled from "String2Node.java"
public class org.apache.tuscany.sca.databinding.xml.String2Node extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.String2Node(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.w3c.dom.Node transform(java.lang.String, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "String2SAX.java"
public class org.apache.tuscany.sca.databinding.xml.String2SAX extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PushTransformer{
    public org.apache.tuscany.sca.databinding.xml.String2SAX();
    public void transform(java.lang.String, org.xml.sax.ContentHandler, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "String2SourceTransformer.java"
public class org.apache.tuscany.sca.databinding.xml.String2SourceTransformer extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.String2SourceTransformer();
    public javax.xml.transform.Source transform(java.lang.String, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "String2XMLStreamReader.java"
public class org.apache.tuscany.sca.databinding.xml.String2XMLStreamReader extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.String2XMLStreamReader(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public javax.xml.stream.XMLStreamReader transform(java.lang.String, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "Writer2ReaderDataPipe.java"
public class org.apache.tuscany.sca.databinding.xml.Writer2ReaderDataPipe extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.DataPipeTransformer{
    public org.apache.tuscany.sca.databinding.xml.Writer2ReaderDataPipe();
    public org.apache.tuscany.sca.databinding.DataPipe newInstance();
    protected java.lang.Class getTargetType();
    public int getWeight();
    protected java.lang.Class getSourceType();
}

Compiled from "XMLGroupDataBinding.java"
public class org.apache.tuscany.sca.databinding.xml.XMLGroupDataBinding extends org.apache.tuscany.sca.databinding.impl.GroupDataBinding{
    public org.apache.tuscany.sca.databinding.xml.XMLGroupDataBinding();
    protected java.lang.Object getLogical(java.lang.Class, org.apache.tuscany.sca.interfacedef.Operation);
}

Compiled from "XMLStreamReader2Node.java"
public class org.apache.tuscany.sca.databinding.xml.XMLStreamReader2Node extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.XMLStreamReader2Node(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public org.w3c.dom.Node transform(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "XMLStreamReader2SAX.java"
public class org.apache.tuscany.sca.databinding.xml.XMLStreamReader2SAX extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PushTransformer{
    public org.apache.tuscany.sca.databinding.xml.XMLStreamReader2SAX(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    protected java.lang.Class getTargetType();
    protected java.lang.Class getSourceType();
    public int getWeight();
    public void transform(javax.xml.stream.XMLStreamReader, org.xml.sax.ContentHandler, org.apache.tuscany.sca.databinding.TransformationContext);
    public void transform(java.lang.Object, java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "XMLStreamReader2String.java"
public class org.apache.tuscany.sca.databinding.xml.XMLStreamReader2String extends org.apache.tuscany.sca.databinding.BaseTransformer implements org.apache.tuscany.sca.databinding.PullTransformer{
    public org.apache.tuscany.sca.databinding.xml.XMLStreamReader2String(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public java.lang.String transform(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.databinding.TransformationContext);
    protected java.lang.Class getSourceType();
    protected java.lang.Class getTargetType();
    public int getWeight();
    public java.lang.Object transform(java.lang.Object, org.apache.tuscany.sca.databinding.TransformationContext);
}

Compiled from "XMLStringDataBinding.java"
public class org.apache.tuscany.sca.databinding.xml.XMLStringDataBinding extends org.apache.tuscany.sca.databinding.BaseDataBinding{
    public static final java.lang.String NAME;
    public org.apache.tuscany.sca.databinding.xml.XMLStringDataBinding();
    public boolean introspect(org.apache.tuscany.sca.interfacedef.DataType, org.apache.tuscany.sca.interfacedef.Operation);
    static {};
}

Compiled from "DefaultDeployer.java"
public class org.apache.tuscany.sca.deployment.DefaultDeployer extends org.apache.tuscany.sca.deployment.impl.DeployerImpl{
    public org.apache.tuscany.sca.deployment.DefaultDeployer();
    public org.apache.tuscany.sca.deployment.DefaultDeployer(org.apache.tuscany.sca.core.ExtensionPointRegistry);
}

Compiled from "Deployer.java"
public interface org.apache.tuscany.sca.deployment.Deployer extends org.apache.tuscany.sca.core.LifeCycleListener{
    public abstract boolean isSchemaValidationEnabled();
    public abstract void setSchemaValidationEnabled(boolean);
    public abstract java.lang.String attachDeploymentComposite(org.apache.tuscany.sca.contribution.Contribution, org.apache.tuscany.sca.assembly.Composite, boolean);
    public abstract org.apache.tuscany.sca.assembly.Composite build(java.util.List, java.util.List, java.util.Map, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException, org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
    public abstract org.apache.tuscany.sca.assembly.Composite build(java.util.List, java.util.List, org.apache.tuscany.sca.contribution.Contribution, java.util.Map, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException, org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
    public abstract org.apache.tuscany.sca.contribution.Artifact loadArtifact(java.net.URI, java.net.URL, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public abstract org.apache.tuscany.sca.contribution.Contribution loadContribution(java.net.URI, java.net.URL, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public abstract java.lang.Object loadDocument(java.net.URI, java.net.URL, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public abstract java.lang.Object loadXMLDocument(java.io.Reader, org.apache.tuscany.sca.monitor.Monitor)       throws javax.xml.stream.XMLStreamException, org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public abstract java.lang.Object loadXMLDocument(java.net.URL, org.apache.tuscany.sca.monitor.Monitor)       throws javax.xml.stream.XMLStreamException, org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public abstract java.lang.Object loadXMLElement(javax.xml.stream.XMLStreamReader, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException, javax.xml.stream.XMLStreamException;
    public abstract void saveXMLDocument(java.lang.Object, java.io.Writer, org.apache.tuscany.sca.monitor.Monitor)       throws javax.xml.stream.XMLStreamException, org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
    public abstract void saveXMLElement(java.lang.Object, javax.xml.stream.XMLStreamWriter, org.apache.tuscany.sca.monitor.Monitor)       throws javax.xml.stream.XMLStreamException, org.apache.tuscany.sca.contribution.processor.ContributionWriteException;
    public abstract org.apache.tuscany.sca.monitor.Monitor createMonitor();
    public abstract org.apache.tuscany.sca.assembly.builder.BuilderContext createBuilderContext();
    public abstract org.apache.tuscany.sca.contribution.processor.ProcessorContext createProcessorContext();
    public abstract org.apache.tuscany.sca.core.ExtensionPointRegistry getExtensionPointRegistry();
    public abstract org.apache.tuscany.sca.definitions.Definitions getSystemDefinitions();
    public abstract void resolve(org.apache.tuscany.sca.contribution.Contribution, java.util.List, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException, org.apache.tuscany.sca.assembly.builder.CompositeBuilderException;
    public abstract org.apache.tuscany.sca.contribution.Contribution cloneSystemContribution(org.apache.tuscany.sca.monitor.Monitor);
}

Compiled from "DefaultExtensionPointRegistry.java"
public class org.apache.tuscany.sca.core.DefaultExtensionPointRegistry extends java.lang.Object implements org.apache.tuscany.sca.core.ExtensionPointRegistry{
    protected java.util.Map extensionPoints;
    public org.apache.tuscany.sca.core.DefaultExtensionPointRegistry();
    public org.apache.tuscany.sca.core.DefaultExtensionPointRegistry(org.apache.tuscany.sca.extensibility.ServiceDiscovery);
    public synchronized void addExtensionPoint(java.lang.Object);
    public synchronized void addExtensionPoint(java.lang.Object, org.apache.tuscany.sca.extensibility.ServiceDeclaration);
    protected void registerExtensionPoint(java.lang.Class, java.lang.Object, org.apache.tuscany.sca.extensibility.ServiceDeclaration);
    public synchronized java.lang.Object getExtensionPoint(java.lang.Class);
    protected java.lang.Object findExtensionPoint(java.lang.Class);
    public synchronized void removeExtensionPoint(java.lang.Object);
    protected void unregisterExtensionPoint(java.lang.Class);
    public synchronized void start();
    public synchronized void stop();
    public org.apache.tuscany.sca.extensibility.ServiceDiscovery getServiceDiscovery();
}

Compiled from "DefaultFactoryExtensionPoint.java"
public class org.apache.tuscany.sca.core.DefaultFactoryExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.core.FactoryExtensionPoint{
    public org.apache.tuscany.sca.core.DefaultFactoryExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addFactory(java.lang.Object);
    public void removeFactory(java.lang.Object);
    public java.lang.Object getFactory(java.lang.Class);
}

Compiled from "DefaultModuleActivatorExtensionPoint.java"
public class org.apache.tuscany.sca.core.DefaultModuleActivatorExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint{
    public org.apache.tuscany.sca.core.DefaultModuleActivatorExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addModuleActivator(org.apache.tuscany.sca.core.ModuleActivator);
    public java.util.List getModuleActivators();
    public void removeModuleActivator(org.apache.tuscany.sca.core.ModuleActivator);
    public void start();
    public void stop();
    static {};
}

Compiled from "DefaultUtilityExtensionPoint.java"
public class org.apache.tuscany.sca.core.DefaultUtilityExtensionPoint extends java.lang.Object implements org.apache.tuscany.sca.core.UtilityExtensionPoint{
    public org.apache.tuscany.sca.core.DefaultUtilityExtensionPoint(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public void addUtility(java.lang.Object);
    public void addUtility(java.lang.Object, java.lang.Object);
    public java.lang.Object getUtility(java.lang.Class);
    public void removeUtility(java.lang.Object);
    public java.lang.Object getUtility(java.lang.Class, java.lang.Object);
    public void start();
    public synchronized void stop();
}

Compiled from "ExtensionPointRegistry.java"
public interface org.apache.tuscany.sca.core.ExtensionPointRegistry extends org.apache.tuscany.sca.core.LifeCycleListener{
    public abstract void addExtensionPoint(java.lang.Object);
    public abstract java.lang.Object getExtensionPoint(java.lang.Class);
    public abstract void removeExtensionPoint(java.lang.Object);
    public abstract org.apache.tuscany.sca.extensibility.ServiceDiscovery getServiceDiscovery();
}

Compiled from "ExtensionPointRegistryLocator.java"
public class org.apache.tuscany.sca.core.ExtensionPointRegistryLocator extends java.lang.Object{
    public org.apache.tuscany.sca.core.ExtensionPointRegistryLocator();
    public static org.apache.tuscany.sca.core.ExtensionPointRegistry getExtensionPointRegistry();
    public static java.util.List getExtensionPointRegistries();
    public static void addExtensionPointRegistry(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public static void removeExtensionPointRegistry(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    static {};
}

Compiled from "FactoryExtensionPoint.java"
public interface org.apache.tuscany.sca.core.FactoryExtensionPoint{
    public abstract void addFactory(java.lang.Object);
    public abstract void removeFactory(java.lang.Object);
    public abstract java.lang.Object getFactory(java.lang.Class);
}

Compiled from "LifeCycleListener.java"
public interface org.apache.tuscany.sca.core.LifeCycleListener{
    public abstract void start();
    public abstract void stop();
}

Compiled from "ModuleActivator.java"
public interface org.apache.tuscany.sca.core.ModuleActivator extends org.apache.tuscany.sca.core.LifeCycleListener{
    public abstract void start();
    public abstract void stop();
}

Compiled from "ModuleActivatorExtensionPoint.java"
public interface org.apache.tuscany.sca.core.ModuleActivatorExtensionPoint extends org.apache.tuscany.sca.core.LifeCycleListener{
    public abstract void addModuleActivator(org.apache.tuscany.sca.core.ModuleActivator);
    public abstract java.util.List getModuleActivators();
    public abstract void removeModuleActivator(org.apache.tuscany.sca.core.ModuleActivator);
}

Compiled from "UtilityExtensionPoint.java"
public interface org.apache.tuscany.sca.core.UtilityExtensionPoint extends org.apache.tuscany.sca.core.LifeCycleListener{
    public abstract void addUtility(java.lang.Object);
    public abstract void addUtility(java.lang.Object, java.lang.Object);
    public abstract java.lang.Object getUtility(java.lang.Class);
    public abstract java.lang.Object getUtility(java.lang.Class, java.lang.Object);
    public abstract void removeUtility(java.lang.Object);
}

Compiled from "ClassLoaderContext.java"
public class org.apache.tuscany.sca.extensibility.ClassLoaderContext extends java.lang.Object{
    public org.apache.tuscany.sca.extensibility.ClassLoaderContext(java.lang.ClassLoader, org.apache.tuscany.sca.extensibility.ServiceDiscovery, java.lang.Class[]);
    public org.apache.tuscany.sca.extensibility.ClassLoaderContext(java.lang.ClassLoader, java.lang.ClassLoader[]);
    public org.apache.tuscany.sca.extensibility.ClassLoaderContext(java.lang.ClassLoader, org.apache.tuscany.sca.extensibility.ServiceDiscovery, java.lang.String[]);
    public java.lang.Object doPrivileged(java.security.PrivilegedAction);
    public java.lang.Object doPrivileged(java.security.PrivilegedExceptionAction)       throws java.security.PrivilegedActionException;
    public static java.lang.ClassLoader setContextClassLoader(java.lang.ClassLoader, java.lang.ClassLoader[]);
    public static java.lang.ClassLoader setContextClassLoader(java.lang.ClassLoader, org.apache.tuscany.sca.extensibility.ServiceDiscovery, java.lang.String[]);
    public static java.lang.ClassLoader setContextClassLoader(java.lang.ClassLoader, org.apache.tuscany.sca.extensibility.ServiceDiscovery, java.lang.Class[]);
    public java.lang.ClassLoader setContextClassLoader();
    public java.lang.ClassLoader getClassLoader();
}

Compiled from "ContextClassLoaderServiceDiscoverer.java"
public class org.apache.tuscany.sca.extensibility.ContextClassLoaderServiceDiscoverer extends java.lang.Object implements org.apache.tuscany.sca.extensibility.ServiceDiscoverer{
    public org.apache.tuscany.sca.extensibility.ContextClassLoaderServiceDiscoverer();
    public org.apache.tuscany.sca.extensibility.ContextClassLoaderServiceDiscoverer(java.lang.ClassLoader);
    public java.lang.ClassLoader getContextClassLoader();
    public org.apache.tuscany.sca.extensibility.ServiceDeclaration getServiceDeclaration(java.lang.String)       throws java.io.IOException;
    public java.util.Collection getServiceDeclarations(java.lang.String);
    static java.lang.ref.WeakReference access$000(org.apache.tuscany.sca.extensibility.ContextClassLoaderServiceDiscoverer);
    static java.util.Collection access$100(org.apache.tuscany.sca.extensibility.ContextClassLoaderServiceDiscoverer, java.lang.String)       throws java.io.IOException;
    static {};
}

Compiled from "ServiceDeclaration.java"
public interface org.apache.tuscany.sca.extensibility.ServiceDeclaration{
    public abstract java.lang.Class loadClass(java.lang.String)       throws java.lang.ClassNotFoundException;
    public abstract java.lang.Class loadClass()       throws java.lang.ClassNotFoundException;
    public abstract java.util.Map getAttributes();
    public abstract boolean isAssignableTo(java.lang.Class);
    public abstract java.net.URL getLocation();
    public abstract java.lang.String getClassName();
    public abstract java.net.URL getResource(java.lang.String);
    public abstract java.util.Enumeration getResources(java.lang.String)       throws java.io.IOException;
    public abstract boolean equals(java.lang.Object);
    public abstract int hashCode();
}

Compiled from "ServiceDeclarationParser.java"
public class org.apache.tuscany.sca.extensibility.ServiceDeclarationParser extends java.lang.Object{
    public org.apache.tuscany.sca.extensibility.ServiceDeclarationParser();
    public static java.util.List parse(java.lang.String);
    public static java.util.Map parseDeclaration(java.lang.String);
    public static javax.xml.namespace.QName getQName(java.lang.String);
    public static java.util.Collection load(java.net.URL, boolean)       throws java.io.IOException;
}

Compiled from "ServiceDiscoverer.java"
public interface org.apache.tuscany.sca.extensibility.ServiceDiscoverer{
    public abstract java.util.Collection getServiceDeclarations(java.lang.String)       throws java.io.IOException;
    public abstract org.apache.tuscany.sca.extensibility.ServiceDeclaration getServiceDeclaration(java.lang.String)       throws java.io.IOException;
    public abstract java.lang.ClassLoader getContextClassLoader();
}

Compiled from "ServiceDiscovery.java"
public final class org.apache.tuscany.sca.extensibility.ServiceDiscovery extends java.lang.Object implements org.apache.tuscany.sca.extensibility.ServiceDiscoverer{
    public static org.apache.tuscany.sca.extensibility.ServiceDiscovery getInstance();
    public static org.apache.tuscany.sca.extensibility.ServiceDiscovery getInstance(org.apache.tuscany.sca.extensibility.ServiceDiscoverer);
    public org.apache.tuscany.sca.extensibility.ServiceDiscoverer getServiceDiscoverer();
    public void setServiceDiscoverer(org.apache.tuscany.sca.extensibility.ServiceDiscoverer);
    public java.util.Collection getServiceDeclarations(java.lang.String)       throws java.io.IOException;
    public java.util.Collection getServiceDeclarations(java.lang.String, boolean)       throws java.io.IOException;
    public org.apache.tuscany.sca.extensibility.ServiceDeclaration getServiceDeclaration(java.lang.String)       throws java.io.IOException;
    public java.util.Collection getServiceDeclarations(java.lang.Class, boolean)       throws java.io.IOException;
    public java.util.Collection getServiceDeclarations(java.lang.Class)       throws java.io.IOException;
    public java.util.Collection getServiceDeclarations(java.lang.Class, java.lang.String)       throws java.io.IOException;
    public java.util.Collection getServiceDeclarations(java.lang.String, java.lang.String)       throws java.io.IOException;
    public org.apache.tuscany.sca.extensibility.ServiceDeclaration getServiceDeclaration(java.lang.Class)       throws java.io.IOException;
    public java.lang.ClassLoader getContextClassLoader();
    public void setAttribute(java.lang.String, java.util.Map);
    public void setAttribute(java.lang.String, java.lang.String, java.lang.String);
    public java.util.Map getAttributes(java.lang.String);
    public static java.util.Collection removeDuplicateDeclarations(java.util.Collection);
    static {};
}

Compiled from "ServiceHelper.java"
public class org.apache.tuscany.sca.extensibility.ServiceHelper extends java.lang.Object{
    public static boolean start(java.lang.Object);
    public static boolean stop(java.lang.Object);
    public static void stop(java.util.Collection);
    public static java.lang.Object newInstance(java.lang.Class, java.lang.Class, java.lang.Object)       throws java.lang.Exception;
    public static java.lang.Object newInstance(java.lang.Class, java.lang.Class[], java.lang.Object[])       throws java.lang.Exception;
    public static java.lang.Object newInstance(java.lang.Class)       throws java.lang.Exception;
    public static java.lang.Object newInstance(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.extensibility.ServiceDeclaration)       throws java.lang.Exception;
    public static java.lang.Object newLazyInstance(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.extensibility.ServiceDeclaration, java.lang.Class);
    static {};
}

Compiled from "DefaultJavaInterfaceFactory.java"
public class org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory extends org.apache.tuscany.sca.interfacedef.java.impl.JavaInterfaceFactoryImpl implements org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory{
    public org.apache.tuscany.sca.interfacedef.java.DefaultJavaInterfaceFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
    public java.util.List getInterfaceVisitors();
    static {};
}

Compiled from "JavaInterface.java"
public interface org.apache.tuscany.sca.interfacedef.java.JavaInterface extends org.apache.tuscany.sca.interfacedef.Interface,org.apache.tuscany.sca.assembly.Base{
    public abstract java.lang.String getName();
    public abstract void setName(java.lang.String);
    public abstract javax.xml.namespace.QName getQName();
    public abstract void setQName(javax.xml.namespace.QName);
    public abstract java.lang.Class getJavaClass();
    public abstract void setJavaClass(java.lang.Class);
    public abstract java.lang.Class getCallbackClass();
    public abstract void setCallbackClass(java.lang.Class);
    public abstract java.lang.String getJAXWSWSDLLocation();
    public abstract void setJAXWSWSDLLocation(java.lang.String);
    public abstract java.lang.String getJAXWSJavaInterfaceName();
    public abstract void setJAXWSJavaInterfaceName(java.lang.String);
    public abstract org.apache.tuscany.sca.contribution.Contribution getContributionContainingClass();
    public abstract void setContributionContainingClass(org.apache.tuscany.sca.contribution.Contribution);
}

Compiled from "JavaInterfaceContract.java"
public interface org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract extends org.apache.tuscany.sca.interfacedef.InterfaceContract{
}

Compiled from "JavaInterfaceFactory.java"
public interface org.apache.tuscany.sca.interfacedef.java.JavaInterfaceFactory{
    public abstract org.apache.tuscany.sca.interfacedef.java.JavaInterface createJavaInterface();
    public abstract org.apache.tuscany.sca.interfacedef.java.JavaInterface createJavaInterface(java.lang.Class)       throws org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
    public abstract void createJavaInterface(org.apache.tuscany.sca.interfacedef.java.JavaInterface, java.lang.Class)       throws org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
    public abstract org.apache.tuscany.sca.interfacedef.java.JavaOperation createJavaOperation(java.lang.reflect.Method);
    public abstract org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract createJavaInterfaceContract();
    public abstract void addInterfaceVisitor(org.apache.tuscany.sca.interfacedef.java.introspect.JavaInterfaceVisitor);
    public abstract void removeInterfaceVisitor(org.apache.tuscany.sca.interfacedef.java.introspect.JavaInterfaceVisitor);
    public abstract java.util.List getInterfaceVisitors();
}

Compiled from "JavaOperation.java"
public interface org.apache.tuscany.sca.interfacedef.java.JavaOperation extends org.apache.tuscany.sca.interfacedef.Operation{
    public abstract java.lang.reflect.Method getJavaMethod();
    public abstract void setJavaMethod(java.lang.reflect.Method);
    public abstract java.lang.String getAction();
    public abstract void setAction(java.lang.String);
    public abstract void setAsyncServer(boolean);
    public abstract boolean isAsyncServer();
    public abstract boolean hasReturnTypeVoid();
    public abstract void setReturnTypeVoid(boolean);
}

Compiled from "BPELPartnerLinkTypeExt.java"
public class org.apache.tuscany.sca.interfacedef.wsdl.BPELPartnerLinkTypeExt extends java.lang.Object implements javax.wsdl.extensions.ExtensibilityElement{
    public org.apache.tuscany.sca.interfacedef.wsdl.BPELPartnerLinkTypeExt();
    public javax.xml.namespace.QName getElementType();
    public java.lang.Boolean getRequired();
    public void setElementType(javax.xml.namespace.QName);
    public void setRequired(java.lang.Boolean);
    public void setName(java.lang.String);
    public java.lang.String getName();
    public void setRole(int, java.lang.String, javax.xml.namespace.QName);
    public java.lang.String getRoleName(int);
    public javax.xml.namespace.QName getRolePortType(int);
}

Compiled from "DefaultWSDLFactory.java"
public class org.apache.tuscany.sca.interfacedef.wsdl.DefaultWSDLFactory extends org.apache.tuscany.sca.interfacedef.wsdl.impl.WSDLFactoryImpl implements org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory{
    public org.apache.tuscany.sca.interfacedef.wsdl.DefaultWSDLFactory(org.apache.tuscany.sca.core.ExtensionPointRegistry);
}

Compiled from "WSDLDefinition.java"
public interface org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition extends org.apache.tuscany.sca.assembly.Base{
    public abstract javax.wsdl.Definition getDefinition();
    public abstract void setDefinition(javax.wsdl.Definition);
    public abstract java.lang.String getNamespace();
    public abstract void setNamespace(java.lang.String);
    public abstract java.util.List getXmlSchemas();
    public abstract java.net.URI getLocation();
    public abstract void setLocation(java.net.URI);
    public abstract java.net.URI getURI();
    public abstract void setURI(java.net.URI);
    public abstract java.util.List getImportedDefinitions();
    public abstract org.apache.ws.commons.schema.XmlSchemaElement getXmlSchemaElement(javax.xml.namespace.QName);
    public abstract org.apache.ws.commons.schema.XmlSchemaType getXmlSchemaType(javax.xml.namespace.QName);
    public abstract org.apache.tuscany.sca.interfacedef.wsdl.WSDLObject getWSDLObject(java.lang.Class, javax.xml.namespace.QName);
    public abstract javax.wsdl.Binding getBinding();
    public abstract void setBinding(javax.wsdl.Binding);
    public abstract javax.xml.namespace.QName getNameOfPortTypeToResolve();
    public abstract void setNameOfPortTypeToResolve(javax.xml.namespace.QName);
    public abstract javax.xml.namespace.QName getNameOfBindingToResolve();
    public abstract void setNameOfBindingToResolve(javax.xml.namespace.QName);
    public abstract javax.xml.namespace.QName getNameOfServiceToResolve();
    public abstract void setNameOfServiceToResolve(javax.xml.namespace.QName);
    public abstract java.util.Map getWsdliLocations();
}

Compiled from "WSDLFactory.java"
public interface org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory{
    public abstract org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface createWSDLInterface();
    public abstract org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface createWSDLInterface(javax.wsdl.PortType, org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
    public abstract void createWSDLInterface(org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface, javax.wsdl.PortType, org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.monitor.Monitor)       throws org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
    public abstract org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition createWSDLDefinition();
    public abstract org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract createWSDLInterfaceContract();
}

Compiled from "WSDLInterface.java"
public interface org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface extends org.apache.tuscany.sca.interfacedef.Interface,org.apache.tuscany.sca.assembly.Base{
    public abstract javax.xml.namespace.QName getName();
    public abstract void setName(javax.xml.namespace.QName);
    public abstract javax.wsdl.PortType getPortType();
    public abstract void setPortType(javax.wsdl.PortType);
    public abstract org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface getCallbackInterface();
    public abstract void setCallbackInterface(org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface);
    public abstract org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition getWsdlDefinition();
    public abstract void setWsdlDefinition(org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition);
}

Compiled from "WSDLInterfaceContract.java"
public interface org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract extends org.apache.tuscany.sca.interfacedef.InterfaceContract{
    public abstract void setLocation(java.lang.String);
    public abstract java.lang.String getLocation();
}

Compiled from "WSDLObject.java"
public interface org.apache.tuscany.sca.interfacedef.wsdl.WSDLObject{
    public abstract javax.wsdl.Definition getDefinition();
    public abstract void setDefinition(javax.wsdl.Definition);
    public abstract java.io.Serializable getElement();
    public abstract void setElement(java.io.Serializable);
}

Compiled from "WSDLOperation.java"
public interface org.apache.tuscany.sca.interfacedef.wsdl.WSDLOperation extends org.apache.tuscany.sca.interfacedef.Operation{
    public abstract javax.wsdl.Operation getWsdlOperation();
    public abstract void setWsdlOperation(javax.wsdl.Operation);
}

Compiled from "DefaultMonitorFactory.java"
public class org.apache.tuscany.sca.monitor.DefaultMonitorFactory extends java.lang.Object implements org.apache.tuscany.sca.monitor.MonitorFactory{
    public org.apache.tuscany.sca.monitor.DefaultMonitorFactory();
    public org.apache.tuscany.sca.monitor.Monitor createMonitor();
    public org.apache.tuscany.sca.monitor.Monitor getContextMonitor();
    public org.apache.tuscany.sca.monitor.Monitor getContextMonitor(boolean);
    public org.apache.tuscany.sca.monitor.Monitor removeContextMonitor();
    public org.apache.tuscany.sca.monitor.Monitor setContextMonitor(org.apache.tuscany.sca.monitor.Monitor);
}

Compiled from "Monitor.java"
public abstract class org.apache.tuscany.sca.monitor.Monitor extends java.lang.Object{
    public org.apache.tuscany.sca.monitor.Monitor();
    public static void error(org.apache.tuscany.sca.monitor.Monitor, java.lang.Object, java.lang.String, java.lang.String, java.lang.Object[]);
    public static void error(org.apache.tuscany.sca.monitor.Monitor, java.lang.Object, java.lang.String, java.lang.String, java.lang.Throwable);
    public static void error(org.apache.tuscany.sca.monitor.Monitor, java.lang.Object, java.lang.String, java.lang.String, java.lang.Throwable, java.lang.Object[]);
    public static void warning(org.apache.tuscany.sca.monitor.Monitor, java.lang.Object, java.lang.String, java.lang.String, java.lang.Object[]);
    public static void warning(org.apache.tuscany.sca.monitor.Monitor, java.lang.Object, java.lang.String, java.lang.String, java.lang.Throwable);
    public static void warning(org.apache.tuscany.sca.monitor.Monitor, java.lang.Object, java.lang.String, java.lang.String, java.lang.Throwable, java.lang.Object[]);
    public abstract org.apache.tuscany.sca.monitor.Problem createProblem(java.lang.String, java.lang.String, org.apache.tuscany.sca.monitor.Problem$Severity, java.lang.Object, java.lang.String, java.lang.Object[]);
    public abstract org.apache.tuscany.sca.monitor.Problem createProblem(java.lang.String, java.lang.String, org.apache.tuscany.sca.monitor.Problem$Severity, java.lang.Object, java.lang.String, java.lang.Throwable);
    public abstract java.lang.String getArtifactName();
    public abstract org.apache.tuscany.sca.monitor.Problem getLastProblem();
    public abstract java.util.List getProblems();
    public abstract java.lang.Object popContext();
    public abstract void problem(org.apache.tuscany.sca.monitor.Problem);
    public abstract void pushContext(java.lang.Object);
    public abstract void reset();
    public abstract void setArtifactName(java.lang.String);
    public void analyzeProblems()       throws org.apache.tuscany.sca.monitor.ValidationException;
    static {};
}

Compiled from "MonitorFactory.java"
public interface org.apache.tuscany.sca.monitor.MonitorFactory{
    public abstract org.apache.tuscany.sca.monitor.Monitor createMonitor();
    public abstract org.apache.tuscany.sca.monitor.Monitor getContextMonitor();
    public abstract org.apache.tuscany.sca.monitor.Monitor getContextMonitor(boolean);
    public abstract org.apache.tuscany.sca.monitor.Monitor removeContextMonitor();
    public abstract org.apache.tuscany.sca.monitor.Monitor setContextMonitor(org.apache.tuscany.sca.monitor.Monitor);
}

Compiled from "Problem.java"
public interface org.apache.tuscany.sca.monitor.Problem{
    public abstract java.lang.String getSourceClassName();
    public abstract java.lang.String getResourceBundleName();
    public abstract org.apache.tuscany.sca.monitor.Problem$Severity getSeverity();
    public abstract java.lang.String getContext();
    public abstract java.lang.Object getProblemObject();
    public abstract java.lang.String getMessageId();
    public abstract java.lang.Throwable getCause();
    public abstract java.lang.Object[] getMessageParams();
}

Compiled from "ValidationException.java"
public class org.apache.tuscany.sca.monitor.ValidationException extends java.lang.Exception{
    public org.apache.tuscany.sca.monitor.ValidationException();
    public org.apache.tuscany.sca.monitor.ValidationException(java.lang.String, java.lang.Throwable);
    public org.apache.tuscany.sca.monitor.ValidationException(java.lang.String);
    public org.apache.tuscany.sca.monitor.ValidationException(java.lang.Throwable);
}

Compiled from "Contribution.java"
public final class org.apache.tuscany.sca.node.Contribution extends java.lang.Object{
    public org.apache.tuscany.sca.node.Contribution(java.lang.String, java.lang.String);
    public java.lang.String getURI();
    public java.lang.String getLocation();
}

Compiled from "ContributionLocationHelper.java"
public class org.apache.tuscany.sca.node.ContributionLocationHelper extends java.lang.Object{
    public org.apache.tuscany.sca.node.ContributionLocationHelper();
    public static java.lang.String getContributionLocation(java.lang.Class);
    public static java.lang.String getContributionLocation(java.lang.String);
    public static java.util.List getContributionLocations(java.lang.String);
    public static java.lang.String getContributionLocation(java.lang.ClassLoader, java.lang.String);
    public static java.util.List getContributionLocations(java.lang.ClassLoader, java.lang.String);
}

Compiled from "Node.java"
public interface org.apache.tuscany.sca.node.Node{
    public static final java.lang.String DEFAULT_DOMAIN_URI;
    public static final java.lang.String DEFAULT_NODE_URI;
    public abstract org.apache.tuscany.sca.node.Node start();
    public abstract void stop();
    public abstract org.oasisopen.sca.ServiceReference cast(java.lang.Object)       throws java.lang.IllegalArgumentException;
    public abstract java.lang.Object getService(java.lang.Class, java.lang.String);
    public abstract org.oasisopen.sca.ServiceReference getServiceReference(java.lang.Class, java.lang.String);
}

Compiled from "NodeFactory.java"
public abstract class org.apache.tuscany.sca.node.NodeFactory extends org.apache.tuscany.sca.node.configuration.DefaultNodeConfigurationFactory{
    protected static org.apache.tuscany.sca.node.NodeFactory instance;
    protected static java.lang.Class factoryImplClass;
    protected static java.util.List factories;
    protected java.util.Properties properties;
    protected static void setNodeFactory(org.apache.tuscany.sca.node.NodeFactory);
    public static synchronized org.apache.tuscany.sca.node.NodeFactory getInstance();
    public static org.apache.tuscany.sca.node.NodeFactory newInstance();
    public static org.apache.tuscany.sca.node.NodeFactory newInstance(java.util.Map);
    protected org.apache.tuscany.sca.node.NodeFactory();
    public static org.apache.tuscany.sca.node.NodeFactory newInstance(java.util.Properties);
    public static org.apache.tuscany.sca.node.NodeFactory newInstance(java.lang.String);
    public void configure(java.util.Map);
    public org.apache.tuscany.sca.node.Node createNode(java.net.URL);
    public org.apache.tuscany.sca.node.Node createNode(java.io.InputStream);
    public org.apache.tuscany.sca.node.Node createNode(java.lang.String, org.apache.tuscany.sca.node.Contribution[]);
    public final org.apache.tuscany.sca.node.Node createNode(java.net.URI, java.lang.String[]);
    public final org.apache.tuscany.sca.node.Node createNode(java.net.URI, java.lang.String, java.lang.String[]);
    public static java.lang.String getDomainURI(java.net.URI);
    public final org.apache.tuscany.sca.node.Node createNode(java.lang.String, java.lang.String[], java.lang.String[]);
    public final org.apache.tuscany.sca.node.Node createNode(java.lang.String, java.lang.String[]);
    public final org.apache.tuscany.sca.node.Node createNode(java.io.Reader, java.lang.String[], java.lang.String[]);
    public final org.apache.tuscany.sca.node.Node createNode(java.lang.String, java.lang.ClassLoader);
    public org.apache.tuscany.sca.node.Node createNode(org.apache.tuscany.sca.node.Contribution[]);
    public org.apache.tuscany.sca.node.Node createNode(java.io.InputStream, org.apache.tuscany.sca.node.Contribution[]);
    public org.apache.tuscany.sca.node.Node createNode(java.io.Reader, org.apache.tuscany.sca.node.Contribution[]);
    public org.apache.tuscany.sca.node.Node createNode();
    protected synchronized java.lang.String generateNodeURI();
    public void destroy();
    public static java.util.List getNodeFactories();
    public abstract org.apache.tuscany.sca.node.Node createNode(org.apache.tuscany.sca.node.configuration.NodeConfiguration);
    public abstract org.apache.tuscany.sca.node.Node createNode(java.util.List);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration loadConfiguration(java.io.InputStream, java.net.URL);
    public abstract java.lang.Object getExtensionPointRegistry();
    public abstract void init();
    public void setAutoDestroy(boolean);
    static {};
}

Compiled from "NodeMain2.java"
public class org.apache.tuscany.sca.node.NodeMain2 extends java.lang.Object{
    public org.apache.tuscany.sca.node.NodeMain2();
    public static void main(java.lang.String[])       throws java.lang.Exception;
}

Compiled from "BindingConfiguration.java"
public interface org.apache.tuscany.sca.node.configuration.BindingConfiguration{
    public abstract javax.xml.namespace.QName getBindingType();
    public abstract org.apache.tuscany.sca.node.configuration.BindingConfiguration setBindingType(javax.xml.namespace.QName);
    public abstract java.util.List getBaseURIs();
    public abstract org.apache.tuscany.sca.node.configuration.BindingConfiguration addBaseURI(java.lang.String);
}

Compiled from "ContributionConfiguration.java"
public interface org.apache.tuscany.sca.node.configuration.ContributionConfiguration{
    public abstract java.lang.String getURI();
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration setURI(java.lang.String);
    public abstract java.lang.String getLocation();
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration setLocation(java.lang.String);
    public abstract java.util.List getDeploymentComposites();
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration addDeploymentComposite(org.apache.tuscany.sca.node.configuration.DeploymentComposite);
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration addDeploymentComposite(java.net.URI);
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration addDeploymentComposite(java.net.URL);
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration addDeploymentComposite(java.lang.String);
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration addDeploymentComposite(java.io.Reader);
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration addDeploymentComposite(java.io.InputStream);
    public abstract void setStartDeployables(boolean);
    public abstract boolean isStartDeployables();
    public abstract java.util.List getDependentContributionURIs();
    public abstract void setDependentContributionURIs(java.util.List);
    public abstract java.lang.String getMetaDataURL();
    public abstract void setMetaDataURL(java.lang.String);
}

Compiled from "DefaultNodeConfigurationFactory.java"
public class org.apache.tuscany.sca.node.configuration.DefaultNodeConfigurationFactory extends java.lang.Object implements org.apache.tuscany.sca.node.configuration.NodeConfigurationFactory{
    public org.apache.tuscany.sca.node.configuration.DefaultNodeConfigurationFactory();
    public org.apache.tuscany.sca.node.configuration.BindingConfiguration createBindingConfiguration();
    public org.apache.tuscany.sca.node.configuration.ContributionConfiguration createContributionConfiguration();
    public org.apache.tuscany.sca.node.configuration.DeploymentComposite createDeploymentComposite();
    public org.apache.tuscany.sca.node.configuration.NodeConfiguration createNodeConfiguration();
}

Compiled from "DeploymentComposite.java"
public interface org.apache.tuscany.sca.node.configuration.DeploymentComposite{
    public abstract java.lang.String getLocation();
    public abstract org.apache.tuscany.sca.node.configuration.DeploymentComposite setLocation(java.lang.String);
    public abstract java.lang.String getContent();
    public abstract org.apache.tuscany.sca.node.configuration.DeploymentComposite setContent(java.lang.String);
    public abstract java.lang.String getContributionURI();
    public abstract org.apache.tuscany.sca.node.configuration.DeploymentComposite setContributionURI(java.lang.String);
}

Compiled from "NodeConfiguration.java"
public interface org.apache.tuscany.sca.node.configuration.NodeConfiguration{
    public static final java.lang.String DEFAULT_DOMAIN_URI;
    public static final java.lang.String DEFAULT_NODE_URI;
    public static final java.lang.String DEFAULT_DOMAIN_REGISTRY_URI;
    public abstract java.lang.String getDomainURI();
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration setDomainURI(java.lang.String);
    public abstract java.lang.String getDomainRegistryURI();
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration setDomainRegistryURI(java.lang.String);
    public abstract java.lang.String getURI();
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration setURI(java.lang.String);
    public abstract java.util.List getContributions();
    public abstract java.util.List getBindings();
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addContribution(org.apache.tuscany.sca.node.configuration.ContributionConfiguration);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addContribution(java.lang.String, java.lang.String);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addContribution(java.lang.String, java.net.URL);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addContribution(java.net.URI, java.net.URL);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addContribution(java.net.URL[]);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addDeploymentComposite(java.lang.String, java.lang.String);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addDeploymentComposite(java.lang.String, java.io.Reader);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addDeploymentComposite(java.lang.String, java.io.InputStream);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addBinding(org.apache.tuscany.sca.node.configuration.BindingConfiguration);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addBinding(javax.xml.namespace.QName, java.lang.String[]);
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration addBinding(javax.xml.namespace.QName, java.net.URI[]);
    public abstract java.util.List getExtensions();
}

Compiled from "NodeConfigurationFactory.java"
public interface org.apache.tuscany.sca.node.configuration.NodeConfigurationFactory{
    public abstract org.apache.tuscany.sca.node.configuration.NodeConfiguration createNodeConfiguration();
    public abstract org.apache.tuscany.sca.node.configuration.ContributionConfiguration createContributionConfiguration();
    public abstract org.apache.tuscany.sca.node.configuration.BindingConfiguration createBindingConfiguration();
    public abstract org.apache.tuscany.sca.node.configuration.DeploymentComposite createDeploymentComposite();
}

Compiled from "ComponentContext.java"
public interface org.oasisopen.sca.ComponentContext{
    public abstract java.lang.String getURI();
    public abstract java.lang.Object getService(java.lang.Class, java.lang.String)       throws java.lang.IllegalArgumentException;
    public abstract org.oasisopen.sca.ServiceReference getServiceReference(java.lang.Class, java.lang.String)       throws java.lang.IllegalArgumentException;
    public abstract java.util.Collection getServices(java.lang.Class, java.lang.String)       throws java.lang.IllegalArgumentException;
    public abstract java.util.Collection getServiceReferences(java.lang.Class, java.lang.String)       throws java.lang.IllegalArgumentException;
    public abstract org.oasisopen.sca.ServiceReference createSelfReference(java.lang.Class)       throws java.lang.IllegalArgumentException;
    public abstract org.oasisopen.sca.ServiceReference createSelfReference(java.lang.Class, java.lang.String)       throws java.lang.IllegalArgumentException;
    public abstract java.lang.Object getProperty(java.lang.Class, java.lang.String)       throws java.lang.IllegalArgumentException;
    public abstract org.oasisopen.sca.ServiceReference cast(java.lang.Object)       throws java.lang.IllegalArgumentException;
    public abstract org.oasisopen.sca.RequestContext getRequestContext();
}

Compiled from "Constants.java"
public interface org.oasisopen.sca.Constants{
    public static final java.lang.String SCA_NS;
    public static final java.lang.String SCA_PREFIX;
    public static final java.lang.String SERVERAUTHENTICATION;
    public static final java.lang.String CLIENTAUTHENTICATION;
    public static final java.lang.String ATLEASTONCE;
    public static final java.lang.String ATMOSTONCE;
    public static final java.lang.String EXACTLYONCE;
    public static final java.lang.String ORDERED;
    public static final java.lang.String TRANSACTEDONEWAY;
    public static final java.lang.String IMMEDIATEONEWAY;
    public static final java.lang.String PROPAGATESTRANSACTION;
    public static final java.lang.String SUSPENDSTRANSACTION;
    public static final java.lang.String ASYNCINVOCATION;
    public static final java.lang.String SOAP;
    public static final java.lang.String JMS;
    public static final java.lang.String NOLISTENER;
    public static final java.lang.String EJB;
}

Compiled from "InvalidServiceException.java"
public class org.oasisopen.sca.InvalidServiceException extends org.oasisopen.sca.ServiceRuntimeException{
    public org.oasisopen.sca.InvalidServiceException();
    public org.oasisopen.sca.InvalidServiceException(java.lang.String);
    public org.oasisopen.sca.InvalidServiceException(java.lang.String, java.lang.Throwable);
    public org.oasisopen.sca.InvalidServiceException(java.lang.Throwable);
}

Compiled from "NoSuchDomainException.java"
public class org.oasisopen.sca.NoSuchDomainException extends java.lang.Exception{
    public org.oasisopen.sca.NoSuchDomainException();
    public org.oasisopen.sca.NoSuchDomainException(java.lang.String);
    public org.oasisopen.sca.NoSuchDomainException(java.lang.String, java.lang.Throwable);
    public org.oasisopen.sca.NoSuchDomainException(java.lang.Throwable);
}

Compiled from "NoSuchServiceException.java"
public class org.oasisopen.sca.NoSuchServiceException extends java.lang.Exception{
    public org.oasisopen.sca.NoSuchServiceException();
    public org.oasisopen.sca.NoSuchServiceException(java.lang.String);
    public org.oasisopen.sca.NoSuchServiceException(java.lang.String, java.lang.Throwable);
    public org.oasisopen.sca.NoSuchServiceException(java.lang.Throwable);
}

Compiled from "RequestContext.java"
public interface org.oasisopen.sca.RequestContext{
    public abstract javax.security.auth.Subject getSecuritySubject();
    public abstract java.lang.String getServiceName();
    public abstract org.oasisopen.sca.ServiceReference getCallbackReference();
    public abstract java.lang.Object getCallback();
    public abstract org.oasisopen.sca.ServiceReference getServiceReference();
}

Compiled from "ResponseDispatch.java"
public interface org.oasisopen.sca.ResponseDispatch{
    public abstract void sendResponse(java.lang.Object);
    public abstract void sendFault(java.lang.Throwable);
    public abstract java.util.Map getContext();
}

Compiled from "ServiceReference.java"
public interface org.oasisopen.sca.ServiceReference extends java.io.Serializable{
    public abstract java.lang.Object getService();
    public abstract java.lang.Class getBusinessInterface();
}

Compiled from "ServiceRuntimeException.java"
public class org.oasisopen.sca.ServiceRuntimeException extends java.lang.RuntimeException{
    public org.oasisopen.sca.ServiceRuntimeException();
    public org.oasisopen.sca.ServiceRuntimeException(java.lang.String);
    public org.oasisopen.sca.ServiceRuntimeException(java.lang.String, java.lang.Throwable);
    public org.oasisopen.sca.ServiceRuntimeException(java.lang.Throwable);
}

Compiled from "ServiceUnavailableException.java"
public class org.oasisopen.sca.ServiceUnavailableException extends org.oasisopen.sca.ServiceRuntimeException{
    public org.oasisopen.sca.ServiceUnavailableException();
    public org.oasisopen.sca.ServiceUnavailableException(java.lang.String);
    public org.oasisopen.sca.ServiceUnavailableException(java.lang.String, java.lang.Throwable);
    public org.oasisopen.sca.ServiceUnavailableException(java.lang.Throwable);
}

Compiled from "AllowsPassByReference.java"
public interface org.oasisopen.sca.annotation.AllowsPassByReference extends java.lang.annotation.Annotation{
    public abstract boolean value();
}

Compiled from "AsyncFault.java"
public interface org.oasisopen.sca.annotation.AsyncFault extends java.lang.annotation.Annotation{
    public abstract java.lang.Class[] value();
}

Compiled from "AsyncInvocation.java"
public interface org.oasisopen.sca.annotation.AsyncInvocation extends java.lang.annotation.Annotation{
    public static final java.lang.String ASYNCINVOCATION;
    public abstract boolean value();
}

Compiled from "Authentication.java"
public interface org.oasisopen.sca.annotation.Authentication extends java.lang.annotation.Annotation{
    public static final java.lang.String AUTHENTICATION;
    public static final java.lang.String AUTHENTICATION_MESSAGE;
    public static final java.lang.String AUTHENTICATION_TRANSPORT;
    public abstract java.lang.String[] value();
}

Compiled from "Authorization.java"
public interface org.oasisopen.sca.annotation.Authorization extends java.lang.annotation.Annotation{
    public static final java.lang.String AUTHORIZATION;
}

Compiled from "Callback.java"
public interface org.oasisopen.sca.annotation.Callback extends java.lang.annotation.Annotation{
    public abstract java.lang.Class value();
}

Compiled from "ComponentName.java"
public interface org.oasisopen.sca.annotation.ComponentName extends java.lang.annotation.Annotation{
}

Compiled from "Confidentiality.java"
public interface org.oasisopen.sca.annotation.Confidentiality extends java.lang.annotation.Annotation{
    public static final java.lang.String CONFIDENTIALITY;
    public static final java.lang.String CONFIDENTIALITY_MESSAGE;
    public static final java.lang.String CONFIDENTIALITY_TRANSPORT;
    public abstract java.lang.String[] value();
}

Compiled from "Constructor.java"
public interface org.oasisopen.sca.annotation.Constructor extends java.lang.annotation.Annotation{
    public abstract java.lang.String[] value();
}

Compiled from "Context.java"
public interface org.oasisopen.sca.annotation.Context extends java.lang.annotation.Annotation{
}

Compiled from "Destroy.java"
public interface org.oasisopen.sca.annotation.Destroy extends java.lang.annotation.Annotation{
}

Compiled from "EagerInit.java"
public interface org.oasisopen.sca.annotation.EagerInit extends java.lang.annotation.Annotation{
}

Compiled from "Init.java"
public interface org.oasisopen.sca.annotation.Init extends java.lang.annotation.Annotation{
}

Compiled from "Integrity.java"
public interface org.oasisopen.sca.annotation.Integrity extends java.lang.annotation.Annotation{
    public static final java.lang.String INTEGRITY;
    public static final java.lang.String INTEGRITY_MESSAGE;
    public static final java.lang.String INTEGRITY_TRANSPORT;
    public abstract java.lang.String[] value();
}

Compiled from "Intent.java"
public interface org.oasisopen.sca.annotation.Intent extends java.lang.annotation.Annotation{
    public abstract java.lang.String value();
    public abstract java.lang.String targetNamespace();
    public abstract java.lang.String localPart();
}

Compiled from "ManagedSharedTransaction.java"
public interface org.oasisopen.sca.annotation.ManagedSharedTransaction extends java.lang.annotation.Annotation{
    public static final java.lang.String MANAGEDSHAREDTRANSACTION;
}

Compiled from "ManagedTransaction.java"
public interface org.oasisopen.sca.annotation.ManagedTransaction extends java.lang.annotation.Annotation{
    public static final java.lang.String MANAGEDTRANSACTION;
    public static final java.lang.String MANAGEDTRANSACTION_MESSAGE;
    public static final java.lang.String MANAGEDTRANSACTION_TRANSPORT;
    public abstract java.lang.String[] value();
}

Compiled from "MutualAuthentication.java"
public interface org.oasisopen.sca.annotation.MutualAuthentication extends java.lang.annotation.Annotation{
    public static final java.lang.String MUTUALAUTHENTICATION;
}

Compiled from "NoManagedTransaction.java"
public interface org.oasisopen.sca.annotation.NoManagedTransaction extends java.lang.annotation.Annotation{
    public static final java.lang.String NOMANAGEDTRANSACTION;
}

Compiled from "OneWay.java"
public interface org.oasisopen.sca.annotation.OneWay extends java.lang.annotation.Annotation{
}

Compiled from "PolicySets.java"
public interface org.oasisopen.sca.annotation.PolicySets extends java.lang.annotation.Annotation{
    public abstract java.lang.String[] value();
}

Compiled from "Property.java"
public interface org.oasisopen.sca.annotation.Property extends java.lang.annotation.Annotation{
    public abstract java.lang.String name();
    public abstract boolean required();
}

Compiled from "Qualifier.java"
public interface org.oasisopen.sca.annotation.Qualifier extends java.lang.annotation.Annotation{
}

Compiled from "Reference.java"
public interface org.oasisopen.sca.annotation.Reference extends java.lang.annotation.Annotation{
    public abstract java.lang.String name();
    public abstract boolean required();
}

Compiled from "Remotable.java"
public interface org.oasisopen.sca.annotation.Remotable extends java.lang.annotation.Annotation{
}

Compiled from "Requires.java"
public interface org.oasisopen.sca.annotation.Requires extends java.lang.annotation.Annotation{
    public abstract java.lang.String[] value();
}

Compiled from "Scope.java"
public interface org.oasisopen.sca.annotation.Scope extends java.lang.annotation.Annotation{
    public abstract java.lang.String value();
}

Compiled from "Service.java"
public interface org.oasisopen.sca.annotation.Service extends java.lang.annotation.Annotation{
    public abstract java.lang.Class[] value();
    public abstract java.lang.String[] names();
}

Compiled from "DefaultXSDFactory.java"
public class org.apache.tuscany.sca.xsd.DefaultXSDFactory extends org.apache.tuscany.sca.xsd.impl.XSDFactoryImpl implements org.apache.tuscany.sca.xsd.XSDFactory{
    public org.apache.tuscany.sca.xsd.DefaultXSDFactory();
}

Compiled from "XSDFactory.java"
public interface org.apache.tuscany.sca.xsd.XSDFactory{
    public abstract org.apache.tuscany.sca.xsd.XSDefinition createXSDefinition();
}

Compiled from "XSDefinition.java"
public interface org.apache.tuscany.sca.xsd.XSDefinition extends org.apache.tuscany.sca.assembly.Base{
    public abstract org.apache.ws.commons.schema.XmlSchemaCollection getSchemaCollection();
    public abstract void setSchemaCollection(org.apache.ws.commons.schema.XmlSchemaCollection);
    public abstract org.apache.ws.commons.schema.XmlSchema getSchema();
    public abstract void setSchema(org.apache.ws.commons.schema.XmlSchema);
    public abstract java.lang.String getNamespace();
    public abstract void setNamespace(java.lang.String);
    public abstract java.net.URI getLocation();
    public abstract void setLocation(java.net.URI);
    public abstract org.w3c.dom.Document getDocument();
    public abstract void setDocument(org.w3c.dom.Document);
    public abstract org.apache.ws.commons.schema.XmlSchemaElement getXmlSchemaElement(javax.xml.namespace.QName);
    public abstract org.apache.ws.commons.schema.XmlSchemaType getXmlSchemaType(javax.xml.namespace.QName);
    public abstract java.util.List getAggregatedDefinitions();
    public abstract void setAggregatedDefinitions(java.util.List);
}

Compiled from "XSDDocumentProcessor.java"
public class org.apache.tuscany.sca.xsd.xml.XSDDocumentProcessor extends java.lang.Object implements org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor{
    public static final javax.xml.namespace.QName XSD;
    public org.apache.tuscany.sca.xsd.xml.XSDDocumentProcessor(org.apache.tuscany.sca.core.ExtensionPointRegistry, org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor);
    public org.apache.tuscany.sca.xsd.XSDefinition read(java.net.URL, java.net.URI, java.net.URL, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public void resolve(org.apache.tuscany.sca.xsd.XSDefinition, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
    public java.lang.String getArtifactType();
    public java.lang.Class getModelType();
    protected org.apache.tuscany.sca.xsd.XSDefinition indexRead(java.net.URL)       throws java.lang.Exception;
    public java.lang.Object read(java.net.URL, java.net.URI, java.net.URL, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionReadException;
    public void resolve(java.lang.Object, org.apache.tuscany.sca.contribution.resolver.ModelResolver, org.apache.tuscany.sca.contribution.processor.ProcessorContext)       throws org.apache.tuscany.sca.contribution.processor.ContributionResolveException;
    static {};
}

Compiled from "XSDModelResolver.java"
public class org.apache.tuscany.sca.xsd.xml.XSDModelResolver extends java.lang.Object implements org.apache.tuscany.sca.contribution.resolver.ModelResolver{
    public org.apache.tuscany.sca.xsd.xml.XSDModelResolver(org.apache.tuscany.sca.contribution.Contribution, org.apache.tuscany.sca.core.FactoryExtensionPoint);
    public void addModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object removeModel(java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
    public java.lang.Object resolveModel(java.lang.Class, java.lang.Object, org.apache.tuscany.sca.contribution.processor.ProcessorContext);
}

