From 9370a10feb0062aed6d2f36af697c1d83da23daa Mon Sep 17 00:00:00 2001 From: Rodrigo Merino Date: Mon, 27 Jan 2025 11:58:16 -0300 Subject: [PATCH] W-17671141: Reintroduce SOAP Service (#498) * Revert "W-17245993: Remove SOAP service (#491)" --- pom.xml | 457 + src/main/java/module-info.java | 55 + .../soap/SoapServiceImplementation.java | 29 + .../soap/client/CxfAttachmentsFactory.java | 55 + .../service/soap/client/CxfClientFactory.java | 107 + .../soap/client/CxfClientProvider.java | 201 + .../service/soap/client/SoapCxfClient.java | 268 + .../soap/client/SoapCxfClientFactory.java | 115 + .../soap/conduit/SoapServiceConduit.java | 78 + .../conduit/SoapServiceConduitInitiator.java | 67 + .../service/soap/ds/ByteArrayDataSource.java | 50 + .../soap/ds/InputStreamDataSource.java | 52 + .../service/soap/ds/StringDataSource.java | 61 + .../soap/generator/EmptyRequestGenerator.java | 113 + .../soap/generator/SoapRequestGenerator.java | 65 + .../soap/generator/SoapResponseGenerator.java | 123 + .../attachment/AttachmentRequestEnricher.java | 64 + .../AttachmentResponseEnricher.java | 70 + .../generator/attachment/Base64Decoder.java | 75 + .../generator/attachment/Base64Encoder.java | 77 + .../attachment/MtomRequestEnricher.java | 52 + .../attachment/MtomResponseEnricher.java | 48 + .../SoapAttachmentRequestEnricher.java | 53 + .../SoapAttachmentResponseEnricher.java | 81 + .../DispatchingRequestFactory.java | 44 + .../MessageDispatcherInterceptor.java | 100 + .../NamespaceRestorerStaxInterceptor.java | 36 + .../NamespaceRestorerXMLStreamReader.java | 102 + .../NamespaceSaverStaxInterceptor.java | 44 + .../OutputMtomSoapAttachmentsInterceptor.java | 68 + .../OutputSoapHeadersInterceptor.java | 59 + .../ScopeSaverXMLStreamReader.java | 72 + .../interceptor/SoapActionInterceptor.java | 34 + .../interceptor/StreamClosingInterceptor.java | 55 + .../soap/message/EmptySoapResponse.java | 74 + .../soap/message/ImmutableSoapResponse.java | 110 + .../metadata/AttachmentsMetadataResolver.java | 88 + .../soap/metadata/BodyMetadataResolver.java | 70 + .../metadata/DefaultSoapMetadataResolver.java | 63 + .../metadata/HeadersMetadataResolver.java | 75 + .../ImmutableSoapOperationMetadata.java | 43 + .../InputAttachmentsMetadataResolver.java | 27 + .../metadata/InputBodyMetadataResolver.java | 25 + .../InputHeadersMetadataResolver.java | 26 + .../soap/metadata/NodeMetadataResolver.java | 79 + .../OutputAttachmentsMetadataResolver.java | 38 + .../metadata/OutputBodyMetadataResolver.java | 32 + .../OutputHeadersMetadataResolver.java | 33 + .../metadata/ServiceOperationsResolver.java | 30 + .../soap/provider/SoapServiceProvider.java | 25 + .../security/SecurityStrategyCxfAdapter.java | 54 + .../soap/security/SecurityStrategyType.java | 28 + .../WssDecryptSecurityStrategyCxfAdapter.java | 63 + .../WssEncryptSecurityStrategyCxfAdapter.java | 57 + .../WssSignSecurityStrategyCxfAdapter.java | 64 + ...ssTimestampSecurityStrategyCxfAdapter.java | 53 + ...ernameTokenSecurityStrategyCxfAdapter.java | 95 + ...fySignatureSecurityStrategyCxfAdapter.java | 79 + .../callback/CompositeCallbackHandler.java | 36 + .../callback/WSPasswordCallbackHandler.java | 47 + ...eyStoreConfigurationPropertiesBuilder.java | 71 + ...ssStoreConfigurationPropertiesBuilder.java | 43 + ...stStoreConfigurationPropertiesBuilder.java | 47 + .../service/soap/util/AttachmentsUtils.java | 64 + .../util/SoapServiceMetadataTypeUtils.java | 48 + .../soap/util/XmlTransformationException.java | 20 + .../soap/util/XmlTransformationUtils.java | 125 + .../xml/stax/DelegateXMLStreamReader.java | 256 + .../service/soap/xml/stax/StaxSource.java | 210 + .../stax/XMLStreamReaderToContentHandler.java | 375 + .../mule/service/soap/xml/util/XMLUtils.java | 29 + .../META-INF/mule-artifact/mule-artifact.json | 4 + .../soap/AbstractSoapServiceTestCase.java | 104 + .../org/mule/service/soap/SoapTestUtils.java | 76 + .../mule/service/soap/SoapTestXmlValues.java | 135 + .../soap/client/CxfAttachmentsTestCase.java | 90 + .../soap/client/DefaultTestDispatcher.java | 50 + .../service/soap/client/TestSoapClient.java | 62 + .../generator/AbstractEnricherTestCase.java | 29 + .../AbstractRequestEnricherTestCase.java | 44 + .../generator/Base64TransformersTestCase.java | 68 + .../EmptyRequestGeneratorTestCase.java | 54 + .../MtomRequestEnricherTestCase.java | 38 + .../MtomResponseEnricherTestCase.java | 53 + ...oapAttachmentsRequestEnricherTestCase.java | 37 + ...apAttachmentsResponseEnricherTestCase.java | 86 + .../HttpBasicAuthResourceLocator.java | 71 + .../metadata/AbstractMetadataTestCase.java | 38 + .../metadata/AttachmentMetadataTestCase.java | 96 + .../soap/metadata/BodyMetadataTestCase.java | 133 + .../metadata/HeadersMetadataTestCase.java | 113 + .../runtime/CustomDispatcherTestCase.java | 69 + .../runtime/OperationExecutionTestCase.java | 153 + .../runtime/SoapClientFactoryTestCase.java | 79 + .../soap/runtime/SoapFaultTestCase.java | 63 + .../attachments/AttachmentsTestCase.java | 53 + .../attachments/MtomAttachmentsTestCase.java | 25 + .../AbstractWebServiceSecurityTestCase.java | 28 + .../soap/runtime/wss/WssDecryptTestCase.java | 52 + .../soap/runtime/wss/WssEncryptTestCase.java | 54 + .../soap/runtime/wss/WssSignTestCase.java | 51 + .../runtime/wss/WssTimestampTestCase.java | 46 + .../soap/runtime/wss/WssUsernameTestCase.java | 42 + .../wss/WssVerifySignatureTestCase.java | 57 + .../soap/server/BasicAuthHttpServer.java | 78 + .../mule/service/soap/server/HttpServer.java | 124 + .../mule/service/soap/service/Account.java | 53 + .../service/soap/service/EchoException.java | 27 + .../mule/service/soap/service/EchoFault.java | 24 + .../soap/service/EncryptPasswordCallback.java | 21 + .../service/soap/service/Mtom11Service.java | 16 + .../service/soap/service/Mtom12Service.java | 19 + .../soap/service/ServerPasswordCallback.java | 29 + .../service/soap/service/Soap11Service.java | 128 + .../service/soap/service/Soap12Service.java | 17 + .../soap/service/VerifyPasswordCallback.java | 21 + .../DispatchingRequestFactoryTestCase.java | 50 + .../soap/unit/SoapOutputPayloadTestCase.java | 89 + .../unit/SoapResponseGeneratorTestCase.java | 61 + .../unit/XmlTransformationUtilsTestCase.java | 74 + src/test/resources/attachment.txt | 1 + src/test/resources/large.json | 1082 + .../schemas/recursive-embedded-schema.xsd | 7 + .../schemas/simple-service-types.xsd | 89 + src/test/resources/security/clientKeystore | Bin 0 -> 3212 bytes src/test/resources/security/serverKeystore | Bin 0 -> 3213 bytes .../resources/security/ssltest-cacerts.jks | Bin 0 -> 29888 bytes .../resources/security/ssltest-keystore.jks | Bin 0 -> 1445 bytes src/test/resources/security/trustStore | Bin 0 -> 16970 bytes .../trustStoreWithoutMuleServerCertificate | Bin 0 -> 16024 bytes src/test/resources/wsdl/document.wsdl | 102 + src/test/resources/wsdl/human.wsdl | 48774 ++++++++++++++++ .../wsdl/multipart-output/Multipart.wsdl | 45 + .../claim/ClaimTypes-v1.4.xsd | 344 + .../common/CommonTypes-v2.0.xsd | 189 + .../common/MetaTypes-v1.1.xsd | 249 + .../multipart-output/mbr/MbrTypes-v2.1.xsd | 436 + .../multipart-output/util/DMTypes-v2.1.xsd | 615 + .../wsdl/multipart-output/util/harvest.sig | Bin 0 -> 1655 bytes .../resources/wsdl/no-schema-location/0.xsd | 88 + .../resources/wsdl/no-schema-location/1.xsd | 41 + .../resources/wsdl/no-schema-location/2.xsd | 33 + .../wsdl/no-schema-location/test.wsdl | 36 + src/test/resources/wsdl/no-style-defined.wsdl | 62 + .../wsdl/recursive/dir1/dir2/import1.xsd | 42 + .../resources/wsdl/recursive/dir1/import0.xsd | 28 + src/test/resources/wsdl/recursive/import2.xsd | 10 + src/test/resources/wsdl/recursive/import3.xsd | 18 + src/test/resources/wsdl/recursive/import4.xsd | 17 + .../resources/wsdl/recursive/imported.wsdl | 17 + src/test/resources/wsdl/recursive/main.wsdl | 38 + src/test/resources/wsdl/rpc.wsdl | 44 + src/test/resources/wsdl/simple-service.wsdl | 413 + .../resources/wsdl/simple-soap12-service.wsdl | 36 + .../resources/wsdl/types-multiple-schema.wsdl | 54 + 155 files changed, 61626 insertions(+) create mode 100644 src/main/java/module-info.java create mode 100644 src/main/java/org/mule/service/soap/SoapServiceImplementation.java create mode 100644 src/main/java/org/mule/service/soap/client/CxfAttachmentsFactory.java create mode 100644 src/main/java/org/mule/service/soap/client/CxfClientFactory.java create mode 100644 src/main/java/org/mule/service/soap/client/CxfClientProvider.java create mode 100644 src/main/java/org/mule/service/soap/client/SoapCxfClient.java create mode 100644 src/main/java/org/mule/service/soap/client/SoapCxfClientFactory.java create mode 100644 src/main/java/org/mule/service/soap/conduit/SoapServiceConduit.java create mode 100644 src/main/java/org/mule/service/soap/conduit/SoapServiceConduitInitiator.java create mode 100644 src/main/java/org/mule/service/soap/ds/ByteArrayDataSource.java create mode 100644 src/main/java/org/mule/service/soap/ds/InputStreamDataSource.java create mode 100644 src/main/java/org/mule/service/soap/ds/StringDataSource.java create mode 100644 src/main/java/org/mule/service/soap/generator/EmptyRequestGenerator.java create mode 100644 src/main/java/org/mule/service/soap/generator/SoapRequestGenerator.java create mode 100644 src/main/java/org/mule/service/soap/generator/SoapResponseGenerator.java create mode 100644 src/main/java/org/mule/service/soap/generator/attachment/AttachmentRequestEnricher.java create mode 100644 src/main/java/org/mule/service/soap/generator/attachment/AttachmentResponseEnricher.java create mode 100644 src/main/java/org/mule/service/soap/generator/attachment/Base64Decoder.java create mode 100644 src/main/java/org/mule/service/soap/generator/attachment/Base64Encoder.java create mode 100644 src/main/java/org/mule/service/soap/generator/attachment/MtomRequestEnricher.java create mode 100644 src/main/java/org/mule/service/soap/generator/attachment/MtomResponseEnricher.java create mode 100644 src/main/java/org/mule/service/soap/generator/attachment/SoapAttachmentRequestEnricher.java create mode 100644 src/main/java/org/mule/service/soap/generator/attachment/SoapAttachmentResponseEnricher.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/DispatchingRequestFactory.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/MessageDispatcherInterceptor.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/NamespaceRestorerStaxInterceptor.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/NamespaceRestorerXMLStreamReader.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/NamespaceSaverStaxInterceptor.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/OutputMtomSoapAttachmentsInterceptor.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/OutputSoapHeadersInterceptor.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/ScopeSaverXMLStreamReader.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/SoapActionInterceptor.java create mode 100644 src/main/java/org/mule/service/soap/interceptor/StreamClosingInterceptor.java create mode 100644 src/main/java/org/mule/service/soap/message/EmptySoapResponse.java create mode 100644 src/main/java/org/mule/service/soap/message/ImmutableSoapResponse.java create mode 100644 src/main/java/org/mule/service/soap/metadata/AttachmentsMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/BodyMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/DefaultSoapMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/HeadersMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/ImmutableSoapOperationMetadata.java create mode 100644 src/main/java/org/mule/service/soap/metadata/InputAttachmentsMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/InputBodyMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/InputHeadersMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/NodeMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/OutputAttachmentsMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/OutputBodyMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/OutputHeadersMetadataResolver.java create mode 100644 src/main/java/org/mule/service/soap/metadata/ServiceOperationsResolver.java create mode 100644 src/main/java/org/mule/service/soap/provider/SoapServiceProvider.java create mode 100644 src/main/java/org/mule/service/soap/security/SecurityStrategyCxfAdapter.java create mode 100644 src/main/java/org/mule/service/soap/security/SecurityStrategyType.java create mode 100644 src/main/java/org/mule/service/soap/security/WssDecryptSecurityStrategyCxfAdapter.java create mode 100644 src/main/java/org/mule/service/soap/security/WssEncryptSecurityStrategyCxfAdapter.java create mode 100644 src/main/java/org/mule/service/soap/security/WssSignSecurityStrategyCxfAdapter.java create mode 100644 src/main/java/org/mule/service/soap/security/WssTimestampSecurityStrategyCxfAdapter.java create mode 100644 src/main/java/org/mule/service/soap/security/WssUsernameTokenSecurityStrategyCxfAdapter.java create mode 100644 src/main/java/org/mule/service/soap/security/WssVerifySignatureSecurityStrategyCxfAdapter.java create mode 100644 src/main/java/org/mule/service/soap/security/callback/CompositeCallbackHandler.java create mode 100644 src/main/java/org/mule/service/soap/security/callback/WSPasswordCallbackHandler.java create mode 100644 src/main/java/org/mule/service/soap/security/config/WssKeyStoreConfigurationPropertiesBuilder.java create mode 100644 src/main/java/org/mule/service/soap/security/config/WssStoreConfigurationPropertiesBuilder.java create mode 100644 src/main/java/org/mule/service/soap/security/config/WssTrustStoreConfigurationPropertiesBuilder.java create mode 100644 src/main/java/org/mule/service/soap/util/AttachmentsUtils.java create mode 100644 src/main/java/org/mule/service/soap/util/SoapServiceMetadataTypeUtils.java create mode 100644 src/main/java/org/mule/service/soap/util/XmlTransformationException.java create mode 100644 src/main/java/org/mule/service/soap/util/XmlTransformationUtils.java create mode 100644 src/main/java/org/mule/service/soap/xml/stax/DelegateXMLStreamReader.java create mode 100755 src/main/java/org/mule/service/soap/xml/stax/StaxSource.java create mode 100644 src/main/java/org/mule/service/soap/xml/stax/XMLStreamReaderToContentHandler.java create mode 100644 src/main/java/org/mule/service/soap/xml/util/XMLUtils.java create mode 100755 src/test/java/org/mule/service/soap/AbstractSoapServiceTestCase.java create mode 100644 src/test/java/org/mule/service/soap/SoapTestUtils.java create mode 100644 src/test/java/org/mule/service/soap/SoapTestXmlValues.java create mode 100644 src/test/java/org/mule/service/soap/client/CxfAttachmentsTestCase.java create mode 100644 src/test/java/org/mule/service/soap/client/DefaultTestDispatcher.java create mode 100644 src/test/java/org/mule/service/soap/client/TestSoapClient.java create mode 100644 src/test/java/org/mule/service/soap/generator/AbstractEnricherTestCase.java create mode 100644 src/test/java/org/mule/service/soap/generator/AbstractRequestEnricherTestCase.java create mode 100644 src/test/java/org/mule/service/soap/generator/Base64TransformersTestCase.java create mode 100644 src/test/java/org/mule/service/soap/generator/EmptyRequestGeneratorTestCase.java create mode 100644 src/test/java/org/mule/service/soap/generator/MtomRequestEnricherTestCase.java create mode 100644 src/test/java/org/mule/service/soap/generator/MtomResponseEnricherTestCase.java create mode 100644 src/test/java/org/mule/service/soap/generator/SoapAttachmentsRequestEnricherTestCase.java create mode 100644 src/test/java/org/mule/service/soap/generator/SoapAttachmentsResponseEnricherTestCase.java create mode 100644 src/test/java/org/mule/service/soap/introspection/HttpBasicAuthResourceLocator.java create mode 100644 src/test/java/org/mule/service/soap/metadata/AbstractMetadataTestCase.java create mode 100644 src/test/java/org/mule/service/soap/metadata/AttachmentMetadataTestCase.java create mode 100644 src/test/java/org/mule/service/soap/metadata/BodyMetadataTestCase.java create mode 100644 src/test/java/org/mule/service/soap/metadata/HeadersMetadataTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/CustomDispatcherTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/OperationExecutionTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/SoapClientFactoryTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/SoapFaultTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/attachments/AttachmentsTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/attachments/MtomAttachmentsTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/wss/AbstractWebServiceSecurityTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/wss/WssDecryptTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/wss/WssEncryptTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/wss/WssSignTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/wss/WssTimestampTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/wss/WssUsernameTestCase.java create mode 100644 src/test/java/org/mule/service/soap/runtime/wss/WssVerifySignatureTestCase.java create mode 100644 src/test/java/org/mule/service/soap/server/BasicAuthHttpServer.java create mode 100644 src/test/java/org/mule/service/soap/server/HttpServer.java create mode 100644 src/test/java/org/mule/service/soap/service/Account.java create mode 100644 src/test/java/org/mule/service/soap/service/EchoException.java create mode 100644 src/test/java/org/mule/service/soap/service/EchoFault.java create mode 100644 src/test/java/org/mule/service/soap/service/EncryptPasswordCallback.java create mode 100644 src/test/java/org/mule/service/soap/service/Mtom11Service.java create mode 100644 src/test/java/org/mule/service/soap/service/Mtom12Service.java create mode 100644 src/test/java/org/mule/service/soap/service/ServerPasswordCallback.java create mode 100644 src/test/java/org/mule/service/soap/service/Soap11Service.java create mode 100644 src/test/java/org/mule/service/soap/service/Soap12Service.java create mode 100644 src/test/java/org/mule/service/soap/service/VerifyPasswordCallback.java create mode 100644 src/test/java/org/mule/service/soap/unit/DispatchingRequestFactoryTestCase.java create mode 100644 src/test/java/org/mule/service/soap/unit/SoapOutputPayloadTestCase.java create mode 100644 src/test/java/org/mule/service/soap/unit/SoapResponseGeneratorTestCase.java create mode 100644 src/test/java/org/mule/service/soap/unit/XmlTransformationUtilsTestCase.java create mode 100644 src/test/resources/attachment.txt create mode 100644 src/test/resources/large.json create mode 100644 src/test/resources/schemas/recursive-embedded-schema.xsd create mode 100644 src/test/resources/schemas/simple-service-types.xsd create mode 100644 src/test/resources/security/clientKeystore create mode 100644 src/test/resources/security/serverKeystore create mode 100644 src/test/resources/security/ssltest-cacerts.jks create mode 100644 src/test/resources/security/ssltest-keystore.jks create mode 100644 src/test/resources/security/trustStore create mode 100644 src/test/resources/security/trustStoreWithoutMuleServerCertificate create mode 100644 src/test/resources/wsdl/document.wsdl create mode 100644 src/test/resources/wsdl/human.wsdl create mode 100755 src/test/resources/wsdl/multipart-output/Multipart.wsdl create mode 100755 src/test/resources/wsdl/multipart-output/claim/ClaimTypes-v1.4.xsd create mode 100755 src/test/resources/wsdl/multipart-output/common/CommonTypes-v2.0.xsd create mode 100755 src/test/resources/wsdl/multipart-output/common/MetaTypes-v1.1.xsd create mode 100755 src/test/resources/wsdl/multipart-output/mbr/MbrTypes-v2.1.xsd create mode 100755 src/test/resources/wsdl/multipart-output/util/DMTypes-v2.1.xsd create mode 100755 src/test/resources/wsdl/multipart-output/util/harvest.sig create mode 100644 src/test/resources/wsdl/no-schema-location/0.xsd create mode 100644 src/test/resources/wsdl/no-schema-location/1.xsd create mode 100644 src/test/resources/wsdl/no-schema-location/2.xsd create mode 100644 src/test/resources/wsdl/no-schema-location/test.wsdl create mode 100644 src/test/resources/wsdl/no-style-defined.wsdl create mode 100644 src/test/resources/wsdl/recursive/dir1/dir2/import1.xsd create mode 100644 src/test/resources/wsdl/recursive/dir1/import0.xsd create mode 100644 src/test/resources/wsdl/recursive/import2.xsd create mode 100644 src/test/resources/wsdl/recursive/import3.xsd create mode 100644 src/test/resources/wsdl/recursive/import4.xsd create mode 100644 src/test/resources/wsdl/recursive/imported.wsdl create mode 100644 src/test/resources/wsdl/recursive/main.wsdl create mode 100644 src/test/resources/wsdl/rpc.wsdl create mode 100644 src/test/resources/wsdl/simple-service.wsdl create mode 100644 src/test/resources/wsdl/simple-soap12-service.wsdl create mode 100644 src/test/resources/wsdl/types-multiple-schema.wsdl diff --git a/pom.xml b/pom.xml index 78fe9e08..51a392ce 100644 --- a/pom.xml +++ b/pom.xml @@ -17,8 +17,39 @@ A SOAP service based on CXF + ALL-UNNAMED + + + -XX:+IgnoreUnrecognizedVMOptions + --add-exports=org.mule.service.soap/org.mule.service.soap=ALL-UNNAMED + --add-exports=org.mule.runtime.core/org.mule.runtime.core.internal.config.builders=ALL-UNNAMED + --add-exports=org.mule.runtime.core/org.mule.runtime.core.internal.context=ALL-UNNAMED + --add-exports=org.mule.runtime.core/org.mule.runtime.core.internal.registry=ALL-UNNAMED + --add-exports=org.mule.runtime.core/org.mule.runtime.core.internal.serialization=ALL-UNNAMED + --add-exports=org.mule.runtime.core/org.mule.runtime.core.privileged.registry=ALL-UNNAMED + --add-exports=org.mule.runtime.core/org.mule.runtime.core.internal.transformer=ALL-UNNAMED + --add-opens=org.mule.service.soap/org.mule.service.soap.service=java.xml.bind + --add-exports=org.mule.service.soap/org.mule.service.soap.service=org.apache.cxf.core + --add-exports=org.mule.service.soap/org.mule.service.soap.service=org.apache.wss4j.dom + --add-exports=org.mule.service.soap/org.mule.service.soap.service=ALL-UNNAMED + ${surefire.test.unit.open.args} + + org.mule.service.soap formatter.xml + + 4.8.3 + 1.8.3 + + 3.5.9 + 2.3.4 + 2.3.3 + 1.3.3 + 1.1 + 20080702 + 1.5.3 + 1.1.7 + 6.7.0 @@ -49,6 +80,432 @@ + + + + org.cryptacular + cryptacular + 1.2.6 + + + org.bouncycastle + bcprov-jdk18on + + + + + + org.mule.runtime + mule-extensions-soap-api + ${muleExtensionsApiVersion} + + + + jakarta.xml.ws + jakarta.xml.ws-api + ${jakarta.jaxws.version} + + + jakarta.transaction + jakarta.transaction-api + ${jakarta.transaction.version} + + + + + org.apache.cxf + cxf-core + ${cxfVersion} + + + org.apache.cxf + cxf-rt-transports-http-jetty + ${cxfVersion} + + + org.apache.cxf + cxf-rt-transports-http + ${cxfVersion} + + + org.apache.cxf + cxf-rt-frontend-simple + ${cxfVersion} + + + org.apache.cxf + cxf-rt-frontend-jaxws + ${cxfVersion} + + + org.apache.cxf + cxf-rt-ws-rm + ${cxfVersion} + + + org.apache.cxf + cxf-rt-ws-security + ${cxfVersion} + + + + net.java.dev.stax-utils + stax-utils + ${staxUtilsVersion} + + + com.bea.xml + jsr173-ri + + + + + + + + + + org.apache.cxf + cxf-core + + + + com.sun.xml.bind + jaxb-impl + + + org.apache.ant + ant + + + com.fasterxml.woodstox + woodstox-core + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + + + org.apache.cxf + cxf-rt-ws-rm + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + + wsdl4j + wsdl4j + + + + + org.apache.cxf + cxf-rt-ws-security + + + + commons-logging + commons-logging + + + + net.sf.ehcache + ehcache + + + org.slf4j + slf4j-api + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + org.apache.geronimo.javamail + geronimo-javamail_1.4_mail + + + + + org.apache.cxf + cxf-rt-frontend-simple + + + + com.sun.xml.bind + jaxb-impl + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + + wsdl4j + wsdl4j + + + + + com.fasterxml.woodstox + woodstox-core + ${woodstoxCoreVersion} + + + + jakarta.xml.ws + jakarta.xml.ws-api + + + jakarta.transaction + jakarta.transaction-api + + + com.sun.xml.messaging.saaj + saaj-impl + ${xml.messaging.saaj.version} + + + com.sun.activation + jakarta.activation + + + + org.cryptacular + cryptacular + + + + + org.mule.wsdl + mule-wsdl-parser + ${wsdlParserVersion} + + + org.slf4j + slf4j-api + + + org.mule.runtime + mule-metadata-model-xml + + + com.fasterxml.woodstox + woodstox-core + + + org.jetbrains.kotlin + kotlin-stdlib + + + + + org.jetbrains.kotlin + kotlin-stdlib + + + + + org.springframework + spring-context + + + org.springframework + spring-beans + + + + + org.apache.santuario + xmlsec + ${xmlSecVersion} + + + org.slf4j + slf4j-api + + + + + + + org.mule.runtime + mule-core + ${mule.version} + provided + + + org.mule.runtime + mule-module-tls + ${mule.version} + provided + + + org.mule.runtime + mule-service-http-api + ${mule.version} + provided + + + org.mule.runtime + mule-service-soap-api + ${mule.version} + provided + + + org.mule.services + mule-service-http + provided + + + org.mule.runtime + mule-extensions-soap-api + provided + + + + + com.google.guava + guava + + + com.google.code.findbugs + jsr305 + + + + + org.apache.commons + commons-lang3 + + + commons-io + commons-io + + + + + net.sf.saxon + Saxon-HE + + + + org.slf4j + slf4j-api + + + + + net.java.dev.stax-utils + stax-utils + + + org.dom4j + dom4j + + + + + xmlunit + xmlunit + test + + + javax.jws + javax.jws-api + ${javax.jws-api.version} + test + + + + + org.apache.cxf + cxf-rt-transports-http-jetty + test + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + + + org.apache.cxf + cxf-rt-frontend-jaxws + test + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + + + org.apache.cxf + cxf-rt-transports-http + test + + + org.apache.geronimo.specs + geronimo-jta_1.1_spec + + + + + org.eclipse.jetty + jetty-server + test + + + org.eclipse.jetty + jetty-servlet + test + + + org.eclipse.jetty + jetty-util + test + + + org.eclipse.jetty + jetty-security + test + + + org.eclipse.jetty + jetty-http + test + + + org.eclipse.jetty + jetty-io + test + + + + + org.mule.tests + mule-tests-unit + ${mule.version} + test + + + org.mule.tests + mule-tests-allure + ${mule.version} + test + + + org.mule.services + mule-service-weave + test + + + http://www.mulesoft.org/display/MULE/Download diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 00000000..0f5018ba --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +import org.mule.api.annotation.jpms.ServiceModule; + +/** + * A SOAP service based on CXF. + * + * @moduleGraph + * @since 1.5 + */ +@ServiceModule +module org.mule.service.soap { + + requires org.mule.runtime.metadata.model.api; + requires org.mule.runtime.api; + requires org.mule.runtime.extensions.api; + requires org.mule.runtime.extensions.soap.api; + requires org.mule.runtime.http.api; + requires org.mule.runtime.soap.api; + // lifecycle api + requires org.mule.runtime.core; + + requires org.apache.cxf.binding.soap; + requires org.apache.cxf.core; + requires org.apache.cxf.frontend.simple; + requires org.apache.cxf.ws.security; + requires org.apache.cxf.wsdl; + requires org.apache.wss4j.common; + requires org.apache.wss4j.dom; + + requires org.mule.wsdl.parser; + requires mule.wsdl4j; + + requires com.ctc.wstx; + requires org.dom4j; + requires stax.utils; + requires Saxon.HE; + + requires com.google.common; + requires org.apache.commons.io; + requires org.apache.commons.lang3; + + requires jakarta.activation; + requires java.logging; + requires java.xml.soap; + + // Allow invocation and injection into providers by the Mule Runtime + exports org.mule.service.soap.provider to + org.mule.runtime.service; + +} diff --git a/src/main/java/org/mule/service/soap/SoapServiceImplementation.java b/src/main/java/org/mule/service/soap/SoapServiceImplementation.java new file mode 100644 index 00000000..dc5e3b85 --- /dev/null +++ b/src/main/java/org/mule/service/soap/SoapServiceImplementation.java @@ -0,0 +1,29 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap; + +import org.mule.runtime.soap.api.SoapService; +import org.mule.runtime.soap.api.client.SoapClientFactory; +import org.mule.service.soap.client.SoapCxfClientFactory; + +/** + * Default Mule {@link SoapService} implementation. + * + * @since 1.0 + */ +public class SoapServiceImplementation implements SoapService { + + @Override + public String getName() { + return "SOAP Service"; + } + + @Override + public SoapClientFactory getClientFactory() { + return new SoapCxfClientFactory(); + } +} diff --git a/src/main/java/org/mule/service/soap/client/CxfAttachmentsFactory.java b/src/main/java/org/mule/service/soap/client/CxfAttachmentsFactory.java new file mode 100644 index 00000000..555af2f7 --- /dev/null +++ b/src/main/java/org/mule/service/soap/client/CxfAttachmentsFactory.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.client; + +import static java.lang.String.format; +import static java.util.Collections.emptyMap; +import static org.mule.runtime.http.api.HttpHeaders.Names.CONTENT_DISPOSITION; +import static org.mule.service.soap.util.AttachmentsUtils.toDataHandler; + +import com.google.common.collect.ImmutableMap; +import org.apache.cxf.attachment.AttachmentImpl; +import org.apache.cxf.message.Attachment; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.soap.api.exception.BadRequestException; + +import java.io.IOException; +import java.util.Map; + +/** + * A factory for CXF {@link Attachment}s. + *

+ * Creates the CXF {@link Attachment}s from {@link SoapAttachment} + * + * @since 1.2 + */ +class CxfAttachmentsFactory { + + private boolean isMtom; + + CxfAttachmentsFactory(boolean isMtom) { + this.isMtom = isMtom; + } + + public Map transformToCxfAttachments(Map attachments) { + if (!isMtom) { + return emptyMap(); + } + ImmutableMap.Builder builder = ImmutableMap.builder(); + attachments.forEach((name, value) -> { + try { + AttachmentImpl attachment = new AttachmentImpl(name, toDataHandler(name, value.getContent(), value.getContentType())); + attachment.setHeader(CONTENT_DISPOSITION, "attachment; name=\"" + name + "\""); + builder.put(name, attachment); + } catch (IOException e) { + throw new BadRequestException(format("Error while preparing attachment [%s] for upload", name), e); + } + }); + return builder.build(); + } + +} diff --git a/src/main/java/org/mule/service/soap/client/CxfClientFactory.java b/src/main/java/org/mule/service/soap/client/CxfClientFactory.java new file mode 100644 index 00000000..b30f5efb --- /dev/null +++ b/src/main/java/org/mule/service/soap/client/CxfClientFactory.java @@ -0,0 +1,107 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.client; + +import static org.mule.runtime.core.api.util.ClassUtils.withContextClassLoader; + +import org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean; +import org.mule.service.soap.conduit.SoapServiceConduitInitiator; + +import org.apache.cxf.Bus; +import org.apache.cxf.binding.soap.SoapVersion; +import org.apache.cxf.binding.soap.SoapVersionFactory; +import org.apache.cxf.bus.spring.SpringBusFactory; +import org.apache.cxf.databinding.stax.StaxDataBinding; +import org.apache.cxf.databinding.stax.StaxDataBindingFeature; +import org.apache.cxf.endpoint.Client; +import org.apache.cxf.frontend.ClientFactoryBean; +import org.apache.cxf.transport.Conduit; +import org.apache.cxf.transport.ConduitInitiatorManager; + +import java.lang.reflect.Method; +import java.util.Iterator; + +import javax.xml.transform.Source; + +/** + * A factory for CXF {@link Client}s. + *

+ * Sets up the custom {@link SoapServiceConduitInitiator} for all the different entries used for CXF to obtain the needed + * {@link Conduit}, this occurs because we want that CXF always use our custom conduit to operate. + * + * @since 1.0 + */ +class CxfClientFactory { + + private final Bus bus; + + CxfClientFactory() { + this.bus = withContextClassLoader(CxfClientFactory.class.getClassLoader(), + () -> new SpringBusFactory().createBus((String) null, true)); + registerConduitInitiator(new SoapServiceConduitInitiator()); + } + + private void registerConduitInitiator(SoapServiceConduitInitiator initiator) { + ConduitInitiatorManager extension = bus.getExtension(ConduitInitiatorManager.class); + extension.registerConduitInitiator("http://cxf.apache.org/transports/http", initiator); + extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/soap/", initiator); + extension.registerConduitInitiator("http://schemas.xmlsoap.org/soap/http/", initiator); + extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/soap/http", initiator); + extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/http/", initiator); + extension.registerConduitInitiator("http://www.w3.org/2003/05/soap/bindings/HTTP/", initiator); + extension.registerConduitInitiator("http://cxf.apache.org/transports/http/configuration", initiator); + extension.registerConduitInitiator("http://cxf.apache.org/bindings/xformat", initiator); + extension.registerConduitInitiator("http://cxf.apache.org/transports/jms", initiator); + extension.registerConduitInitiator("http://mule.codehaus.org/ws", initiator); + } + + public Client createClient(String address, String soapVersion) { + return withContextClassLoader(CxfClientFactory.class.getClassLoader(), () -> { + ReflectionServiceFactoryBean serviceFactoryBean = new ReflectionServiceFactoryBean(); + serviceFactoryBean.getServiceConfigurations().add(0, new DefaultServiceConfiguration()); + ClientFactoryBean factory = new ClientFactoryBean(serviceFactoryBean); + factory.setServiceClass(ProxyService.class); + factory.setDataBinding(new StaxDataBinding()); + factory.getFeatures().add(new StaxDataBindingFeature()); + factory.setAddress(address); + factory.setBus(bus); + factory.setBindingId(getBindingIdForSoapVersion(soapVersion)); + return factory.create(); + }); + + } + + private String getBindingIdForSoapVersion(String version) { + Iterator soapVersions = SoapVersionFactory.getInstance().getVersions(); + while (soapVersions.hasNext()) { + SoapVersion soapVersion = soapVersions.next(); + if (Double.toString(soapVersion.getVersion()).equals(version)) { + return soapVersion.getBindingId(); + } + } + throw new IllegalArgumentException("Invalid Soap version " + version); + } + + /** + * Interface that describes the implementing the service. + */ + private interface ProxyService { + + Source invoke(Source source); + + void invokeOneWay(Source source); + + } + + public class DefaultServiceConfiguration extends org.apache.cxf.wsdl.service.factory.DefaultServiceConfiguration { + + public Boolean hasOutMessage(Method m) { + return !m.getName().equals("invokeOneWay"); + } + + } +} diff --git a/src/main/java/org/mule/service/soap/client/CxfClientProvider.java b/src/main/java/org/mule/service/soap/client/CxfClientProvider.java new file mode 100644 index 00000000..ef2f6f0b --- /dev/null +++ b/src/main/java/org/mule/service/soap/client/CxfClientProvider.java @@ -0,0 +1,201 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.client; + +import static java.util.Collections.emptyMap; +import static org.apache.commons.lang3.StringUtils.isNotBlank; +import static org.apache.cxf.message.Message.MTOM_ENABLED; +import static org.apache.wss4j.common.ConfigurationConstants.ACTION; +import static org.apache.wss4j.common.ConfigurationConstants.PW_CALLBACK_REF; + +import org.mule.runtime.extension.api.soap.security.DecryptSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.EncryptSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.SecurityStrategy; +import org.mule.runtime.extension.api.soap.security.SecurityStrategyVisitor; +import org.mule.runtime.extension.api.soap.security.SignSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.TimestampSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.UsernameTokenSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.VerifySignatureSecurityStrategy; +import org.mule.runtime.soap.api.SoapVersion; +import org.mule.runtime.soap.api.client.SoapClientConfiguration; +import org.mule.service.soap.interceptor.NamespaceRestorerStaxInterceptor; +import org.mule.service.soap.interceptor.NamespaceSaverStaxInterceptor; +import org.mule.service.soap.interceptor.OutputMtomSoapAttachmentsInterceptor; +import org.mule.service.soap.interceptor.OutputSoapHeadersInterceptor; +import org.mule.service.soap.interceptor.SoapActionInterceptor; +import org.mule.service.soap.interceptor.StreamClosingInterceptor; +import org.mule.service.soap.security.SecurityStrategyCxfAdapter; +import org.mule.service.soap.security.SecurityStrategyType; +import org.mule.service.soap.security.WssDecryptSecurityStrategyCxfAdapter; +import org.mule.service.soap.security.WssEncryptSecurityStrategyCxfAdapter; +import org.mule.service.soap.security.WssSignSecurityStrategyCxfAdapter; +import org.mule.service.soap.security.WssTimestampSecurityStrategyCxfAdapter; +import org.mule.service.soap.security.WssUsernameTokenSecurityStrategyCxfAdapter; +import org.mule.service.soap.security.WssVerifySignatureSecurityStrategyCxfAdapter; +import org.mule.service.soap.security.callback.CompositeCallbackHandler; + +import com.google.common.collect.ImmutableList; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; + +import javax.security.auth.callback.CallbackHandler; + +import org.apache.cxf.binding.Binding; +import org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor; +import org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor; +import org.apache.cxf.binding.soap.interceptor.Soap12FaultInInterceptor; +import org.apache.cxf.endpoint.Client; +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.PhaseInterceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; +import org.apache.cxf.wsdl.interceptors.WrappedOutInterceptor; + +/** + * Object that creates CXF specific clients based on a {@link SoapClientConfiguration} setting all the required CXF properties. + *

+ * the created client aims to be the CXF client used in the {@link SoapCxfClient}. + * + * @since 1.0 + */ +class CxfClientProvider { + + private final CxfClientFactory factory = new CxfClientFactory(); + + Client getClient(SoapClientConfiguration configuration) { + boolean isMtom = configuration.isMtomEnabled(); + String address = configuration.getAddress(); + SoapVersion version = configuration.getVersion(); + Client client = factory.createClient(address, version.getVersion()); + addSecurityInterceptors(client, getAdaptedSecurities(configuration.getSecurities())); + addRequestInterceptors(client); + addResponseInterceptors(client, isMtom); + client.getEndpoint().put(MTOM_ENABLED, isMtom); + removeUnnecessaryCxfInterceptors(client); + return client; + } + + private List getAdaptedSecurities(List securities) { + ImmutableList.Builder builder = ImmutableList.builder(); + securities.forEach(s -> s.accept(new SecurityStrategyVisitor() { + + @Override + public void visitEncrypt(EncryptSecurityStrategy encrypt) { + builder.add(new WssEncryptSecurityStrategyCxfAdapter(encrypt.getKeyStoreConfiguration())); + } + + @Override + public void visitDecrypt(DecryptSecurityStrategy decrypt) { + builder.add(new WssDecryptSecurityStrategyCxfAdapter(decrypt.getKeyStoreConfiguration())); + } + + @Override + public void visitUsernameToken(UsernameTokenSecurityStrategy usernameToken) { + builder.add(new WssUsernameTokenSecurityStrategyCxfAdapter(usernameToken)); + } + + @Override + public void visitSign(SignSecurityStrategy sign) { + builder.add(new WssSignSecurityStrategyCxfAdapter(sign.getKeyStoreConfiguration())); + } + + @Override + public void visitVerify(VerifySignatureSecurityStrategy verify) { + WssVerifySignatureSecurityStrategyCxfAdapter adapter = + verify.getTrustStoreConfiguration().map(WssVerifySignatureSecurityStrategyCxfAdapter::new) + .orElse(new WssVerifySignatureSecurityStrategyCxfAdapter()); + builder.add(adapter); + } + + @Override + public void visitTimestamp(TimestampSecurityStrategy timestamp) { + builder.add(new WssTimestampSecurityStrategyCxfAdapter(timestamp.getTimeToLeaveInSeconds())); + } + })); + + return builder.build(); + } + + private void addSecurityInterceptors(Client client, List securityStrategies) { + Map requestProps = buildSecurityProperties(securityStrategies, SecurityStrategyType.OUTGOING); + if (!requestProps.isEmpty()) { + client.getOutInterceptors().add(new WSS4JOutInterceptor(requestProps)); + } + + Map responseProps = buildSecurityProperties(securityStrategies, SecurityStrategyType.INCOMING); + if (!responseProps.isEmpty()) { + client.getInInterceptors().add(new WSS4JInInterceptor(responseProps)); + } + } + + private Map buildSecurityProperties(List strategies, + SecurityStrategyType type) { + if (strategies.isEmpty()) { + return emptyMap(); + } + + Map props = new HashMap<>(); + StringJoiner actionsJoiner = new StringJoiner(" "); + + ImmutableList.Builder callbackHandlersBuilder = ImmutableList.builder(); + strategies.stream() + .filter(securityStrategy -> securityStrategy.securityType().equals(type)) + .forEach(securityStrategy -> { + props.putAll(securityStrategy.buildSecurityProperties()); + actionsJoiner.add(securityStrategy.securityAction()); + securityStrategy.buildPasswordCallbackHandler().ifPresent(callbackHandlersBuilder::add); + }); + + List handlers = callbackHandlersBuilder.build(); + if (!handlers.isEmpty()) { + props.put(PW_CALLBACK_REF, new CompositeCallbackHandler(handlers)); + } + + String actions = actionsJoiner.toString(); + if (isNotBlank(actions)) { + // the list of actions is passed as a String with the action names separated by a black space. + props.put(ACTION, actions); + } + + // This Map needs to be mutable, cxf will add properties if needed. + return props; + } + + private void addRequestInterceptors(Client client) { + List> outInterceptors = client.getOutInterceptors(); + outInterceptors.add(new SoapActionInterceptor()); + } + + private void addResponseInterceptors(Client client, boolean mtomEnabled) { + List> inInterceptors = client.getInInterceptors(); + inInterceptors.add(new NamespaceRestorerStaxInterceptor()); + inInterceptors.add(new NamespaceSaverStaxInterceptor()); + inInterceptors.add(new StreamClosingInterceptor()); + inInterceptors.add(new CheckFaultInterceptor()); + inInterceptors.add(new OutputSoapHeadersInterceptor()); + inInterceptors.add(new SoapActionInterceptor()); + if (mtomEnabled) { + inInterceptors.add(new OutputMtomSoapAttachmentsInterceptor()); + } + } + + private void removeUnnecessaryCxfInterceptors(Client client) { + Binding binding = client.getEndpoint().getBinding(); + removeInterceptor(binding.getOutInterceptors(), WrappedOutInterceptor.class.getName()); + removeInterceptor(binding.getInInterceptors(), Soap11FaultInInterceptor.class.getName()); + removeInterceptor(binding.getInInterceptors(), Soap12FaultInInterceptor.class.getName()); + removeInterceptor(binding.getInInterceptors(), CheckFaultInterceptor.class.getName()); + } + + private void removeInterceptor(List> inInterceptors, String name) { + inInterceptors.removeIf(i -> i instanceof PhaseInterceptor && ((PhaseInterceptor) i).getId().equals(name)); + } +} diff --git a/src/main/java/org/mule/service/soap/client/SoapCxfClient.java b/src/main/java/org/mule/service/soap/client/SoapCxfClient.java new file mode 100644 index 00000000..cf137f25 --- /dev/null +++ b/src/main/java/org/mule/service/soap/client/SoapCxfClient.java @@ -0,0 +1,268 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.client; + +import static java.lang.String.format; +import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; +import static java.util.Objects.requireNonNull; +import static java.util.Optional.empty; +import static java.util.Optional.ofNullable; +import static java.util.stream.Collectors.toList; +import static org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString; +import static org.apache.cxf.message.Message.ENCODING; +import static org.mule.runtime.core.api.lifecycle.LifecycleUtils.disposeIfNeeded; +import static org.mule.runtime.core.api.lifecycle.LifecycleUtils.initialiseIfNeeded; +import static org.mule.runtime.core.api.lifecycle.LifecycleUtils.startIfNeeded; +import static org.mule.runtime.core.api.lifecycle.LifecycleUtils.stopIfNeeded; +import static org.mule.service.soap.util.XmlTransformationUtils.stringToDomElement; + +import org.mule.metadata.api.TypeLoader; +import org.mule.runtime.api.exception.MuleException; +import org.mule.runtime.extension.api.soap.message.MessageDispatcher; +import org.mule.runtime.soap.api.SoapVersion; +import org.mule.runtime.soap.api.client.SoapClient; +import org.mule.runtime.soap.api.client.metadata.SoapMetadataResolver; +import org.mule.runtime.soap.api.exception.BadRequestException; +import org.mule.runtime.soap.api.exception.DispatchingException; +import org.mule.runtime.soap.api.exception.SoapFaultException; +import org.mule.runtime.soap.api.exception.SoapServiceException; +import org.mule.runtime.soap.api.message.SoapRequest; +import org.mule.runtime.soap.api.message.SoapResponse; +import org.mule.service.soap.generator.SoapRequestGenerator; +import org.mule.service.soap.generator.SoapResponseGenerator; +import org.mule.service.soap.generator.attachment.AttachmentRequestEnricher; +import org.mule.service.soap.generator.attachment.AttachmentResponseEnricher; +import org.mule.service.soap.generator.attachment.MtomRequestEnricher; +import org.mule.service.soap.generator.attachment.MtomResponseEnricher; +import org.mule.service.soap.generator.attachment.SoapAttachmentRequestEnricher; +import org.mule.service.soap.generator.attachment.SoapAttachmentResponseEnricher; +import org.mule.service.soap.metadata.DefaultSoapMetadataResolver; +import org.mule.service.soap.util.XmlTransformationException; +import org.mule.service.soap.util.XmlTransformationUtils; +import org.mule.wsdl.parser.exception.OperationNotFoundException; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.WsdlModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamReader; + +import org.apache.commons.io.IOUtils; +import org.apache.cxf.binding.soap.SoapFault; +import org.apache.cxf.binding.soap.SoapHeader; +import org.apache.cxf.endpoint.Client; +import org.apache.cxf.endpoint.Endpoint; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.ExchangeImpl; +import org.apache.cxf.service.model.BindingOperationInfo; +import org.mule.wsdl.parser.model.operation.OperationType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.w3c.dom.Element; + +/** + * a {@link SoapClient} implementation based on CXF. + * + * @since 1.0 + */ +public class SoapCxfClient implements SoapClient { + + private static final Logger LOGGER = LoggerFactory.getLogger(SoapCxfClient.class); + + public static final String MESSAGE_DISPATCHER = "mule.soap.dispatcher"; + public static final String MULE_ATTACHMENTS_KEY = "mule.soap.attachments"; + public static final String MULE_WSC_ADDRESS = "mule.soap.address"; + public static final String MULE_HEADERS_KEY = "mule.soap.headers"; + public static final String MULE_TRANSPORT_HEADERS_KEY = "mule.soap.transport.headers"; + public static final String MULE_SOAP_ACTION = "mule.soap.action"; + public static final String MULE_SOAP_OPERATION_STYLE = "mule.soap.operation.type"; + + private final SoapRequestGenerator requestGenerator; + private final SoapResponseGenerator responseGenerator; + + private final Client client; + private final WsdlModel wsdlModel; + private final PortModel port; + private final TypeLoader loader; + private final String address; + private final MessageDispatcher defaultDispatcher; + private final SoapVersion version; + private final String encoding; + private final boolean isMtom; + private final CxfAttachmentsFactory attachmentsFactory; + + SoapCxfClient(Client client, + WsdlModel wsdlModel, + PortModel portModel, + String address, + MessageDispatcher dispatcher, + SoapVersion version, + String encoding, + boolean isMtom) { + this.client = client; + this.wsdlModel = wsdlModel; + this.port = portModel; + this.loader = wsdlModel.getLoader().getValue(); + this.address = address; + this.defaultDispatcher = dispatcher; + this.version = version; + this.isMtom = isMtom; + this.encoding = encoding; + // TODO: MULE-10889 -> instead of creating this enrichers, interceptors that works with the live stream would be ideal + this.requestGenerator = new SoapRequestGenerator(getRequestEnricher(isMtom), portModel, loader); + this.responseGenerator = new SoapResponseGenerator(getResponseEnricher(isMtom)); + this.attachmentsFactory = new CxfAttachmentsFactory(this.isMtom); + } + + @Override + public SoapResponse consume(SoapRequest request) { + return consume(request, defaultDispatcher); + } + + @Override + public SoapResponse consume(SoapRequest request, MessageDispatcher dispatcher) { + requireNonNull(dispatcher, "Message Dispatcher cannot be null"); + String operation = request.getOperation(); + Exchange exchange = new ExchangeImpl(); + Object[] response = invoke(request, exchange, dispatcher); + return responseGenerator.generate(operation, response, exchange); + } + + @Override + public void stop() throws MuleException { + disposeIfNeeded(defaultDispatcher, LOGGER); + stopIfNeeded(defaultDispatcher); + client.destroy(); + } + + @Override + public void start() throws MuleException { + initialiseIfNeeded(defaultDispatcher); + startIfNeeded(defaultDispatcher); + } + + @Override + public SoapMetadataResolver getMetadataResolver() { + return new DefaultSoapMetadataResolver(wsdlModel, port, loader); + } + + private Object[] invoke(SoapRequest request, Exchange exchange, MessageDispatcher dispatcher) { + String operation = request.getOperation(); + XMLStreamReader xmlBody = getXmlBody(request); + try { + Map ctx = getInvocationContext(request, dispatcher); + return client.invoke(getInvocationOperation(operation), new Object[] {xmlBody}, ctx, exchange); + } catch (SoapFault sf) { + throw new SoapFaultException(sf.getFaultCode(), sf.getSubCode(), parseExceptionDetail(sf.getDetail()).orElse(null), + sf.getReason(), sf.getNode(), sf.getRole(), sf); + } catch (Fault f) { + if (f.getMessage().contains("COULD_NOT_READ_XML")) { + throw new BadRequestException("Error consuming the operation [" + operation + "], the request body is not a valid XML"); + } + throw new SoapFaultException(f.getFaultCode(), parseExceptionDetail(f.getDetail()).orElse(null), f); + } catch (DispatchingException e) { + throw e; + } catch (OperationNotFoundException e) { + String location = wsdlModel.getLocation(); + throw new BadRequestException("The provided operation [" + operation + "] does not exist in the WSDL file [" + location + + "]", e); + } catch (Exception e) { + throw new SoapServiceException("Unexpected error while consuming the web service operation [" + operation + "]", e); + } + } + + private XMLStreamReader getXmlBody(SoapRequest request) { + try { + String xml = request.getContent() != null ? IOUtils.toString(request.getContent()) : null; + return requestGenerator.generate(request.getOperation(), xml, request.getAttachments()); + } catch (IOException e) { + throw new BadRequestException("an error occurred while parsing the provided request"); + } + } + + private BindingOperationInfo getInvocationOperation(String operationName) throws Exception { + // Normally its not this hard to invoke the CXF Client, but we're + // sending along some exchange properties, so we need to use a more advanced + // method + Endpoint ep = client.getEndpoint(); + // The operation is always named invoke because hits our ProxyService implementation. + String method = port.getOperation(operationName).getType().equals(OperationType.ONE_WAY) ? "invokeOneWay" : "invoke"; + QName q = new QName(ep.getService().getName().getNamespaceURI(), method); + BindingOperationInfo bop = ep.getBinding().getBindingInfo().getOperation(q); + if (bop.isUnwrappedCapable()) { + bop = bop.getUnwrappedOperation(); + } + return bop; + } + + private Map getInvocationContext(SoapRequest request, + MessageDispatcher dispatcher) { + Map props = new HashMap<>(); + OperationModel operation = port.getOperation(request.getOperation()); + + // is NOT mtom the attachments must not be touched by cxf, we create a custom request embedding the attachment in the xml + props.put(MULE_ATTACHMENTS_KEY, this.attachmentsFactory.transformToCxfAttachments(request.getAttachments())); + props.put(MULE_WSC_ADDRESS, address); + props.put(ENCODING, encoding == null ? "UTF-8" : encoding); + props.put(MULE_HEADERS_KEY, transformToCxfHeaders(request.getSoapHeaders())); + props.put(MULE_TRANSPORT_HEADERS_KEY, request.getTransportHeaders()); + props.put(MESSAGE_DISPATCHER, dispatcher); + props.put(MULE_SOAP_OPERATION_STYLE, port.getOperation(request.getOperation()).getType()); + operation.getSoapAction().ifPresent(action -> props.put(MULE_SOAP_ACTION, action)); + Map ctx = new HashMap<>(); + ctx.put(Client.REQUEST_CONTEXT, props); + return ctx; + } + + private List transformToCxfHeaders(Map headers) { + if (headers == null) { + return emptyList(); + } + return headers.entrySet().stream() + .map(header -> { + try { + return new SoapHeader(new QName(null, header.getKey()), stringToDomElement(header.getValue())); + } catch (Exception e) { + throw new BadRequestException("Cannot parse input header [" + header.getKey() + "]", e); + } + }) + .collect(toList()); + } + + private AttachmentRequestEnricher getRequestEnricher(boolean isMtom) { + return isMtom ? new MtomRequestEnricher(loader) : new SoapAttachmentRequestEnricher(loader); + } + + private AttachmentResponseEnricher getResponseEnricher(boolean isMtom) { + return isMtom ? new MtomResponseEnricher(loader, port.getOperationsMap()) + : new SoapAttachmentResponseEnricher(loader, port.getOperationsMap()); + } + + private Optional parseExceptionDetail(Element detail) { + try { + return ofNullable(XmlTransformationUtils.nodeToString(detail)); + } catch (XmlTransformationException e) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("Error while parsing Soap Exception detail: " + detail.toString(), e); + } + return empty(); + } + } + + @Override + public String toString() { + return reflectionToString(this); + } +} diff --git a/src/main/java/org/mule/service/soap/client/SoapCxfClientFactory.java b/src/main/java/org/mule/service/soap/client/SoapCxfClientFactory.java new file mode 100644 index 00000000..b35c7430 --- /dev/null +++ b/src/main/java/org/mule/service/soap/client/SoapCxfClientFactory.java @@ -0,0 +1,115 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.client; + +import static org.mule.service.soap.conduit.SoapServiceConduitInitiator.SOAP_SERVICE_KNOWN_PROTOCOLS; +import static org.mule.wsdl.parser.model.WsdlStyle.RPC; + +import static java.lang.String.format; +import static java.util.Arrays.stream; +import static java.util.stream.Collectors.joining; + +import org.mule.runtime.api.connection.ConnectionException; +import org.mule.runtime.soap.api.client.SoapClient; +import org.mule.runtime.soap.api.client.SoapClientConfiguration; +import org.mule.runtime.soap.api.client.SoapClientFactory; +import org.mule.runtime.soap.api.transport.TransportResourceLocator; +import org.mule.wsdl.parser.WsdlParser; +import org.mule.wsdl.parser.locator.ResourceLocator; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.ServiceModel; +import org.mule.wsdl.parser.model.WsdlModel; + +import java.io.InputStream; +import java.net.URL; + +import org.apache.cxf.endpoint.Client; + +/** + * {@link SoapClientFactory} implementation that creates {@link SoapCxfClient} instances. + * + * @since 1.0 + */ +public class SoapCxfClientFactory implements SoapClientFactory { + + private final CxfClientProvider cxfClientProvider = new CxfClientProvider(); + + /** + * Creates a new instance of a {@link SoapCxfClient} for the given address ans soap version. + * + * @throws ConnectionException if the client couldn't be created. + */ + @Override + public SoapClient create(SoapClientConfiguration config) throws ConnectionException { + WsdlModel wsdlDefinition = getWsdlDefinition(config); + Client client = cxfClientProvider.getClient(config); + ServiceModel service = wsdlDefinition.getService(config.getService()); + if (service == null) { + throw new ConnectionException("Service [" + config.getService() + "] is not defined in the wsdl"); + } + PortModel port = service.getPort(config.getPort()); + if (port == null) { + throw new ConnectionException("Port [" + config.getPort() + "] not found in service [" + service.getName() + "]"); + } + return new SoapCxfClient(client, + wsdlDefinition, + port, + getAddress(config, port.getAddress()), + config.getDispatcher(), + config.getVersion(), + config.getEncoding(), + config.isMtomEnabled()); + } + + private String getAddress(SoapClientConfiguration config, URL serviceAddress) throws ConnectionException { + + if (config.getAddress() == null && serviceAddress == null) { + throw new ConnectionException("No address was specified and no one was found for the given configuration"); + } + + String address = config.getAddress() != null ? config.getAddress() : serviceAddress.toString(); + String protocolSeparator = "://"; + if (address.contains(protocolSeparator)) { + String protocol = address.substring(0, address.indexOf(protocolSeparator)); + if (stream(SOAP_SERVICE_KNOWN_PROTOCOLS).noneMatch(p -> p.startsWith(protocol))) { + throw new IllegalArgumentException(format("cannot create a dispatcher for address [%s], known protocols are [%s]", + address, stream(SOAP_SERVICE_KNOWN_PROTOCOLS).collect(joining(", ")))); + } + } + return address; + } + + private WsdlModel getWsdlDefinition(SoapClientConfiguration config) throws ConnectionException { + String location = config.getWsdlLocation(); + WsdlModel wsdlModel = WsdlParser.Companion.parse(location, + new ResourceLocatorAdapter(config.getLocator()), + config.getEncoding()); + if (RPC.equals(wsdlModel.getStyle())) { + throw new ConnectionException(format("The provided WSDL [%s] is RPC style, RPC WSDLs are not supported", location)); + } + return wsdlModel; + } + + private class ResourceLocatorAdapter implements ResourceLocator { + + private final TransportResourceLocator locator; + + public ResourceLocatorAdapter(TransportResourceLocator locator) { + this.locator = locator; + } + + @Override + public boolean handles(String s) { + return locator.handles(s); + } + + @Override + public InputStream getResource(String s) { + return locator.getResource(s); + } + } +} diff --git a/src/main/java/org/mule/service/soap/conduit/SoapServiceConduit.java b/src/main/java/org/mule/service/soap/conduit/SoapServiceConduit.java new file mode 100644 index 00000000..013217e6 --- /dev/null +++ b/src/main/java/org/mule/service/soap/conduit/SoapServiceConduit.java @@ -0,0 +1,78 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.conduit; + +import static org.mule.service.soap.client.SoapCxfClient.MULE_ATTACHMENTS_KEY; +import static org.mule.service.soap.client.SoapCxfClient.MULE_HEADERS_KEY; + +import org.mule.service.soap.interceptor.MessageDispatcherInterceptor; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import org.apache.cxf.binding.soap.SoapHeader; +import org.apache.cxf.binding.soap.SoapMessage; +import org.apache.cxf.message.Attachment; +import org.apache.cxf.message.Message; +import org.apache.cxf.transport.AbstractConduit; +import org.apache.cxf.ws.addressing.EndpointReferenceType; + +/** + * + * @since 1.0 + */ +final class SoapServiceConduit extends AbstractConduit { + + private static final Logger LOGGER = Logger.getLogger(SoapServiceConduit.class.getSimpleName()); + + SoapServiceConduit(EndpointReferenceType t) { + super(t); + } + + @Override + protected Logger getLogger() { + return LOGGER; + } + + @Override + @SuppressWarnings("unchecked") + public void prepare(Message message) throws IOException { + // Set a new OutputStream where the message is going to be handled. + message.setContent(OutputStream.class, new ByteArrayOutputStream()); + addHeaders(message); + addAttachments(message); + addMessageDispatcher(message); + } + + private void addMessageDispatcher(Message message) { + message.getInterceptorChain().add(new MessageDispatcherInterceptor(getMessageObserver())); + } + + private void addAttachments(Message message) { + Map soapAttachments = (Map) message.getExchange().get(MULE_ATTACHMENTS_KEY); + message.setAttachments(soapAttachments.values()); + } + + private void addHeaders(Message message) { + List soapHeaders = (List) message.getExchange().get(MULE_HEADERS_KEY); + soapHeaders.forEach(header -> { + ((SoapMessage) message).getHeaders().add(header); + }); + } + + @Override + public void close(Message msg) throws IOException { + OutputStream os = msg.getContent(OutputStream.class); + if (os != null) { + os.close(); + } + } +} diff --git a/src/main/java/org/mule/service/soap/conduit/SoapServiceConduitInitiator.java b/src/main/java/org/mule/service/soap/conduit/SoapServiceConduitInitiator.java new file mode 100644 index 00000000..429029b1 --- /dev/null +++ b/src/main/java/org/mule/service/soap/conduit/SoapServiceConduitInitiator.java @@ -0,0 +1,67 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.conduit; + +import static java.util.Arrays.asList; +import static java.util.stream.Collectors.toList; +import static org.apache.cxf.ws.addressing.EndpointReferenceUtils.setServiceAndPortName; + +import org.apache.cxf.Bus; +import org.apache.cxf.service.model.EndpointInfo; +import org.apache.cxf.transport.Conduit; +import org.apache.cxf.transport.ConduitInitiator; +import org.apache.cxf.ws.addressing.AttributedURIType; +import org.apache.cxf.ws.addressing.EndpointReferenceType; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Stream; + +/** + * A {@link ConduitInitiator} implementation that creates {@link SoapServiceConduit} instances. + * + * @since 1.0 + */ +public class SoapServiceConduitInitiator implements ConduitInitiator { + + public static final String[] SOAP_SERVICE_KNOWN_PROTOCOLS = new String[] {"http://", "https://", "jms://"}; + + @Override + public Conduit getConduit(EndpointInfo targetInfo, Bus bus) throws IOException { + return getConduit(targetInfo, null, bus); + } + + @Override + public Conduit getConduit(EndpointInfo localInfo, EndpointReferenceType target, Bus bus) throws IOException { + return new SoapServiceConduit(getTargetReference(localInfo, target)); + } + + @Override + public Set getUriPrefixes() { + return new HashSet<>(asList(SOAP_SERVICE_KNOWN_PROTOCOLS)); + } + + @Override + public List getTransportIds() { + return Stream.of("http://schemas.xmlsoap.org/soap/http").collect(toList()); + } + + private EndpointReferenceType getTargetReference(EndpointInfo endpointInfo, EndpointReferenceType referenceType) { + if (referenceType != null) { + return referenceType; + } + EndpointReferenceType ref = new EndpointReferenceType(); + AttributedURIType address = new AttributedURIType(); + address.setValue(endpointInfo.getAddress()); + ref.setAddress(address); + if (endpointInfo.getService() != null) { + setServiceAndPortName(ref, endpointInfo.getService().getName(), endpointInfo.getName().getLocalPart()); + } + return ref; + } +} diff --git a/src/main/java/org/mule/service/soap/ds/ByteArrayDataSource.java b/src/main/java/org/mule/service/soap/ds/ByteArrayDataSource.java new file mode 100644 index 00000000..b50ddfab --- /dev/null +++ b/src/main/java/org/mule/service/soap/ds/ByteArrayDataSource.java @@ -0,0 +1,50 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.ds; + + +import org.mule.runtime.api.metadata.MediaType; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.activation.DataSource; + +public final class ByteArrayDataSource implements DataSource { + + private final byte[] data; + private final MediaType contentType; + private final String name; + + public ByteArrayDataSource(byte[] data, MediaType contentType, String name) { + this.data = data; + this.contentType = contentType; + this.name = name; + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(data); + } + + @Override + public OutputStream getOutputStream() throws IOException { + throw new IOException("Cannot write into a ByteArrayDataSource"); + } + + @Override + public String getContentType() { + return contentType.toString(); + } + + @Override + public String getName() { + return name; + } +} diff --git a/src/main/java/org/mule/service/soap/ds/InputStreamDataSource.java b/src/main/java/org/mule/service/soap/ds/InputStreamDataSource.java new file mode 100644 index 00000000..02d3cb02 --- /dev/null +++ b/src/main/java/org/mule/service/soap/ds/InputStreamDataSource.java @@ -0,0 +1,52 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.ds; + +import org.mule.runtime.api.metadata.MediaType; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.activation.DataSource; + +/** + * {@link DataSource} wapper for an {@link InputStream}. + */ +public final class InputStreamDataSource implements DataSource { + + private final InputStream data; + private final MediaType contentType; + private final String name; + + public InputStreamDataSource(InputStream data, MediaType contentType, String name) { + this.data = data; + this.contentType = contentType; + this.name = name; + } + + @Override + public String getContentType() { + return contentType.toString(); + } + + @Override + public InputStream getInputStream() throws IOException { + return data; + } + + @Override + public String getName() { + return name; + } + + @Override + public OutputStream getOutputStream() throws IOException { + throw new IOException("Cannot write into an InputStreamDataSource"); + } + +} diff --git a/src/main/java/org/mule/service/soap/ds/StringDataSource.java b/src/main/java/org/mule/service/soap/ds/StringDataSource.java new file mode 100644 index 00000000..e854c616 --- /dev/null +++ b/src/main/java/org/mule/service/soap/ds/StringDataSource.java @@ -0,0 +1,61 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.ds; + +import org.mule.runtime.api.metadata.MediaType; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import javax.activation.DataSource; + +public final class StringDataSource implements DataSource { + + protected String content; + protected MediaType contentType = MediaType.TEXT; + protected String name = "StringDataSource"; + + public StringDataSource(String payload) { + super(); + content = payload; + } + + public StringDataSource(String payload, String name) { + super(); + content = payload; + this.name = name; + } + + public StringDataSource(String content, String name, MediaType contentType) { + this.content = content; + this.contentType = contentType; + this.name = name; + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(content.getBytes()); + } + + @Override + public OutputStream getOutputStream() { + throw new UnsupportedOperationException("Read-only javax.activation.DataSource"); + } + + @Override + public String getContentType() { + return contentType.toString(); + } + + @Override + public String getName() { + return name; + } +} + diff --git a/src/main/java/org/mule/service/soap/generator/EmptyRequestGenerator.java b/src/main/java/org/mule/service/soap/generator/EmptyRequestGenerator.java new file mode 100644 index 00000000..30eca8cb --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/EmptyRequestGenerator.java @@ -0,0 +1,113 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static java.lang.String.format; +import static java.util.Optional.empty; +import static java.util.Optional.ofNullable; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.model.MetadataType; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.runtime.soap.api.exception.BadRequestException; +import org.mule.service.soap.util.SoapServiceMetadataTypeUtils; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import javax.wsdl.Message; +import javax.wsdl.Part; +import javax.xml.namespace.QName; + +/** + * Enables the construction of request bodies for web service operations that don't require input parameters. + * + * @since 1.0 + */ +final class EmptyRequestGenerator { + + private static final String REQUIRED_PARAMS_ERROR_MASK = + "Cannot build default body request for operation [%s]%s, the operation requires input parameters"; + + /** + * SOAP request mask for operations without input parameters + */ + private static final String NO_PARAMS_SOAP_BODY_CALL_MASK = ""; + private final PortModel port; + private final TypeLoader loader; + + public EmptyRequestGenerator(PortModel port, TypeLoader loader) { + this.port = port; + this.loader = loader; + } + + /** + * Generates a request body for an operation that don't require input parameters, if the required XML in the body is just one + * constant element. + */ + String generateRequest(String operationName) { + + OperationModel operation = port.getOperation(operationName); + Optional part = getSinglePart(operation.getInputParts(), operation.getInputMessage()); + + if (!part.isPresent()) { + throw new BadRequestException(format(REQUIRED_PARAMS_ERROR_MASK, operationName, + " there is no single part in the input message")); + } + + if (part.get().getElementName() == null) { + throw new BadRequestException(format(REQUIRED_PARAMS_ERROR_MASK, operationName, + " there is one message body part but no does not have an element defined")); + } + + Part bodyPart = part.get(); + + if (isOperationWithRequiredParameters(loader, bodyPart)) { + // operation has required parameters + throw new BadRequestException(format(REQUIRED_PARAMS_ERROR_MASK, operationName, "")); + } + + // There is a single part with an element defined and it does not require parameters + QName element = bodyPart.getElementName(); + return format(NO_PARAMS_SOAP_BODY_CALL_MASK, element.getLocalPart(), element.getNamespaceURI()); + } + + private boolean isOperationWithRequiredParameters(TypeLoader loader, Part part) { + // Find the body type + Optional bodyType = loader.load(part.getElementName().toString()); + if (bodyType.isPresent()) { + Collection operationFields = SoapServiceMetadataTypeUtils.getOperationType(bodyType.get()).getFields(); + return !operationFields.isEmpty(); + } + return false; + } + + /** + * Finds the part of the input message that must be used in the SOAP body, if the operation requires only one part. + * + * @param soapBodyParts the body parts discovered in the binding type + * @param inputMessage the input {@link Message} of the operation. + */ + private Optional getSinglePart(List soapBodyParts, Message inputMessage) { + if (soapBodyParts.isEmpty()) { + Map parts = inputMessage.getParts(); + if (parts.size() == 1) { + return ofNullable((Part) parts.values().iterator().next()); + } + } else { + if (soapBodyParts.size() == 1) { + String partName = soapBodyParts.get(0); + return ofNullable(inputMessage.getPart(partName)); + } + } + return empty(); + } +} diff --git a/src/main/java/org/mule/service/soap/generator/SoapRequestGenerator.java b/src/main/java/org/mule/service/soap/generator/SoapRequestGenerator.java new file mode 100644 index 00000000..f162f2aa --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/SoapRequestGenerator.java @@ -0,0 +1,65 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static org.apache.commons.lang3.StringUtils.isBlank; + +import org.mule.metadata.api.TypeLoader; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.soap.api.exception.SoapServiceException; +import org.mule.service.soap.generator.attachment.AttachmentRequestEnricher; +import org.mule.service.soap.util.XmlTransformationException; +import org.mule.service.soap.util.XmlTransformationUtils; +import org.mule.wsdl.parser.model.PortModel; + +import java.util.Map; + +import javax.xml.stream.XMLStreamReader; + +/** + * Generates a XML SOAP request used to invoke CXF. + *

+ * If no body is provided will try to generate a default one. + *

+ * for each attachment will add a node with the required information depending on the protocol that it's being used. + * + * @since 1.0 + */ +public final class SoapRequestGenerator { + + private final EmptyRequestGenerator emptyRequestGenerator; + private final AttachmentRequestEnricher requestEnricher; + + public SoapRequestGenerator(AttachmentRequestEnricher requestEnricher, PortModel port, TypeLoader loader) { + this.requestEnricher = requestEnricher; + this.emptyRequestGenerator = new EmptyRequestGenerator(port, loader); + } + + /** + * Generates an {@link XMLStreamReader} SOAP request ready to be consumed by CXF. + * + * @param operation the name of the operation being invoked. + * @param body the body content provided by the user. + * @param attachments the attachments provided by the user. + */ + public XMLStreamReader generate(String operation, String body, Map attachments) { + + if (isBlank(body)) { + body = emptyRequestGenerator.generateRequest(operation); + } + + if (!attachments.isEmpty()) { + body = requestEnricher.enrichRequest(body, attachments); + } + + try { + return XmlTransformationUtils.stringToXmlStreamReader(body); + } catch (XmlTransformationException e) { + throw new SoapServiceException("Error generating SOAP request", e); + } + } +} diff --git a/src/main/java/org/mule/service/soap/generator/SoapResponseGenerator.java b/src/main/java/org/mule/service/soap/generator/SoapResponseGenerator.java new file mode 100644 index 00000000..62e432b2 --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/SoapResponseGenerator.java @@ -0,0 +1,123 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static java.lang.String.CASE_INSENSITIVE_ORDER; +import static java.util.Collections.emptyMap; +import static org.mule.runtime.api.metadata.MediaType.APPLICATION_XML; +import static org.mule.service.soap.client.SoapCxfClient.MULE_ATTACHMENTS_KEY; +import static org.mule.service.soap.client.SoapCxfClient.MULE_HEADERS_KEY; +import static org.mule.service.soap.client.SoapCxfClient.MULE_TRANSPORT_HEADERS_KEY; + +import org.mule.runtime.api.metadata.MediaType; +import org.mule.runtime.extension.api.runtime.operation.Result; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.extension.api.soap.SoapAttributes; +import org.mule.runtime.soap.api.client.SoapClient; +import org.mule.runtime.soap.api.exception.BadResponseException; +import org.mule.runtime.soap.api.message.SoapRequest; +import org.mule.runtime.soap.api.message.SoapResponse; +import org.mule.service.soap.generator.attachment.AttachmentResponseEnricher; +import org.mule.service.soap.message.EmptySoapResponse; +import org.mule.service.soap.message.ImmutableSoapResponse; +import org.mule.service.soap.util.XmlTransformationException; +import org.mule.service.soap.util.XmlTransformationUtils; + +import java.io.ByteArrayInputStream; +import java.nio.charset.Charset; +import java.util.Map; +import java.util.Optional; +import java.util.TreeMap; + +import javax.xml.stream.XMLStreamReader; + +import org.apache.cxf.message.Exchange; +import org.w3c.dom.Document; + +/** + * Class used to generate the output of the {@link SoapClient#consume(SoapRequest)} using the CXF response. + * + * @since 1.0 + */ +public final class SoapResponseGenerator { + + private final AttachmentResponseEnricher responseEnricher; + + public SoapResponseGenerator(AttachmentResponseEnricher responseEnricher) { + this.responseEnricher = responseEnricher; + } + + /** + * Generates an {@link Result} with the out attachments and headers and the response body of the SOAP operation. + *

+ * If there are out attachments the nodes in the response associated to them will be removed so the end user don't need to + * handle those nodes. + *

+ * The our SOAP headers and the protocol specific headers will be retrieved in a {@link SoapAttributes} as attributes in the + * returned {@link Result}. + * + * @param operation the name of the operation that was invoked + * @param response the CXF response + * @param exchange the exchange used for CXF to store the headers and attachments. + */ + public SoapResponse generate(String operation, Object[] response, Exchange exchange) { + Map transportHeaders = getTransportHeaders(exchange); + if (response == null) { + return new EmptySoapResponse(transportHeaders); + } + + Document document = unwrapResponse(response); + String result = responseEnricher.enrich(document, operation, exchange); + Map attachments = (Map) exchange.get(MULE_ATTACHMENTS_KEY); + Map headers = (Map) exchange.get(MULE_HEADERS_KEY); + ByteArrayInputStream resultStream = new ByteArrayInputStream(result.getBytes()); + MediaType mediaType = getContentType(transportHeaders); + return new ImmutableSoapResponse(resultStream, headers, transportHeaders, attachments, mediaType); + } + + private MediaType getContentType(Map transportHeaders) { + String ct = transportHeaders.get("content-type"); + if (ct != null) { + Optional charset = MediaType.parse(ct).getCharset(); + if (charset.isPresent()) { + return MediaType.create("application", "xml", charset.get()); + } + } + return APPLICATION_XML; + } + + private Map getTransportHeaders(Exchange exchange) { + Map transportHeaders = (Map) exchange.get(MULE_TRANSPORT_HEADERS_KEY); + if (transportHeaders == null) { + return emptyMap(); + } else { + Map result = new TreeMap<>(CASE_INSENSITIVE_ORDER); + result.putAll(transportHeaders); + return result; + } + } + + /** + * Unwraps the CXF {@link XMLStreamReader} response into a dom {@link Document}. + * + * @param response the CXF received response. + */ + private Document unwrapResponse(Object[] response) { + if (response.length == 0) { + throw new BadResponseException("no elements were received in the SOAP response."); + } + if (response.length != 1) { + throw new BadResponseException("the obtained response contains more than one element, only one was expected"); + } + XMLStreamReader reader = (XMLStreamReader) response[0]; + try { + return XmlTransformationUtils.xmlStreamReaderToDocument(reader); + } catch (XmlTransformationException e) { + throw new BadResponseException("Error transforming the XML web service response to be processed", e); + } + } +} diff --git a/src/main/java/org/mule/service/soap/generator/attachment/AttachmentRequestEnricher.java b/src/main/java/org/mule/service/soap/generator/attachment/AttachmentRequestEnricher.java new file mode 100644 index 00000000..1e8b7d9b --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/attachment/AttachmentRequestEnricher.java @@ -0,0 +1,64 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator.attachment; + +import static org.mule.service.soap.xml.util.XMLUtils.toXml; + +import org.mule.metadata.api.TypeLoader; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.soap.api.exception.SoapServiceException; +import org.mule.service.soap.util.XmlTransformationException; +import org.mule.service.soap.util.XmlTransformationUtils; + +import java.util.Map; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * Abstract implementation for a request enricher that adds a node for each sent attachment to the incoming SOAP request with all + * the information required to send the attachments using the SOAP protocol. + * + * @since 1.0 + */ +public abstract class AttachmentRequestEnricher { + + protected TypeLoader loader; + + AttachmentRequestEnricher(TypeLoader loader) { + this.loader = loader; + } + + /** + * @param body the XML SOAP body provided by the user. + * @param attachments the attachments to upload. + */ + public String enrichRequest(String body, Map attachments) { + try { + Document bodyDocument = XmlTransformationUtils.stringToDocument(body); + Element documentElement = bodyDocument.getDocumentElement(); + attachments.forEach((name, attachment) -> { + Element attachmentElement = bodyDocument.createElement(name); + addAttachmentElement(bodyDocument, name, attachment, attachmentElement); + documentElement.appendChild(attachmentElement); + }); + return toXml(bodyDocument); + } catch (XmlTransformationException e) { + throw new SoapServiceException("Error while preparing request for the provided body", e); + } + } + + /** + * Adds the content to the attachment node recently created to the XML SOAP request + * + * @param bodyDocument the document where we are adding the node element. + * @param attachment the attachment to be sent. + * @param attachmentElement the recently created attachment node in the xml request. + */ + abstract void addAttachmentElement(Document bodyDocument, String name, SoapAttachment attachment, Element attachmentElement); + +} diff --git a/src/main/java/org/mule/service/soap/generator/attachment/AttachmentResponseEnricher.java b/src/main/java/org/mule/service/soap/generator/attachment/AttachmentResponseEnricher.java new file mode 100644 index 00000000..23c99821 --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/attachment/AttachmentResponseEnricher.java @@ -0,0 +1,70 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator.attachment; + +import static java.lang.String.format; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.model.MetadataType; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.runtime.soap.api.exception.InvalidWsdlException; +import org.mule.service.soap.util.SoapServiceMetadataTypeUtils; +import org.mule.service.soap.xml.util.XMLUtils; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.List; +import java.util.Map; + +import javax.wsdl.Part; + +import org.apache.cxf.message.Exchange; +import org.w3c.dom.Document; + +/** + * + * @since 1.0 + */ +public abstract class AttachmentResponseEnricher { + + private final TypeLoader loader; + private final Map operations; + + protected AttachmentResponseEnricher(TypeLoader loader, Map operations) { + this.loader = loader; + this.operations = operations; + } + + /** + * {@inheritDoc} + *

+ * Modifies the SOAP response to avoid attachment content in the response body and make decouple the attachment handling so the + * user can have a better experience. + */ + public String enrich(Document response, String operation, Exchange exchange) { + Part outputPart = operations.get(operation).getOutputBodyPart() + .orElseThrow(() -> new InvalidWsdlException( + format("Cannot find output body part for operation [%s] in the configured WSDL", + operation))); + + String part = outputPart.getElementName().toString(); + MetadataType outputBodyType = loader.load(part) + .orElseThrow(() -> new InvalidWsdlException( + format("Cannot found output part [%s] for operation [%s] in the configured WSDL", + part, operation))); + + List attachmentParams = SoapServiceMetadataTypeUtils.getAttachmentFields(outputBodyType); + if (!attachmentParams.isEmpty()) { + processResponseAttachments(response, attachmentParams, exchange); + } + return XMLUtils.toXml(response); + } + + /** + * Processes the attachments nodes in the response. + */ + protected abstract void processResponseAttachments(Document response, List attachments, Exchange exchange); +} diff --git a/src/main/java/org/mule/service/soap/generator/attachment/Base64Decoder.java b/src/main/java/org/mule/service/soap/generator/attachment/Base64Decoder.java new file mode 100644 index 00000000..b5de4634 --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/attachment/Base64Decoder.java @@ -0,0 +1,75 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator.attachment; + +import static org.mule.runtime.api.metadata.DataType.BYTE_ARRAY; +import static org.mule.runtime.api.metadata.DataType.CURSOR_STREAM_PROVIDER; +import static org.mule.runtime.api.metadata.DataType.INPUT_STREAM; +import static org.mule.runtime.api.metadata.DataType.STRING; +import static org.mule.runtime.core.api.config.i18n.CoreMessages.transformFailed; +import org.mule.runtime.api.streaming.bytes.CursorStreamProvider; +import org.mule.runtime.core.api.transformer.AbstractTransformer; +import org.mule.runtime.core.api.transformer.TransformerException; +import org.mule.runtime.core.api.util.Base64; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; + +/** + * Base64Encoder transforms Base64 encoded data into strings or byte arrays. + * + * @since 1.0 + */ +public class Base64Decoder extends AbstractTransformer { + + public Base64Decoder() { + registerSourceType(STRING); + registerSourceType(BYTE_ARRAY); + registerSourceType(INPUT_STREAM); + registerSourceType(CURSOR_STREAM_PROVIDER); + setReturnDataType(BYTE_ARRAY); + } + + @Override + public Object doTransform(Object src, Charset outputEncoding) throws TransformerException { + try { + String data; + + if (src instanceof byte[]) { + data = new String((byte[]) src, outputEncoding); + } else if (src instanceof CursorStreamProvider) { + data = handleStream(((CursorStreamProvider) src).openCursor(), outputEncoding); + } else if (src instanceof InputStream) { + data = handleStream((InputStream) src, outputEncoding); + } else { + data = (String) src; + } + + byte[] result = Base64.decode(data); + + if (STRING.isCompatibleWith(getReturnDataType())) { + return new String(result, outputEncoding); + } else { + return result; + } + } catch (Exception ex) { + throw new TransformerException(transformFailed("base64", getReturnDataType()), this, ex); + } + } + + private String handleStream(InputStream input, Charset outputEncoding) throws IOException { + String data; + try { + data = org.apache.commons.io.IOUtils.toString(input, outputEncoding); + } finally { + input.close(); + } + return data; + } + +} diff --git a/src/main/java/org/mule/service/soap/generator/attachment/Base64Encoder.java b/src/main/java/org/mule/service/soap/generator/attachment/Base64Encoder.java new file mode 100644 index 00000000..2e9252ed --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/attachment/Base64Encoder.java @@ -0,0 +1,77 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator.attachment; + +import static org.apache.commons.io.IOUtils.toByteArray; +import static org.mule.runtime.api.metadata.DataType.BYTE_ARRAY; +import static org.mule.runtime.api.metadata.DataType.CURSOR_STREAM_PROVIDER; +import static org.mule.runtime.api.metadata.DataType.INPUT_STREAM; +import static org.mule.runtime.api.metadata.DataType.STRING; +import static org.mule.runtime.core.api.config.i18n.CoreMessages.transformFailed; +import static org.mule.runtime.core.api.util.Base64.DONT_BREAK_LINES; +import static org.mule.runtime.core.api.util.Base64.encodeBytes; +import org.mule.runtime.api.streaming.bytes.CursorStreamProvider; +import org.mule.runtime.core.api.transformer.AbstractTransformer; +import org.mule.runtime.core.api.transformer.TransformerException; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.Charset; + +/** + * Base64Encoder transforms strings or byte arrays into Base64 encoded string. + * + * @since 1.0 + */ +public class Base64Encoder extends AbstractTransformer { + + public Base64Encoder() { + registerSourceType(STRING); + registerSourceType(BYTE_ARRAY); + registerSourceType(INPUT_STREAM); + registerSourceType(CURSOR_STREAM_PROVIDER); + setReturnDataType(STRING); + } + + @Override + public Object doTransform(Object src, Charset encoding) throws TransformerException { + try { + byte[] buf; + + if (src instanceof String) { + buf = ((String) src).getBytes(encoding); + } else if (src instanceof CursorStreamProvider) { + buf = handleStream(((CursorStreamProvider) src).openCursor(), encoding); + } else if (src instanceof InputStream) { + buf = handleStream((InputStream) src, encoding); + } else { + buf = (byte[]) src; + } + + String result = encodeBytes(buf, DONT_BREAK_LINES); + + if (byte[].class.isAssignableFrom(getReturnDataType().getType())) { + return result.getBytes(encoding); + } else { + return result; + } + } catch (Exception ex) { + throw new TransformerException(transformFailed(src.getClass().getName(), "base64"), this, ex); + } + } + + private byte[] handleStream(InputStream src, Charset encoding) throws IOException { + InputStreamReader input = new InputStreamReader(src); + try { + return toByteArray(input, encoding); + } finally { + input.close(); + } + } + +} diff --git a/src/main/java/org/mule/service/soap/generator/attachment/MtomRequestEnricher.java b/src/main/java/org/mule/service/soap/generator/attachment/MtomRequestEnricher.java new file mode 100644 index 00000000..17c5c64b --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/attachment/MtomRequestEnricher.java @@ -0,0 +1,52 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator.attachment; + + +import static java.lang.String.format; + +import org.mule.metadata.api.TypeLoader; +import org.mule.runtime.extension.api.soap.SoapAttachment; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * {@link AttachmentRequestEnricher} implementation for clients that works with MTOM. + * + * @since 1.0 + */ +public final class MtomRequestEnricher extends AttachmentRequestEnricher { + + private static final String XOP_NS = "http://www.w3.org/2004/08/xop/include"; + private static final String XOP_TAG_NAME = "xop:Include"; + private static final String HREF = "href"; + private static final String CONTENT_ID_MASK = "cid:%s"; + + public MtomRequestEnricher(TypeLoader loader) { + super(loader); + } + + + /** + * {@inheritDoc} + *

+ * Adds the XOP element to the attachment node this way the attachments gets tracked with its CID (content id) when it's sent in + * the multipart request. + *

+ * Basically adds this content to the attachment node + * {@code } and uses the + * attachmentContentId to identify the attachment in the multipart. + */ + @Override + protected void addAttachmentElement(Document bodyDocument, String name, SoapAttachment attachment, Element attachmentNode) { + Element xop = bodyDocument.createElementNS(XOP_NS, XOP_TAG_NAME); + // sets the content id of the attachment that is going to be sent in the multipart message. + xop.setAttribute(HREF, format(CONTENT_ID_MASK, name)); + attachmentNode.appendChild(xop); + } +} diff --git a/src/main/java/org/mule/service/soap/generator/attachment/MtomResponseEnricher.java b/src/main/java/org/mule/service/soap/generator/attachment/MtomResponseEnricher.java new file mode 100644 index 00000000..c8b6450b --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/attachment/MtomResponseEnricher.java @@ -0,0 +1,48 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator.attachment; + +import static org.mule.metadata.api.utils.MetadataTypeUtils.getLocalPart; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.service.soap.interceptor.OutputMtomSoapAttachmentsInterceptor; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.List; +import java.util.Map; + +import org.apache.cxf.message.Exchange; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +/** + * {@link AttachmentResponseEnricher} implementation for clients that works with MTOM. + * + * @since 1.0 + */ +public final class MtomResponseEnricher extends AttachmentResponseEnricher { + + public MtomResponseEnricher(TypeLoader loader, Map operations) { + super(loader, operations); + } + + /** + * {@inheritDoc} + *

+ * Removes the attachments nodes from the response that have been already processed by the + * {@link OutputMtomSoapAttachmentsInterceptor} + */ + @Override + protected void processResponseAttachments(Document response, List attachments, Exchange exchange) { + attachments.forEach(a -> { + String tagName = getLocalPart(a); + Node attachmentNode = response.getDocumentElement().getElementsByTagName(tagName).item(0); + response.getDocumentElement().removeChild(attachmentNode); + }); + } +} diff --git a/src/main/java/org/mule/service/soap/generator/attachment/SoapAttachmentRequestEnricher.java b/src/main/java/org/mule/service/soap/generator/attachment/SoapAttachmentRequestEnricher.java new file mode 100644 index 00000000..eaf28440 --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/attachment/SoapAttachmentRequestEnricher.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator.attachment; + +import org.mule.metadata.api.TypeLoader; +import org.mule.runtime.core.api.transformer.TransformerException; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.soap.api.exception.EncodingException; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +/** + * {@link AttachmentRequestEnricher} implementation to send attachments using SOAP with Attachments. + * + * @since 1.0 + */ +public final class SoapAttachmentRequestEnricher extends AttachmentRequestEnricher { + + private static final Base64Encoder encoder = new Base64Encoder(); + + public SoapAttachmentRequestEnricher(TypeLoader loader) { + super(loader); + } + + /** + * {@inheritDoc} + *

+ * Adds the attachment content encoded to Base64 plain in the XML Request in the generated attachment node. + */ + @Override + protected void addAttachmentElement(Document bodyDocument, String name, SoapAttachment attachment, Element attachmentElement) { + // Encode the attachment to base64 to be sent as SOAP with Attachments. + attachmentElement.setTextContent(toBase64(attachment.getContent())); + } + + /** + * Returns an {@link String} with the content of the attachment encoded to Base64. + * + * @param content the content of the attachment. + */ + private String toBase64(Object content) { + try { + return encoder.transform(content).toString(); + } catch (TransformerException e) { + throw new EncodingException("Could not encode attachment content to base64", e); + } + } +} diff --git a/src/main/java/org/mule/service/soap/generator/attachment/SoapAttachmentResponseEnricher.java b/src/main/java/org/mule/service/soap/generator/attachment/SoapAttachmentResponseEnricher.java new file mode 100644 index 00000000..1ea98aa6 --- /dev/null +++ b/src/main/java/org/mule/service/soap/generator/attachment/SoapAttachmentResponseEnricher.java @@ -0,0 +1,81 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator.attachment; + +import static java.lang.String.format; +import static org.mule.metadata.api.utils.MetadataTypeUtils.getLocalPart; +import static org.mule.runtime.api.metadata.MediaType.ANY; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.runtime.core.api.transformer.TransformerException; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.soap.api.exception.EncodingException; +import org.mule.service.soap.client.SoapCxfClient; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import com.google.common.collect.ImmutableMap; + +import java.io.ByteArrayInputStream; +import java.util.List; +import java.util.Map; + +import org.apache.cxf.message.Exchange; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +/** + * {@link AttachmentResponseEnricher} implementation for SOAP with attachments. + * + * @since 1.0 + */ +public final class SoapAttachmentResponseEnricher extends AttachmentResponseEnricher { + + private static final Base64Decoder decoder = new Base64Decoder(); + + public SoapAttachmentResponseEnricher(TypeLoader loader, Map operations) { + super(loader, operations); + } + + /** + * {@inheritDoc} + *

+ * Extracts the base64 encoded content from the attachment nodes, decodes them and then remove all the nodes to clean the + * response body. + */ + @Override + protected void processResponseAttachments(Document response, List attachments, Exchange exchange) { + ImmutableMap.Builder builder = ImmutableMap.builder(); + attachments.forEach(attachment -> { + String attachmentName = getLocalPart(attachment); + builder.put(attachmentName, getAttachment(response, attachmentName)); + }); + exchange.put(SoapCxfClient.MULE_ATTACHMENTS_KEY, builder.build()); + } + + /** + * Extracts the base64 encoded content from the attachment {@code name}, decodes its content and removes the node from the + * document. + */ + private SoapAttachment getAttachment(Document response, String name) { + Node attachmentNode = response.getDocumentElement().getElementsByTagName(name).item(0); + byte[] decodedAttachment = decodeAttachment(name, attachmentNode.getTextContent()); + response.getDocumentElement().removeChild(attachmentNode); + return new SoapAttachment(new ByteArrayInputStream(decodedAttachment), ANY); + } + + /** + * Decodes the attachment content from base64. + */ + private byte[] decodeAttachment(String name, String attachmentContent) { + try { + return (byte[]) decoder.transform(attachmentContent); + } catch (TransformerException e) { + throw new EncodingException(format("Cannot decode base64 attachment [%s]", name)); + } + } +} diff --git a/src/main/java/org/mule/service/soap/interceptor/DispatchingRequestFactory.java b/src/main/java/org/mule/service/soap/interceptor/DispatchingRequestFactory.java new file mode 100644 index 00000000..eab9c130 --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/DispatchingRequestFactory.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.Message; +import org.mule.runtime.extension.api.soap.message.DispatchingRequest; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Map; +import java.util.TreeMap; + +import static java.lang.String.CASE_INSENSITIVE_ORDER; +import static org.apache.cxf.message.Message.CONTENT_TYPE; +import static org.mule.service.soap.client.SoapCxfClient.MULE_SOAP_ACTION; +import static org.mule.service.soap.client.SoapCxfClient.MULE_TRANSPORT_HEADERS_KEY; +import static org.mule.service.soap.client.SoapCxfClient.MULE_WSC_ADDRESS; +import static org.mule.service.soap.interceptor.SoapActionInterceptor.SOAP_ACTION; + +/** + * Creates {@link DispatchingRequest} instances given a {@link Message}. + * + * @since 1.1 + */ +public class DispatchingRequestFactory { + + public static DispatchingRequest createDispatchingRequest(Message message) { + Exchange exchange = message.getExchange(); + String action = (String) exchange.get(MULE_SOAP_ACTION); + Map headers = new TreeMap<>(CASE_INSENSITIVE_ORDER); + headers.put(SOAP_ACTION, action); + // It's important that content type is bundled with the headers + headers.put(CONTENT_TYPE, (String) message.get(CONTENT_TYPE)); + headers.putAll((Map) exchange.get(MULE_TRANSPORT_HEADERS_KEY)); + InputStream content = new ByteArrayInputStream(message.getContent(OutputStream.class).toString().getBytes()); + return new DispatchingRequest(content, (String) exchange.get(MULE_WSC_ADDRESS), headers); + } +} diff --git a/src/main/java/org/mule/service/soap/interceptor/MessageDispatcherInterceptor.java b/src/main/java/org/mule/service/soap/interceptor/MessageDispatcherInterceptor.java new file mode 100644 index 00000000..dc011f12 --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/MessageDispatcherInterceptor.java @@ -0,0 +1,100 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import static java.lang.Boolean.TRUE; +import static java.lang.String.CASE_INSENSITIVE_ORDER; +import static java.util.Collections.emptyList; +import static org.apache.cxf.interceptor.StaxInEndingInterceptor.STAX_IN_NOCLOSE; +import static org.apache.cxf.message.Message.CONTENT_TYPE; +import static org.apache.cxf.message.Message.ENCODING; +import static org.apache.cxf.phase.Phase.SEND_ENDING; +import static org.mule.service.soap.client.SoapCxfClient.MESSAGE_DISPATCHER; +import static org.mule.service.soap.client.SoapCxfClient.MULE_SOAP_ACTION; +import static org.mule.service.soap.client.SoapCxfClient.MULE_SOAP_OPERATION_STYLE; +import static org.mule.service.soap.client.SoapCxfClient.MULE_TRANSPORT_HEADERS_KEY; +import static org.mule.service.soap.client.SoapCxfClient.MULE_WSC_ADDRESS; +import static org.mule.service.soap.interceptor.SoapActionInterceptor.SOAP_ACTION; + +import org.mule.runtime.extension.api.soap.message.DispatchingRequest; +import org.mule.runtime.extension.api.soap.message.DispatchingResponse; +import org.mule.runtime.extension.api.soap.message.MessageDispatcher; +import org.mule.runtime.soap.api.client.SoapClientConfiguration; +import org.mule.wsdl.parser.model.operation.OperationType; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.cxf.endpoint.ClientImpl; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.Message; +import org.apache.cxf.message.MessageImpl; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.transport.MessageObserver; + +/** + * CXF interceptor that uses a custom {@link MessageDispatcher}, specified in the {@link SoapClientConfiguration} to send a SOAP + * message and inject the obtained response into the CXF in (response) interceptors lifecycle. + * + * @since 1.0 + */ +public class MessageDispatcherInterceptor extends AbstractPhaseInterceptor { + + private final MessageObserver messageObserver; + + public MessageDispatcherInterceptor(MessageObserver messageObserver) { + super(SEND_ENDING); + this.messageObserver = messageObserver; + } + + /** + * {@inheritDoc} + *

+ * Intercepts the SOAP message and performs the dispatch of it, receiving the response and sending it to the IN intercepting + * processor chain. + */ + @Override + public void handleMessage(Message message) throws Fault { + Exchange exchange = message.getExchange(); + Object encoding = exchange.get(ENCODING); + message.put(ENCODING, encoding); + + // Performs all the remaining interceptions before sending. + message.getInterceptorChain().doIntercept(message); + + // Wipe the request attachment list, so don't get mixed with the response ones. + message.setAttachments(emptyList()); + + MessageDispatcher dispatcher = (MessageDispatcher) exchange.get(MESSAGE_DISPATCHER); + DispatchingResponse response = dispatcher.dispatch(DispatchingRequestFactory.createDispatchingRequest(message)); + + // This needs to be set because we want the wsc closes the final stream, + // otherwise cxf will close it too early when handling message in the StaxInEndingInterceptor. + exchange.put(STAX_IN_NOCLOSE, TRUE); + + if (OperationType.ONE_WAY.equals(exchange.get(MULE_SOAP_OPERATION_STYLE))) { + exchange.put(ClientImpl.FINISHED, true); + } else { + handleRequestResponse(exchange, encoding, response); + } + } + + private void handleRequestResponse(Exchange exchange, Object encoding, DispatchingResponse response) { + Message inMessage = new MessageImpl(); + inMessage.put(ENCODING, encoding); + inMessage.put(CONTENT_TYPE, response.getContentType()); + inMessage.setContent(InputStream.class, response.getContent()); + exchange.put(MULE_TRANSPORT_HEADERS_KEY, response.getHeaders()); + inMessage.setExchange(exchange); + messageObserver.onMessage(inMessage); + } +} diff --git a/src/main/java/org/mule/service/soap/interceptor/NamespaceRestorerStaxInterceptor.java b/src/main/java/org/mule/service/soap/interceptor/NamespaceRestorerStaxInterceptor.java new file mode 100644 index 00000000..6e429d21 --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/NamespaceRestorerStaxInterceptor.java @@ -0,0 +1,36 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.interceptor.StaxInInterceptor; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.phase.Phase; + +/** + * CXF interceptor that makes use of a {@link NamespaceRestorerXMLStreamReader} to allow the first element of the body to carry + * all the namespaces from the parent nodes. + *

+ * This interceptor works with {@link NamespaceSaverStaxInterceptor} + * + * @since 1.0 + */ +public class NamespaceRestorerStaxInterceptor extends AbstractPhaseInterceptor { + + public NamespaceRestorerStaxInterceptor() { + super(Phase.PRE_INVOKE); + getAfter().add(StaxInInterceptor.class.getName()); + } + + public void handleMessage(Message message) throws Fault { + NamespaceRestorerXMLStreamReader reader = message.getContent(NamespaceRestorerXMLStreamReader.class); + reader.restoreNamespaces(); + } +} + + diff --git a/src/main/java/org/mule/service/soap/interceptor/NamespaceRestorerXMLStreamReader.java b/src/main/java/org/mule/service/soap/interceptor/NamespaceRestorerXMLStreamReader.java new file mode 100644 index 00000000..5ffa2a3b --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/NamespaceRestorerXMLStreamReader.java @@ -0,0 +1,102 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.Namespace; +import javax.xml.stream.events.StartElement; + +/** + * XMLStreamReader decorator that restores XML Namespace declarations, by default, it will restore the namespaces on the first + * declaration, but this can be overridden + * + * @since 1.0 + */ +public class NamespaceRestorerXMLStreamReader extends ScopeSaverXMLStreamReader { + + private List namespaces; + private List nsBlocklist = new ArrayList<>(); + + NamespaceRestorerXMLStreamReader(XMLStreamReader reader) { + super(reader); + } + + final NamespaceRestorerXMLStreamReader blockList(String namespace) { + nsBlocklist.add(namespace); + return this; + } + + void restoreNamespaces() { + if (getEventType() == START_ELEMENT) { + namespaces = new ArrayList<>(); + + Set prefixes = new HashSet<>(); + for (StartElement elem : scopes()) { + Iterator iterator = elem.getNamespaces(); + while (iterator.hasNext()) { + Namespace ns = iterator.next(); + if (prefixes.add(ns.getPrefix()) && !nsBlocklist.contains(ns.getNamespaceURI())) { + namespaces.add(ns); + } + } + } + } + } + + @Override + public int next() throws XMLStreamException { + namespaces = null; + return super.next(); + } + + @Override + public int getNamespaceCount() { + if (overrideNamespaces()) { + return namespaces.size(); + } + return super.getNamespaceCount(); + } + + private boolean overrideNamespaces() { + return namespaces != null; + } + + @Override + public String getNamespacePrefix(int index) { + if (overrideNamespaces()) { + return namespaces.get(index).getPrefix(); + } + return super.getNamespacePrefix(index); + } + + @Override + public String getNamespaceURI(String prefix) { + if (overrideNamespaces()) { + for (Namespace ns : namespaces) { + if (ns.getPrefix().equals(prefix)) { + return ns.getNamespaceURI(); + } + } + } + return super.getNamespaceURI(prefix); + } + + @Override + public String getNamespaceURI(int index) { + if (overrideNamespaces()) { + return namespaces.get(index).getNamespaceURI(); + } + return super.getNamespaceURI(index); + } +} diff --git a/src/main/java/org/mule/service/soap/interceptor/NamespaceSaverStaxInterceptor.java b/src/main/java/org/mule/service/soap/interceptor/NamespaceSaverStaxInterceptor.java new file mode 100644 index 00000000..eb7e140e --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/NamespaceSaverStaxInterceptor.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import javax.xml.soap.SOAPConstants; +import javax.xml.stream.XMLStreamReader; + +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.interceptor.StaxInInterceptor; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.phase.Phase; + +/** + * CXF interceptor that wraps the XML Stream with a decorator that is able to restore namespace declarations for fragments in the + * response message. + * + * @since 1.0 + */ +public class NamespaceSaverStaxInterceptor extends AbstractPhaseInterceptor { + + public NamespaceSaverStaxInterceptor() { + super(Phase.POST_STREAM); + getAfter().add(StreamClosingInterceptor.class.getName()); + getAfter().add(StaxInInterceptor.class.getName()); + } + + public void handleMessage(Message message) throws Fault { + XMLStreamReader reader = message.getContent(XMLStreamReader.class); + + if (reader != null) { + NamespaceRestorerXMLStreamReader replacement = new NamespaceRestorerXMLStreamReader(reader) + .blockList(SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE) + .blockList(SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE); + + message.setContent(XMLStreamReader.class, replacement); + message.setContent(NamespaceRestorerXMLStreamReader.class, replacement); + } + } +} diff --git a/src/main/java/org/mule/service/soap/interceptor/OutputMtomSoapAttachmentsInterceptor.java b/src/main/java/org/mule/service/soap/interceptor/OutputMtomSoapAttachmentsInterceptor.java new file mode 100644 index 00000000..c44808b9 --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/OutputMtomSoapAttachmentsInterceptor.java @@ -0,0 +1,68 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import static org.apache.cxf.interceptor.Fault.FAULT_CODE_SERVER; +import static org.apache.cxf.phase.Phase.PRE_PROTOCOL; +import static org.mule.service.soap.client.SoapCxfClient.MULE_ATTACHMENTS_KEY; +import org.mule.runtime.api.metadata.MediaType; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.soap.api.message.SoapRequest; +import org.mule.service.soap.client.SoapCxfClient; + +import com.google.common.collect.ImmutableMap; + +import java.io.IOException; +import java.util.Collection; + +import javax.activation.DataHandler; + +import org.apache.cxf.binding.soap.SoapFault; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Attachment; +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; + +/** + * CXF out interceptor that collects the received Mtom SOAP attachments in the response, transforms it to message parts and stores + * them in the response message {@link Exchange} so then can be returned by the {@link SoapCxfClient#consume(SoapRequest)} as a + * {@link SoapAttachment}, if no attachments are returned an empty map is set. + * + * @since 1.0 + */ +public class OutputMtomSoapAttachmentsInterceptor extends AbstractPhaseInterceptor { + + public OutputMtomSoapAttachmentsInterceptor() { + super(PRE_PROTOCOL); + } + + @Override + public void handleMessage(Message message) throws Fault { + final ImmutableMap.Builder result = ImmutableMap.builder(); + Collection attachments = message.getAttachments(); + if (attachments != null && !attachments.isEmpty()) { + attachments.forEach(a -> result.put(getName(a), getSoapAttachment(a))); + } + message.getExchange().put(MULE_ATTACHMENTS_KEY, result.build()); + } + + private String getName(Attachment attachment) { + DataHandler dataHandler = attachment.getDataHandler(); + return dataHandler.getName() != null ? dataHandler.getName() : attachment.getId(); + } + + private SoapAttachment getSoapAttachment(Attachment attachment) { + DataHandler dataHandler = attachment.getDataHandler(); + try { + MediaType contentType = MediaType.parse(dataHandler.getContentType()); + return new SoapAttachment(dataHandler.getInputStream(), contentType); + } catch (IOException e) { + throw new SoapFault("Error copying received attachment [" + getName(attachment) + "]", e, FAULT_CODE_SERVER); + } + } +} diff --git a/src/main/java/org/mule/service/soap/interceptor/OutputSoapHeadersInterceptor.java b/src/main/java/org/mule/service/soap/interceptor/OutputSoapHeadersInterceptor.java new file mode 100644 index 00000000..1db2d803 --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/OutputSoapHeadersInterceptor.java @@ -0,0 +1,59 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import static java.lang.String.format; +import static org.apache.cxf.phase.Phase.PRE_PROTOCOL; +import static org.mule.service.soap.client.SoapCxfClient.MULE_HEADERS_KEY; +import static org.mule.service.soap.util.XmlTransformationUtils.nodeToString; + +import org.mule.runtime.soap.api.exception.BadResponseException; +import org.mule.runtime.soap.api.message.SoapResponse; +import org.mule.service.soap.util.XmlTransformationException; + +import com.google.common.collect.ImmutableMap; + +import org.apache.cxf.binding.soap.SoapHeader; +import org.apache.cxf.binding.soap.SoapMessage; +import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Exchange; +import org.w3c.dom.Node; + +/** + * CXF out interceptor that collects the received SOAP headers in the response, transforms it and stores them in the response + * message {@link Exchange} so then can be returned in a {@link SoapResponse}. + * + * @since 1.0 + */ +public class OutputSoapHeadersInterceptor extends AbstractSoapInterceptor { + + public OutputSoapHeadersInterceptor() { + super(PRE_PROTOCOL); + } + + /** + * {@inheritDoc} + */ + @Override + public void handleMessage(SoapMessage message) throws Fault { + ImmutableMap.Builder headers = ImmutableMap.builder(); + message.getHeaders().stream() + .filter(header -> header instanceof SoapHeader) + .map(h -> (SoapHeader) h) + .forEach(header -> headers.put(header.getName().getLocalPart(), getHeaderInputStream(header))); + message.getExchange().put(MULE_HEADERS_KEY, headers.build()); + } + + private String getHeaderInputStream(SoapHeader h) { + try { + return nodeToString((Node) h.getObject()); + } catch (XmlTransformationException e) { + throw new BadResponseException(format("Error while processing response header [%s]", h.getName()), e); + } + } +} diff --git a/src/main/java/org/mule/service/soap/interceptor/ScopeSaverXMLStreamReader.java b/src/main/java/org/mule/service/soap/interceptor/ScopeSaverXMLStreamReader.java new file mode 100644 index 00000000..27dd5c2f --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/ScopeSaverXMLStreamReader.java @@ -0,0 +1,72 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + + +import org.mule.service.soap.xml.stax.DelegateXMLStreamReader; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.events.StartElement; +import javax.xml.stream.events.XMLEvent; +import javax.xml.stream.util.XMLEventAllocator; + +import javanet.staxutils.events.EventAllocator; + +/** + * XMLStreamReader decorator that saves the scope and allows the access to information about all the parent XMLEvent elements + * + * @since 1.0 + */ +public class ScopeSaverXMLStreamReader extends DelegateXMLStreamReader { + + private final XMLEventAllocator allocator = new EventAllocator(); + private List scope = new ArrayList(); + private boolean first = true; + + public ScopeSaverXMLStreamReader(XMLStreamReader reader) { + super(reader); + } + + @Override + public int next() throws XMLStreamException { + if (first) { + first = false; + if (getEventType() == XMLStreamReader.START_ELEMENT) { + XMLEvent evt = allocator.allocate(this); + scope.add(evt.asStartElement()); + } + } + int res = super.next(); + switch (res) { + case XMLStreamReader.START_ELEMENT: + XMLEvent evt = allocator.allocate(this); + scope.add(evt.asStartElement()); + break; + case XMLStreamReader.END_ELEMENT: + scope.remove(scope.size() - 1); + break; + default: + break; + } + return res; + } + + public StartElement currentScope() { + if (scope.size() > 0) + throw new IllegalArgumentException("No scope available"); + return scope.get(scope.size() - 1); + } + + public List scopes() { + return scope; + } + +} diff --git a/src/main/java/org/mule/service/soap/interceptor/SoapActionInterceptor.java b/src/main/java/org/mule/service/soap/interceptor/SoapActionInterceptor.java new file mode 100644 index 00000000..9c79f6df --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/SoapActionInterceptor.java @@ -0,0 +1,34 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import static org.apache.cxf.phase.Phase.PRE_LOGICAL; +import static org.mule.service.soap.client.SoapCxfClient.MULE_SOAP_ACTION; + +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; + +/** + * CXF interceptor that adds the SOAP action to the outgoing request message. + * + * @since 1.0 + */ +public class SoapActionInterceptor extends AbstractPhaseInterceptor { + + public static final String SOAP_ACTION = "SOAPAction"; + + public SoapActionInterceptor() { + super(PRE_LOGICAL); + } + + @Override + public void handleMessage(Message message) throws Fault { + String soapAction = (String) message.getExchange().get(MULE_SOAP_ACTION); + message.put(SOAP_ACTION, soapAction); + } +} diff --git a/src/main/java/org/mule/service/soap/interceptor/StreamClosingInterceptor.java b/src/main/java/org/mule/service/soap/interceptor/StreamClosingInterceptor.java new file mode 100644 index 00000000..2128e4d5 --- /dev/null +++ b/src/main/java/org/mule/service/soap/interceptor/StreamClosingInterceptor.java @@ -0,0 +1,55 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.interceptor; + +import static org.apache.cxf.phase.Phase.POST_STREAM; + +import org.mule.service.soap.xml.stax.DelegateXMLStreamReader; + +import java.io.IOException; +import java.io.InputStream; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.interceptor.StaxInInterceptor; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; + +/** + * CXF interceptor that replaces the original XMLStreamReader with another one which closes the underlying {@link InputStream} + * that carried the request. + * + * @since 1.0 + */ +public class StreamClosingInterceptor extends AbstractPhaseInterceptor { + + public StreamClosingInterceptor() { + super(POST_STREAM); + addAfter(StaxInInterceptor.class.getName()); + } + + public void handleMessage(final Message message) throws Fault { + XMLStreamReader xsr = message.getContent(XMLStreamReader.class); + final InputStream is = message.getContent(InputStream.class); + DelegateXMLStreamReader xsr2 = new DelegateXMLStreamReader(xsr) { + + @Override + public void close() throws XMLStreamException { + super.close(); + try { + is.close(); + } catch (IOException e) { + throw new XMLStreamException(e); + } + } + }; + message.setContent(XMLStreamReader.class, xsr2); + } +} + diff --git a/src/main/java/org/mule/service/soap/message/EmptySoapResponse.java b/src/main/java/org/mule/service/soap/message/EmptySoapResponse.java new file mode 100644 index 00000000..72741d6b --- /dev/null +++ b/src/main/java/org/mule/service/soap/message/EmptySoapResponse.java @@ -0,0 +1,74 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.message; + +import static java.util.Collections.emptyMap; +import static java.util.Collections.unmodifiableMap; +import static org.mule.runtime.api.metadata.MediaType.BINARY; + +import org.mule.runtime.api.metadata.DataType; +import org.mule.runtime.api.metadata.MediaType; +import org.mule.runtime.api.metadata.TypedValue; +import org.mule.runtime.extension.api.runtime.operation.Result; +import org.mule.runtime.extension.api.runtime.streaming.StreamingHelper; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.extension.api.soap.SoapAttributes; +import org.mule.runtime.extension.api.soap.SoapOutputPayload; +import org.mule.runtime.soap.api.message.SoapResponse; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.Map; + +/** + * Empty {@link SoapResponse} implementation. + * + * @since 1.0 + */ +public final class EmptySoapResponse implements SoapResponse { + + private final Map transportHeaders; + + public EmptySoapResponse(Map transportHeaders) { + this.transportHeaders = unmodifiableMap(transportHeaders); + } + + @Override + public InputStream getContent() { + return new ByteArrayInputStream(new byte[0]); + } + + @Override + public Map getSoapHeaders() { + return emptyMap(); + } + + @Override + public Map getTransportHeaders() { + return transportHeaders; + } + + @Override + public Map getAttachments() { + return emptyMap(); + } + + @Override + public MediaType getContentType() { + return null; + } + + @Override + public Result getAsResult(StreamingHelper helper) { + return Result.builder() + .output(new SoapOutputPayload(new TypedValue<>(getContent(), DataType.builder() + .type(InputStream.class) + .mediaType(BINARY).build()), emptyMap(), emptyMap())) + .attributes(new SoapAttributes(transportHeaders)) + .build(); + } +} diff --git a/src/main/java/org/mule/service/soap/message/ImmutableSoapResponse.java b/src/main/java/org/mule/service/soap/message/ImmutableSoapResponse.java new file mode 100644 index 00000000..5ef57f54 --- /dev/null +++ b/src/main/java/org/mule/service/soap/message/ImmutableSoapResponse.java @@ -0,0 +1,110 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.message; + +import static java.util.Collections.unmodifiableMap; +import static org.mule.runtime.api.metadata.DataType.XML_STRING; +import static org.mule.runtime.api.metadata.DataType.builder; +import static org.mule.runtime.api.metadata.MediaType.APPLICATION_JAVA; +import static org.mule.runtime.api.metadata.MediaType.APPLICATION_XML; +import static org.mule.runtime.api.metadata.MediaType.XML; + +import org.mule.runtime.api.metadata.DataType; +import org.mule.runtime.api.metadata.MediaType; +import org.mule.runtime.api.metadata.TypedValue; +import org.mule.runtime.extension.api.runtime.operation.Result; +import org.mule.runtime.extension.api.runtime.streaming.StreamingHelper; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.extension.api.soap.SoapAttributes; +import org.mule.runtime.extension.api.soap.SoapOutputPayload; +import org.mule.runtime.soap.api.message.SoapResponse; + +import com.google.common.collect.ImmutableMap; + +import java.io.InputStream; +import java.util.Map; + +/** + * Immutable {@link SoapResponse} implementation. + * + * @since 1.0 + */ +public final class ImmutableSoapResponse implements SoapResponse { + + private final InputStream content; + private final Map soapHeaders; + private final Map transportHeaders; + private final Map attachments; + private final MediaType contentType; + + public ImmutableSoapResponse(InputStream content, + Map soapHeaders, + Map transportHeaders, + Map attachments, + MediaType contentType) { + this.content = content; + this.soapHeaders = unmodifiableMap(soapHeaders); + this.transportHeaders = unmodifiableMap(transportHeaders); + this.attachments = unmodifiableMap(attachments); + this.contentType = contentType; + } + + @Override + public InputStream getContent() { + return content; + } + + @Override + public Map getSoapHeaders() { + return soapHeaders; + } + + @Override + public Map getTransportHeaders() { + return transportHeaders; + } + + @Override + public Map getAttachments() { + return attachments; + } + + @Override + public MediaType getContentType() { + return contentType; + } + + @Override + public Result getAsResult(StreamingHelper helper) { + return Result.builder() + .output(new SoapOutputPayload(wrapBody(content, helper), wrapAttachments(attachments, helper), wrapHeaders(soapHeaders))) + .mediaType(APPLICATION_JAVA) + .attributes(new SoapAttributes(transportHeaders)) + .build(); + } + + private Map> wrapHeaders(Map headers) { + ImmutableMap.Builder> wrapped = ImmutableMap.builder(); + headers.forEach((k, v) -> wrapped.put(k, new TypedValue(v, builder().mediaType(APPLICATION_XML).build()))); + return wrapped.build(); + } + + private TypedValue wrapBody(InputStream body, StreamingHelper helper) { + DataType dataType = builder().type(InputStream.class).mediaType(contentType).build(); + return new TypedValue(helper.resolveCursorProvider(body), dataType); + } + + private Map> wrapAttachments(Map attachments, StreamingHelper helper) { + ImmutableMap.Builder> wrapped = ImmutableMap.builder(); + attachments.forEach((k, v) -> { + DataType dataType = builder().type(InputStream.class).mediaType(v.getContentType()).build(); + wrapped.put(k, new TypedValue(helper.resolveCursorProvider(v.getContent()), dataType)); + }); + return wrapped.build(); + } + +} diff --git a/src/main/java/org/mule/service/soap/metadata/AttachmentsMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/AttachmentsMetadataResolver.java new file mode 100644 index 00000000..c8ca453d --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/AttachmentsMetadataResolver.java @@ -0,0 +1,88 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import static org.mule.metadata.api.utils.MetadataTypeUtils.getLocalPart; +import static org.mule.service.soap.util.SoapServiceMetadataTypeUtils.getAttachmentFields; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.builder.ObjectTypeBuilder; +import org.mule.metadata.api.model.MetadataType; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.metadata.api.model.ObjectType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.operation.OperationModel; +import org.mule.wsdl.parser.model.operation.OperationType; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +import javax.wsdl.Message; +import javax.wsdl.Part; +import javax.xml.namespace.QName; + +/** + * Handles the dynamic {@link MetadataType} resolution for the SOAP attachments of a web service operation. + * + * @since 1.0 + */ +abstract class AttachmentsMetadataResolver extends NodeMetadataResolver { + + private final Function> messageRetriever; + + AttachmentsMetadataResolver(PortModel port, + TypeLoader loader, + Function> partRetriever, + Function> messageRetriever) { + super(port, loader, partRetriever); + this.messageRetriever = messageRetriever; + } + + @Override + public MetadataType getMetadata(String operation) throws MetadataResolvingException { + Part bodyPart = getBodyPart(operation); + MetadataType bodyType = buildPartMetadataType(bodyPart); + List attachments = getAttachmentFields(bodyType); + if (attachments.isEmpty()) { + return getMultipartAttachments(operation, bodyPart).orElse(nullType); + } + // TODO(MULE-15275): This piece of code should be removed when soap with attachments are no longer parsed. + ObjectTypeBuilder type = typeBuilder.objectType(); + attachments.forEach(attachment -> type.addField() + .key(getLocalPart(attachment)) + .value(attachment.getValue())); + return type.build(); + } + + // TODO(MULE-15275): Move this to the parser. + private Optional getMultipartAttachments(String operation, Part bodyPart) { + Message message = this.messageRetriever.apply(this.port.getOperation(operation)).orElse(null); + if (message != null) { + Map parts = message.getParts(); + if (parts != null) { + ObjectTypeBuilder type = typeBuilder.objectType(); + parts.forEach((partName, partObject) -> { + if (!bodyPart.getName().equals(partName)) { + QName typeName = partObject.getTypeName(); + if (typeName != null && typeName.toString().toLowerCase().contains("binary")) { + type.addField().key(partName).value(typeBuilder.binaryType().build()); + } + } + }); + ObjectType result = type.build(); + if (result.getFields().isEmpty()) { + return Optional.empty(); + } + return Optional.of(result); + } + } + return Optional.empty(); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/BodyMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/BodyMetadataResolver.java new file mode 100644 index 00000000..b4d0a6f4 --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/BodyMetadataResolver.java @@ -0,0 +1,70 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import static org.mule.metadata.api.utils.MetadataTypeUtils.getLocalPart; +import static org.mule.service.soap.util.SoapServiceMetadataTypeUtils.getAttachmentFields; +import static org.mule.service.soap.util.SoapServiceMetadataTypeUtils.getOperationType; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.model.MetadataType; +import org.mule.metadata.api.model.NullType; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.metadata.api.model.ObjectType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +import javax.wsdl.Part; + +/** + * Handles the dynamic {@link MetadataType} resolution for the SOAP Body parts of a web service operation. + * + * @since 1.0 + */ +abstract class BodyMetadataResolver extends NodeMetadataResolver { + + BodyMetadataResolver(PortModel port, + TypeLoader loader, + Function> partRetriever) { + super(port, loader, partRetriever); + } + + @Override + public MetadataType getMetadata(String operation) throws MetadataResolvingException { + Part bodyPart = getBodyPart(operation); + MetadataType bodyType = buildPartMetadataType(bodyPart); + List attachmentFields = getAttachmentFields(bodyType); + return filterAttachmentsFromBodyType(bodyType, attachmentFields); + } + + /** + * Filter the attachments fields from the body metadata type since SOAP manages the attachments as regular parameters but we + * wan't to provide a body decoupled experience for the attachments. + *

+ * If after removing the attachments there are not fields remaining in the request, a {@link NullType} is returned. + * + * @param bodyType the {@link MetadataType} of the xml input body, with all the required parameters including the + * @param attachments the attachments fields on found in the type. + * @return the body {@link MetadataType} without the attachment fields. + */ + private MetadataType filterAttachmentsFromBodyType(MetadataType bodyType, List attachments) { + if (!attachments.isEmpty() && bodyType instanceof ObjectType) { + ObjectType operationType = getOperationType(bodyType); + attachments.forEach(a -> operationType.getFields().removeIf(f -> getLocalPart(f).equals(getLocalPart(a)))); + if (operationType.getFields().isEmpty()) { + return nullType; + } + } + return bodyType; + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/DefaultSoapMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/DefaultSoapMetadataResolver.java new file mode 100644 index 00000000..6d0c81dd --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/DefaultSoapMetadataResolver.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.TypeLoader; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.runtime.soap.api.client.metadata.SoapMetadataResolver; +import org.mule.runtime.soap.api.client.metadata.SoapOperationMetadata; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.WsdlModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; +import java.util.Set; + +/** + * Default immutable {@link SoapMetadataResolver} implementation. + * + * @since 1.0 + */ +public class DefaultSoapMetadataResolver implements SoapMetadataResolver { + + private final HeadersMetadataResolver inputHeadersResolver; + private final HeadersMetadataResolver outputHeadersResolver; + private final BodyMetadataResolver inputBodyResolver; + private final BodyMetadataResolver outputBodyResolver; + private final AttachmentsMetadataResolver inputAttachmentsResolver; + private final AttachmentsMetadataResolver outputAttachmentsResolver; + private final ServiceOperationsResolver keysResolver; + + public DefaultSoapMetadataResolver(WsdlModel wsdl, PortModel port, TypeLoader loader) { + inputHeadersResolver = new InputHeadersMetadataResolver(wsdl, port, loader); + outputHeadersResolver = new OutputHeadersMetadataResolver(wsdl, port, loader); + outputAttachmentsResolver = new OutputAttachmentsMetadataResolver(port, loader); + inputAttachmentsResolver = new InputAttachmentsMetadataResolver(port, loader); + inputBodyResolver = new InputBodyMetadataResolver(port, loader); + outputBodyResolver = new OutputBodyMetadataResolver(port, loader); + keysResolver = new ServiceOperationsResolver(port); + } + + @Override + public SoapOperationMetadata getInputMetadata(String operation) throws MetadataResolvingException { + return new ImmutableSoapOperationMetadata(inputBodyResolver.getMetadata(operation), + inputHeadersResolver.getMetadata(operation), + inputAttachmentsResolver.getMetadata(operation)); + } + + @Override + public SoapOperationMetadata getOutputMetadata(String operation) throws MetadataResolvingException { + return new ImmutableSoapOperationMetadata(outputBodyResolver.getMetadata(operation), + outputHeadersResolver.getMetadata(operation), + outputAttachmentsResolver.getMetadata(operation)); + } + + @Override + public Set getAvailableOperations() { + return keysResolver.getAvailableOperations(); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/HeadersMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/HeadersMetadataResolver.java new file mode 100644 index 00000000..f50438f7 --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/HeadersMetadataResolver.java @@ -0,0 +1,75 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.builder.ObjectFieldTypeBuilder; +import org.mule.metadata.api.builder.ObjectTypeBuilder; +import org.mule.metadata.api.model.MetadataType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.WsdlModel; +import org.mule.wsdl.parser.model.operation.OperationModel; +import org.mule.wsdl.parser.model.operation.SoapHeader; + +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +import javax.wsdl.Message; +import javax.wsdl.Part; + +/** + * Handles the dynamic {@link MetadataType} resolution for the SOAP Headers of a web service operation. + * + * @since 1.0 + */ +abstract class HeadersMetadataResolver extends NodeMetadataResolver { + + private final WsdlModel wsdl; + private final Function messageRetriever; + private final Function> headersRetriever; + + HeadersMetadataResolver(WsdlModel wsdl, + PortModel port, + TypeLoader loader, + Function messageRetriever, + Function> headersRetriever) { + super(port, loader, o -> Optional.empty()); + this.wsdl = wsdl; + this.messageRetriever = messageRetriever; + this.headersRetriever = headersRetriever; + } + + @Override + public MetadataType getMetadata(String operationName) throws MetadataResolvingException { + OperationModel operation = port.getOperation(operationName); + List headers = headersRetriever.apply(operation); + if (!headers.isEmpty()) { + return buildHeaderType(headers, messageRetriever.apply(operation)); + } + return nullType; + } + + private MetadataType buildHeaderType(List headers, Message message) + throws MetadataResolvingException { + ObjectTypeBuilder objectType = typeBuilder.objectType(); + for (SoapHeader header : headers) { + ObjectFieldTypeBuilder field = objectType.addField(); + String headerPart = header.getPartName(); + Part part = message.getPart(headerPart); + if (part != null) { + field.key(headerPart).value(buildPartMetadataType(part)); + } else { + Message headerMessage = wsdl.getMessage(header.getQName()); + field.key(headerPart).value(buildPartMetadataType(headerMessage.getPart(headerPart))); + } + } + return objectType.build(); + } + +} diff --git a/src/main/java/org/mule/service/soap/metadata/ImmutableSoapOperationMetadata.java b/src/main/java/org/mule/service/soap/metadata/ImmutableSoapOperationMetadata.java new file mode 100644 index 00000000..991dbecd --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/ImmutableSoapOperationMetadata.java @@ -0,0 +1,43 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.model.MetadataType; +import org.mule.runtime.soap.api.client.metadata.SoapOperationMetadata; + +/** + * Immutable {@link SoapOperationMetadata} implementation. + * + * @since 1.0 + */ +class ImmutableSoapOperationMetadata implements SoapOperationMetadata { + + private final MetadataType body; + private final MetadataType headers; + private final MetadataType attachments; + + public ImmutableSoapOperationMetadata(MetadataType body, MetadataType headers, MetadataType attachments) { + this.body = body; + this.headers = headers; + this.attachments = attachments; + } + + @Override + public MetadataType getBodyType() { + return body; + } + + @Override + public MetadataType getHeadersType() { + return headers; + } + + @Override + public MetadataType getAttachmentsType() { + return attachments; + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/InputAttachmentsMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/InputAttachmentsMetadataResolver.java new file mode 100644 index 00000000..9d8a7065 --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/InputAttachmentsMetadataResolver.java @@ -0,0 +1,27 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.TypeLoader; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; + +import static java.util.Optional.*; + +/** + * {@link AttachmentsMetadataResolver} implementation for the input attachments. + * + * @since 1.0 + */ +public final class InputAttachmentsMetadataResolver extends AttachmentsMetadataResolver { + + InputAttachmentsMetadataResolver(PortModel port, TypeLoader loader) { + super(port, loader, OperationModel::getInputBodyPart, o -> of(o.getInputMessage())); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/InputBodyMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/InputBodyMetadataResolver.java new file mode 100644 index 00000000..52e85cca --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/InputBodyMetadataResolver.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.TypeLoader; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; + +/** + * {@link BodyMetadataResolver} implementation for the output soap body. + * + * @since 1.0 + */ +public final class InputBodyMetadataResolver extends BodyMetadataResolver { + + InputBodyMetadataResolver(PortModel operations, TypeLoader loader) { + super(operations, loader, OperationModel::getInputBodyPart); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/InputHeadersMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/InputHeadersMetadataResolver.java new file mode 100644 index 00000000..4591cc3a --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/InputHeadersMetadataResolver.java @@ -0,0 +1,26 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.TypeLoader; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.WsdlModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; + +/** + * {@link HeadersMetadataResolver} implementation for input headers metadata. + * + * @since 1.0 + */ +public class InputHeadersMetadataResolver extends HeadersMetadataResolver { + + public InputHeadersMetadataResolver(WsdlModel wsdl, PortModel port, TypeLoader loader) { + super(wsdl, port, loader, OperationModel::getInputMessage, OperationModel::getInputHeaders); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/NodeMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/NodeMetadataResolver.java new file mode 100644 index 00000000..74c1dfd6 --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/NodeMetadataResolver.java @@ -0,0 +1,79 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import static java.lang.String.format; +import static org.mule.metadata.api.model.MetadataFormat.XML; +import static org.mule.runtime.api.metadata.resolving.FailureCode.INVALID_CONFIGURATION; +import static org.mule.runtime.api.metadata.resolving.FailureCode.INVALID_METADATA_KEY; +import static org.mule.runtime.api.metadata.resolving.FailureCode.UNKNOWN; +import static org.mule.wsdl.parser.model.operation.OperationType.ONE_WAY; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.builder.BaseTypeBuilder; +import org.mule.metadata.api.model.MetadataType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +import javax.wsdl.Part; + +/** + * Base class for metadata resolvers that resolve dynamic metadata of XML node elements. + * + * @since 1.0 + */ +abstract class NodeMetadataResolver { + + final PortModel port; + final BaseTypeBuilder typeBuilder = BaseTypeBuilder.create(XML); + final MetadataType nullType = typeBuilder.nullType().build(); + final TypeLoader loader; + final Function> bodyPartRetriever; + + NodeMetadataResolver(PortModel port, + TypeLoader loader, + Function> bodyPartRetriever) { + this.port = port; + this.loader = loader; + this.bodyPartRetriever = bodyPartRetriever; + } + + /** + * Resolves the metadata for an operation, Input or Output is fetched depending on the {@link Function} passed as parameter. + * + * @param operation the name of the operation that the types are going to be resolved. + * @throws MetadataResolvingException in any error case. + */ + abstract MetadataType getMetadata(String operation) throws MetadataResolvingException; + + MetadataType buildPartMetadataType(Part part) throws MetadataResolvingException { + if (part.getElementName() != null) { + String partName = part.getElementName().toString(); + return loader.load(partName) + .orElseThrow(() -> new MetadataResolvingException(format("Could not load part element name [%s]", partName), UNKNOWN)); + } + throw new MetadataResolvingException("Trying to resolve metadata for a nameless part, probably the provided WSDL is invalid", + INVALID_CONFIGURATION); + } + + Part getBodyPart(String operation) throws MetadataResolvingException { + return bodyPartRetriever.apply(port.getOperation(operation)) + .orElseThrow(() -> { + String errorMsg = "No body type found for operation [" + operation + "]"; + return new MetadataResolvingException(errorMsg, INVALID_METADATA_KEY); + }); + } + + boolean isOneWay(String operationName) { + return ONE_WAY.equals(port.getOperation(operationName).getType()); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/OutputAttachmentsMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/OutputAttachmentsMetadataResolver.java new file mode 100644 index 00000000..d13ed4bd --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/OutputAttachmentsMetadataResolver.java @@ -0,0 +1,38 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.model.MetadataType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.operation.OperationModel; +import org.mule.wsdl.parser.model.operation.OperationType; + +import java.util.Map; +import java.util.Optional; + +import static java.util.Optional.empty; +import static java.util.Optional.of; +import static org.mule.wsdl.parser.model.operation.OperationType.ONE_WAY; + +/** + * {@link AttachmentsMetadataResolver} implementation for the output attachments. + * + * @since 1.0 + */ +final class OutputAttachmentsMetadataResolver extends AttachmentsMetadataResolver { + + OutputAttachmentsMetadataResolver(PortModel port, TypeLoader loader) { + super(port, loader, OperationModel::getOutputBodyPart, o -> o.getType().equals(ONE_WAY) ? empty() : of(o.getOutputMessage())); + } + + @Override + public MetadataType getMetadata(String operation) throws MetadataResolvingException { + return isOneWay(operation) ? nullType : super.getMetadata(operation); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/OutputBodyMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/OutputBodyMetadataResolver.java new file mode 100644 index 00000000..e73a8f62 --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/OutputBodyMetadataResolver.java @@ -0,0 +1,32 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.model.MetadataType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; + +/** + * {@link BodyMetadataResolver} implementation for the output soap body. + * + * @since 1.0 + */ +final class OutputBodyMetadataResolver extends BodyMetadataResolver { + + OutputBodyMetadataResolver(PortModel definition, TypeLoader loader) { + super(definition, loader, OperationModel::getOutputBodyPart); + } + + @Override + public MetadataType getMetadata(String operation) throws MetadataResolvingException { + return isOneWay(operation) ? nullType : super.getMetadata(operation); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/OutputHeadersMetadataResolver.java b/src/main/java/org/mule/service/soap/metadata/OutputHeadersMetadataResolver.java new file mode 100644 index 00000000..f80c8351 --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/OutputHeadersMetadataResolver.java @@ -0,0 +1,33 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.TypeLoader; +import org.mule.metadata.api.model.MetadataType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.wsdl.parser.model.PortModel; +import org.mule.wsdl.parser.model.WsdlModel; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; + +/** + * {@link HeadersMetadataResolver} implementation for output headers metadata. + * + * @since 1.0 + */ +public class OutputHeadersMetadataResolver extends HeadersMetadataResolver { + + OutputHeadersMetadataResolver(WsdlModel wsdl, PortModel port, TypeLoader loader) { + super(wsdl, port, loader, OperationModel::getOutputMessage, OperationModel::getOutputHeaders); + } + + @Override + public MetadataType getMetadata(String operation) throws MetadataResolvingException { + return isOneWay(operation) ? nullType : super.getMetadata(operation); + } +} diff --git a/src/main/java/org/mule/service/soap/metadata/ServiceOperationsResolver.java b/src/main/java/org/mule/service/soap/metadata/ServiceOperationsResolver.java new file mode 100644 index 00000000..f5f972df --- /dev/null +++ b/src/main/java/org/mule/service/soap/metadata/ServiceOperationsResolver.java @@ -0,0 +1,30 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import org.mule.metadata.api.model.MetadataType; +import org.mule.wsdl.parser.model.PortModel; + +import java.util.Set; + +/** + * Handles the dynamic {@link MetadataType} resolution for the SOAP Body parts of a web service operation. + * + * @since 1.0 + */ +final class ServiceOperationsResolver { + + private final PortModel port; + + public ServiceOperationsResolver(PortModel port) { + this.port = port; + } + + Set getAvailableOperations() { + return port.getOperationsMap().keySet(); + } +} diff --git a/src/main/java/org/mule/service/soap/provider/SoapServiceProvider.java b/src/main/java/org/mule/service/soap/provider/SoapServiceProvider.java new file mode 100644 index 00000000..520787f5 --- /dev/null +++ b/src/main/java/org/mule/service/soap/provider/SoapServiceProvider.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.provider; + +import org.mule.runtime.api.service.ServiceDefinition; +import org.mule.runtime.api.service.ServiceProvider; +import org.mule.runtime.soap.api.SoapService; +import org.mule.service.soap.SoapServiceImplementation; + +/** + * {@link ServiceProvider} implementation for providing a mule {@link SoapService}. + * + * @since 1.0 + */ +public class SoapServiceProvider implements ServiceProvider { + + @Override + public ServiceDefinition getServiceDefinition() { + return new ServiceDefinition(SoapService.class, new SoapServiceImplementation()); + } +} diff --git a/src/main/java/org/mule/service/soap/security/SecurityStrategyCxfAdapter.java b/src/main/java/org/mule/service/soap/security/SecurityStrategyCxfAdapter.java new file mode 100644 index 00000000..f743fd49 --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/SecurityStrategyCxfAdapter.java @@ -0,0 +1,54 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security; + + +import org.mule.service.soap.security.callback.WSPasswordCallbackHandler; + +import java.util.Map; +import java.util.Optional; + +/** + * Base contract for objects that adds a level of security to the SOAP Protocol by preparing a set of CXF properties. + *

+ * All securities have an Action Name and a Type (Whether should be applied to the SOAP request or SOAP response), and returns a + * set of properties that needs to be set in the client to make it work. + * + * @since 1.0 + */ +public interface SecurityStrategyCxfAdapter { + + /** + * Returns the security action name that is going to be executed in the request phase (OUT interceptors). + * + * @return the request action name of {@code this} security strategy. + */ + String securityAction(); + + /** + * Returns the type of the security strategy, if applies for the request or the response. + * + * @return whether is the security strategy applies for the request or the response. + */ + SecurityStrategyType securityType(); + + /** + * Returns a set of properties to be set on the SOAP request interceptors (OUT interceptors) in order to applies {@code this} + * security strategy. + * + * @return a {@link Map} with the properties required to apply the security strategy. + */ + Map buildSecurityProperties(); + + /** + * Gives the option to return a custom {@link WSPasswordCallbackHandler} instance allowing to compose many password handlers + * from different security strategies. + * + * @return an optional {@link WSPasswordCallbackHandler} to be added to the composite callback handler. + */ + Optional buildPasswordCallbackHandler(); +} diff --git a/src/main/java/org/mule/service/soap/security/SecurityStrategyType.java b/src/main/java/org/mule/service/soap/security/SecurityStrategyType.java new file mode 100644 index 00000000..a28239e9 --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/SecurityStrategyType.java @@ -0,0 +1,28 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security; + + +/** + * Different types of {@link SecurityStrategyCxfAdapter} that specify when a strategy should be applied to a message. + * + * @since 1.0 + */ +public enum SecurityStrategyType { + + /** + * For configurations that should be applied to incoming (response) messages. This configuration type is used for decrypting and + * verifying the signature of incoming messages. + */ + INCOMING, + + /** + * For configurations that should be applied to outgoing (request) messages. This configuration type is used for encryption, + * signing and adding SAML, timestamp and username headers. + */ + OUTGOING +} diff --git a/src/main/java/org/mule/service/soap/security/WssDecryptSecurityStrategyCxfAdapter.java b/src/main/java/org/mule/service/soap/security/WssDecryptSecurityStrategyCxfAdapter.java new file mode 100644 index 00000000..676ba7c4 --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/WssDecryptSecurityStrategyCxfAdapter.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security; + +import static java.util.Optional.of; +import static org.apache.wss4j.common.ConfigurationConstants.DEC_PROP_REF_ID; +import static org.apache.wss4j.common.ConfigurationConstants.ENCRYPT; +import static org.apache.wss4j.common.ext.WSPasswordCallback.DECRYPT; + +import org.mule.runtime.extension.api.soap.security.config.WssKeyStoreConfiguration; +import org.mule.service.soap.security.callback.WSPasswordCallbackHandler; +import org.mule.service.soap.security.config.WssKeyStoreConfigurationPropertiesBuilder; + +import com.google.common.collect.ImmutableMap; + +import java.util.Map; +import java.util.Optional; + +/** + * Decrypts an encrypted SOAP response, using the private key of the key-store in the provided TLS context. + * + * @since 1.0 + */ +public class WssDecryptSecurityStrategyCxfAdapter implements SecurityStrategyCxfAdapter { + + private static final String WS_DECRYPT_PROPERTIES_KEY = "decryptProperties"; + + /** + * The keystore to use when decrypting the message. + */ + private WssKeyStoreConfigurationPropertiesBuilder keyStoreConfiguration; + + public WssDecryptSecurityStrategyCxfAdapter(WssKeyStoreConfiguration keyStoreConfiguration) { + this.keyStoreConfiguration = new WssKeyStoreConfigurationPropertiesBuilder(keyStoreConfiguration); + } + + @Override + public SecurityStrategyType securityType() { + return SecurityStrategyType.INCOMING; + } + + @Override + public String securityAction() { + return ENCRYPT; + } + + @Override + public Optional buildPasswordCallbackHandler() { + return of(new WSPasswordCallbackHandler(DECRYPT, cb -> cb.setPassword(keyStoreConfiguration.getKeyPassword()))); + } + + @Override + public Map buildSecurityProperties() { + return ImmutableMap.builder() + .put(DEC_PROP_REF_ID, WS_DECRYPT_PROPERTIES_KEY) + .put(WS_DECRYPT_PROPERTIES_KEY, keyStoreConfiguration.getConfigurationProperties()) + .build(); + } +} diff --git a/src/main/java/org/mule/service/soap/security/WssEncryptSecurityStrategyCxfAdapter.java b/src/main/java/org/mule/service/soap/security/WssEncryptSecurityStrategyCxfAdapter.java new file mode 100644 index 00000000..a28cffdb --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/WssEncryptSecurityStrategyCxfAdapter.java @@ -0,0 +1,57 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security; + + +import static org.apache.wss4j.common.ConfigurationConstants.ENCRYPT; +import static org.apache.wss4j.common.ConfigurationConstants.ENCRYPTION_USER; +import static org.apache.wss4j.common.ConfigurationConstants.ENC_PROP_REF_ID; + +import org.mule.runtime.extension.api.soap.security.config.WssKeyStoreConfiguration; +import org.mule.service.soap.security.callback.WSPasswordCallbackHandler; +import org.mule.service.soap.security.config.WssKeyStoreConfigurationPropertiesBuilder; +import com.google.common.collect.ImmutableMap; +import java.util.Map; + +/** + * Verifies the signature of a SOAP response, using certificates of the trust-store in the provided TLS context. + * + * @since 1.0 + */ +public class WssEncryptSecurityStrategyCxfAdapter implements SecurityStrategyCxfAdapter { + + private static final String WS_ENCRYPT_PROPERTIES_KEY = "encryptProperties"; + + private WssKeyStoreConfigurationPropertiesBuilder keyStoreConfiguration; + + public WssEncryptSecurityStrategyCxfAdapter(WssKeyStoreConfiguration keyStoreConfiguration) { + this.keyStoreConfiguration = new WssKeyStoreConfigurationPropertiesBuilder(keyStoreConfiguration); + } + + @Override + public SecurityStrategyType securityType() { + return SecurityStrategyType.OUTGOING; + } + + @Override + public String securityAction() { + return ENCRYPT; + } + + @Override + public java.util.Optional buildPasswordCallbackHandler() { + return java.util.Optional.empty(); + } + + @Override + public Map buildSecurityProperties() { + return ImmutableMap.builder().put(ENC_PROP_REF_ID, WS_ENCRYPT_PROPERTIES_KEY) + .put(WS_ENCRYPT_PROPERTIES_KEY, keyStoreConfiguration.getConfigurationProperties()) + .put(ENCRYPTION_USER, keyStoreConfiguration.getAlias()) + .build(); + } +} diff --git a/src/main/java/org/mule/service/soap/security/WssSignSecurityStrategyCxfAdapter.java b/src/main/java/org/mule/service/soap/security/WssSignSecurityStrategyCxfAdapter.java new file mode 100644 index 00000000..6c223625 --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/WssSignSecurityStrategyCxfAdapter.java @@ -0,0 +1,64 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security; + +import static java.util.Optional.of; +import static org.apache.wss4j.common.ConfigurationConstants.SIGNATURE_USER; +import static org.apache.wss4j.common.ConfigurationConstants.SIG_PROP_REF_ID; +import static org.apache.wss4j.common.ext.WSPasswordCallback.SIGNATURE; + +import org.mule.runtime.extension.api.soap.security.config.WssKeyStoreConfiguration; +import org.mule.service.soap.security.callback.WSPasswordCallbackHandler; +import org.mule.service.soap.security.config.WssKeyStoreConfigurationPropertiesBuilder; +import com.google.common.collect.ImmutableMap; +import org.apache.wss4j.dom.handler.WSHandlerConstants; +import java.util.Map; +import java.util.Optional; + + +/** + * Signs the SOAP request that is being sent, using the private key of the key-store in the provided TLS context. + * + * @since 1.0 + */ +public class WssSignSecurityStrategyCxfAdapter implements SecurityStrategyCxfAdapter { + + private static final String WS_SIGN_PROPERTIES_KEY = "signProperties"; + + /** + * The keystore to use when signing the message. + */ + private final WssKeyStoreConfigurationPropertiesBuilder keyStoreConfiguration; + + public WssSignSecurityStrategyCxfAdapter(WssKeyStoreConfiguration keyStoreConfiguration) { + this.keyStoreConfiguration = new WssKeyStoreConfigurationPropertiesBuilder(keyStoreConfiguration); + } + + @Override + public SecurityStrategyType securityType() { + return SecurityStrategyType.OUTGOING; + } + + @Override + public Optional buildPasswordCallbackHandler() { + return of(new WSPasswordCallbackHandler(SIGNATURE, cb -> cb.setPassword(keyStoreConfiguration.getPassword()))); + } + + @Override + public String securityAction() { + return WSHandlerConstants.SIGNATURE; + } + + @Override + public Map buildSecurityProperties() { + return ImmutableMap.builder() + .put(SIG_PROP_REF_ID, WS_SIGN_PROPERTIES_KEY) + .put(WS_SIGN_PROPERTIES_KEY, keyStoreConfiguration.getConfigurationProperties()) + .put(SIGNATURE_USER, keyStoreConfiguration.getAlias()) + .build(); + } +} diff --git a/src/main/java/org/mule/service/soap/security/WssTimestampSecurityStrategyCxfAdapter.java b/src/main/java/org/mule/service/soap/security/WssTimestampSecurityStrategyCxfAdapter.java new file mode 100644 index 00000000..493607c7 --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/WssTimestampSecurityStrategyCxfAdapter.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security; + +import static java.util.Optional.empty; +import static org.apache.wss4j.common.ConfigurationConstants.TIMESTAMP; +import static org.apache.wss4j.common.ConfigurationConstants.TTL_TIMESTAMP; + +import org.mule.service.soap.security.callback.WSPasswordCallbackHandler; +import com.google.common.collect.ImmutableMap; +import java.util.Map; + +/** + * Bundles the outgoing SOAP message that it's being built with a timestamp that carries the creation. + * + * @since 1.0 + */ +public class WssTimestampSecurityStrategyCxfAdapter implements SecurityStrategyCxfAdapter { + + /** + * The time difference between creation and expiry time in seconds. After this time the message is invalid. + */ + private long timeToLiveInSeconds; + + public WssTimestampSecurityStrategyCxfAdapter(long timeToLeaveInSeconds) { + this.timeToLiveInSeconds = timeToLeaveInSeconds; + } + + + @Override + public SecurityStrategyType securityType() { + return SecurityStrategyType.OUTGOING; + } + + @Override + public java.util.Optional buildPasswordCallbackHandler() { + return empty(); + } + + @Override + public String securityAction() { + return TIMESTAMP; + } + + @Override + public Map buildSecurityProperties() { + return ImmutableMap.builder().put(TTL_TIMESTAMP, String.valueOf(timeToLiveInSeconds)).build(); + } +} diff --git a/src/main/java/org/mule/service/soap/security/WssUsernameTokenSecurityStrategyCxfAdapter.java b/src/main/java/org/mule/service/soap/security/WssUsernameTokenSecurityStrategyCxfAdapter.java new file mode 100644 index 00000000..4c31279c --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/WssUsernameTokenSecurityStrategyCxfAdapter.java @@ -0,0 +1,95 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security; + +import static java.util.Optional.of; +import static org.apache.wss4j.common.ConfigurationConstants.ADD_USERNAMETOKEN_CREATED; +import static org.apache.wss4j.common.ConfigurationConstants.ADD_USERNAMETOKEN_NONCE; +import static org.apache.wss4j.common.ConfigurationConstants.USER; +import static org.apache.wss4j.common.ext.WSPasswordCallback.USERNAME_TOKEN; +import static org.apache.wss4j.dom.WSConstants.CREATED_LN; +import static org.apache.wss4j.dom.WSConstants.NONCE_LN; +import static org.apache.wss4j.dom.message.token.UsernameToken.PASSWORD_TYPE; + +import org.mule.runtime.extension.api.soap.security.PasswordType; +import org.mule.runtime.extension.api.soap.security.UsernameTokenSecurityStrategy; +import org.mule.service.soap.security.callback.WSPasswordCallbackHandler; +import com.google.common.collect.ImmutableMap; +import org.apache.wss4j.dom.handler.WSHandlerConstants; +import java.util.Map; +import java.util.StringJoiner; + + +/** + * Provides the capability to authenticate using Username and Password with a SOAP service by adding the UsernameToken element in + * the SOAP request. + * + * @since 1.0 + */ +public class WssUsernameTokenSecurityStrategyCxfAdapter implements SecurityStrategyCxfAdapter { + + /** + * The username required to authenticate with the service. + */ + private String username; + + /** + * The password for the provided username required to authenticate with the service. + */ + private String password; + + /** + * A {@link PasswordType} which qualifies the {@link #password} parameter. + */ + private PasswordType passwordType; + + /** + * Specifies a if a cryptographically random nonce should be added to the message. + */ + private boolean addNonce; + + /** + * Specifies if a timestamp should be created to indicate the creation time of the message. + */ + private boolean addCreated; + + public WssUsernameTokenSecurityStrategyCxfAdapter(UsernameTokenSecurityStrategy usernameToken) { + this.addCreated = usernameToken.isAddCreated(); + this.addNonce = usernameToken.isAddNonce(); + this.password = usernameToken.getPassword(); + this.username = usernameToken.getUsername(); + this.passwordType = usernameToken.getPasswordType(); + } + + public SecurityStrategyType securityType() { + return SecurityStrategyType.OUTGOING; + } + + @Override + public java.util.Optional buildPasswordCallbackHandler() { + return of(new WSPasswordCallbackHandler(USERNAME_TOKEN, + cb -> { + if (cb.getIdentifier().equals(username)) { + cb.setPassword(password); + } + })); + } + + @Override + public String securityAction() { + return WSHandlerConstants.USERNAME_TOKEN; + } + + @Override + public Map buildSecurityProperties() { + return ImmutableMap.builder() + .put(USER, username) + .put(PASSWORD_TYPE, passwordType.getType()) + .put(ADD_USERNAMETOKEN_NONCE, String.valueOf(addNonce)) + .put(ADD_USERNAMETOKEN_CREATED, String.valueOf(addNonce)).build(); + } +} diff --git a/src/main/java/org/mule/service/soap/security/WssVerifySignatureSecurityStrategyCxfAdapter.java b/src/main/java/org/mule/service/soap/security/WssVerifySignatureSecurityStrategyCxfAdapter.java new file mode 100644 index 00000000..6660ed58 --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/WssVerifySignatureSecurityStrategyCxfAdapter.java @@ -0,0 +1,79 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security; + + +import static org.apache.wss4j.common.ConfigurationConstants.SIGNATURE; +import static org.apache.wss4j.common.ConfigurationConstants.SIG_PROP_REF_ID; +import static org.apache.wss4j.common.crypto.Merlin.LOAD_CA_CERTS; +import static org.mule.service.soap.security.config.WssStoreConfigurationPropertiesBuilder.WS_CRYPTO_PROVIDER_KEY; + +import org.mule.runtime.extension.api.soap.security.config.WssTrustStoreConfiguration; +import org.mule.service.soap.security.callback.WSPasswordCallbackHandler; +import org.mule.service.soap.security.config.WssStoreConfigurationPropertiesBuilder; +import org.mule.service.soap.security.config.WssTrustStoreConfigurationPropertiesBuilder; +import com.google.common.collect.ImmutableMap; +import org.apache.wss4j.common.crypto.Merlin; +import java.util.Map; +import java.util.Properties; + + +/** + * Verifies the signature of a SOAP response, using certificates of the trust-store in the provided TLS context. + * + * @since 1.0 + */ +public class WssVerifySignatureSecurityStrategyCxfAdapter implements SecurityStrategyCxfAdapter { + + private static final String WS_VERIFY_SIGNATURE_PROPERTIES_KEY = "verifySignatureProperties"; + + /** + * The truststore to use to verify the signature. + */ + private final WssTrustStoreConfigurationPropertiesBuilder trustStoreConfiguration; + + public WssVerifySignatureSecurityStrategyCxfAdapter(WssTrustStoreConfiguration trustStoreConfiguration) { + this.trustStoreConfiguration = new WssTrustStoreConfigurationPropertiesBuilder(trustStoreConfiguration); + } + + public WssVerifySignatureSecurityStrategyCxfAdapter() { + this.trustStoreConfiguration = null; + } + + @Override + public SecurityStrategyType securityType() { + return SecurityStrategyType.INCOMING; + } + + @Override + public java.util.Optional buildPasswordCallbackHandler() { + return java.util.Optional.empty(); + } + + @Override + public String securityAction() { + return SIGNATURE; + } + + @Override + public Map buildSecurityProperties() { + Properties signatureProps = trustStoreConfiguration != null ? trustStoreConfiguration.getConfigurationProperties() + : getDefaultTrustStoreConfigurationProperties(); + + return ImmutableMap.builder() + .put(SIG_PROP_REF_ID, WS_VERIFY_SIGNATURE_PROPERTIES_KEY) + .put(WS_VERIFY_SIGNATURE_PROPERTIES_KEY, signatureProps) + .build(); + } + + private Properties getDefaultTrustStoreConfigurationProperties() { + Properties properties = new Properties(); + properties.setProperty(WS_CRYPTO_PROVIDER_KEY, Merlin.class.getCanonicalName()); + properties.setProperty(LOAD_CA_CERTS, String.valueOf(true)); + return properties; + } +} diff --git a/src/main/java/org/mule/service/soap/security/callback/CompositeCallbackHandler.java b/src/main/java/org/mule/service/soap/security/callback/CompositeCallbackHandler.java new file mode 100644 index 00000000..80e71dbc --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/callback/CompositeCallbackHandler.java @@ -0,0 +1,36 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security.callback; + +import java.io.IOException; +import java.util.List; + +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; + +/** + * Callback handler implementation that delegates the handle operation to a list of callback handlers. This allows to compose + * multiple callback handler implementations to handle different types of callbacks. + * + * @since 1.0 + */ +public class CompositeCallbackHandler implements CallbackHandler { + + private final List callbackHandlers; + + public CompositeCallbackHandler(List callbackHandlers) { + this.callbackHandlers = callbackHandlers; + } + + @Override + public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { + for (CallbackHandler callbackHandler : callbackHandlers) { + callbackHandler.handle(callbacks); + } + } +} diff --git a/src/main/java/org/mule/service/soap/security/callback/WSPasswordCallbackHandler.java b/src/main/java/org/mule/service/soap/security/callback/WSPasswordCallbackHandler.java new file mode 100644 index 00000000..9cf4b035 --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/callback/WSPasswordCallbackHandler.java @@ -0,0 +1,47 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security.callback; + +import org.apache.wss4j.common.ext.WSPasswordCallback; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; +import java.io.IOException; +import java.util.function.Consumer; +import java.util.stream.Stream; + + +/** + * Abstract implementation of {@link CallbackHandler} that only handles instances of {@link WSPasswordCallback} with a specific + * usage. + * + * @since 1.0 + */ +public class WSPasswordCallbackHandler implements CallbackHandler { + + private final int usage; + private final Consumer handler; + + /** + * Creates a new instance. + * + * @param usage A constant from {@link WSPasswordCallback} indicating the usage of this callback. + * @param handler {@link Consumer} that handles a {@link WSPasswordCallback}. This function will be called with the password + * callback that matches the {@code usage} also provided. + */ + public WSPasswordCallbackHandler(int usage, Consumer handler) { + this.usage = usage; + this.handler = handler; + } + + @Override + public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { + Stream.of(callbacks) + .filter(callback -> callback instanceof WSPasswordCallback && ((WSPasswordCallback) callback).getUsage() == usage) + .forEach(callback -> handler.accept((WSPasswordCallback) callback)); + } +} diff --git a/src/main/java/org/mule/service/soap/security/config/WssKeyStoreConfigurationPropertiesBuilder.java b/src/main/java/org/mule/service/soap/security/config/WssKeyStoreConfigurationPropertiesBuilder.java new file mode 100644 index 00000000..e0e466d2 --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/config/WssKeyStoreConfigurationPropertiesBuilder.java @@ -0,0 +1,71 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security.config; + +import static org.apache.wss4j.common.crypto.Merlin.KEYSTORE_ALIAS; +import static org.apache.wss4j.common.crypto.Merlin.KEYSTORE_FILE; +import static org.apache.wss4j.common.crypto.Merlin.KEYSTORE_PASSWORD; +import static org.apache.wss4j.common.crypto.Merlin.KEYSTORE_PRIVATE_PASSWORD; +import static org.apache.wss4j.common.crypto.Merlin.KEYSTORE_TYPE; + +import org.mule.runtime.extension.api.soap.security.config.WssKeyStoreConfiguration; +import org.apache.wss4j.common.crypto.Merlin; +import java.util.Properties; + +/** + * Default {@link WssStoreConfigurationPropertiesBuilder} implementation for Key Stores, used for encryption, decryption and + * signing. + * + * @since 1.0 + */ +public class WssKeyStoreConfigurationPropertiesBuilder implements WssStoreConfigurationPropertiesBuilder { + + private String alias; + private String keyPassword; + private String password; + private String keyStorePath; + private String type; + + public WssKeyStoreConfigurationPropertiesBuilder(WssKeyStoreConfiguration keyStoreConfiguration) { + this.alias = keyStoreConfiguration.getAlias(); + this.keyPassword = keyStoreConfiguration.getKeyPassword(); + this.password = keyStoreConfiguration.getPassword(); + this.keyStorePath = keyStoreConfiguration.getStorePath(); + this.type = keyStoreConfiguration.getType(); + } + + /** + * {@inheritDoc} + */ + @Override + public Properties getConfigurationProperties() { + Properties properties = new Properties(); + properties.setProperty(WS_CRYPTO_PROVIDER_KEY, Merlin.class.getCanonicalName()); + properties.setProperty(MERLIN_PROP_PREFIX + KEYSTORE_TYPE, type); + properties.setProperty(MERLIN_PROP_PREFIX + KEYSTORE_PASSWORD, password); + properties.setProperty(MERLIN_PROP_PREFIX + KEYSTORE_ALIAS, alias); + properties.setProperty(MERLIN_PROP_PREFIX + KEYSTORE_FILE, keyStorePath); + + if (keyPassword != null) { + properties.setProperty(KEYSTORE_PRIVATE_PASSWORD, keyPassword); + } + + return properties; + } + + public String getKeyPassword() { + return keyPassword; + } + + public String getAlias() { + return alias; + } + + public String getPassword() { + return password; + } +} diff --git a/src/main/java/org/mule/service/soap/security/config/WssStoreConfigurationPropertiesBuilder.java b/src/main/java/org/mule/service/soap/security/config/WssStoreConfigurationPropertiesBuilder.java new file mode 100644 index 00000000..6d8520fb --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/config/WssStoreConfigurationPropertiesBuilder.java @@ -0,0 +1,43 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security.config; + + +import org.mule.service.soap.security.SecurityStrategyCxfAdapter; + +import java.util.Properties; + +/** + * Base contract for Security Stores that prepares additional properties for CXF in order to apply some kind of Web Service + * Security. + *

+ * See https://ws.apache.org/wss4j/config.html. + * + * @since 1.0 + */ +public interface WssStoreConfigurationPropertiesBuilder { + + /** + * Prefix for all WSS4J crypto properties + */ + String WSS4J_PROP_PREFIX = "org.apache.wss4j.crypto"; + + /** + * Prefix for all merlin crypto specific properties + */ + String MERLIN_PROP_PREFIX = WSS4J_PROP_PREFIX + ".merlin."; + + /** + * WSS4J property name to specify a provider used to create Crypto instances. + */ + String WS_CRYPTO_PROVIDER_KEY = WSS4J_PROP_PREFIX + ".provider"; + + /** + * @return a set of {@link Properties} to configure a {@link SecurityStrategyCxfAdapter}. + */ + Properties getConfigurationProperties(); +} diff --git a/src/main/java/org/mule/service/soap/security/config/WssTrustStoreConfigurationPropertiesBuilder.java b/src/main/java/org/mule/service/soap/security/config/WssTrustStoreConfigurationPropertiesBuilder.java new file mode 100644 index 00000000..86ba677b --- /dev/null +++ b/src/main/java/org/mule/service/soap/security/config/WssTrustStoreConfigurationPropertiesBuilder.java @@ -0,0 +1,47 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.security.config; + +import static org.apache.wss4j.common.crypto.Merlin.TRUSTSTORE_FILE; +import static org.apache.wss4j.common.crypto.Merlin.TRUSTSTORE_PASSWORD; +import static org.apache.wss4j.common.crypto.Merlin.TRUSTSTORE_TYPE; + +import org.mule.runtime.extension.api.soap.security.config.WssTrustStoreConfiguration; +import org.apache.wss4j.common.crypto.Merlin; +import java.util.Properties; + + +/** + * Default {@link WssStoreConfigurationPropertiesBuilder} implementation for Trust Stores, used for signature verification. + * + * @since 1.0 + */ +public class WssTrustStoreConfigurationPropertiesBuilder implements WssStoreConfigurationPropertiesBuilder { + + private String trustStorePath; + private String password; + private String type; + + public WssTrustStoreConfigurationPropertiesBuilder(WssTrustStoreConfiguration trustStoreConfiguration) { + this.password = trustStoreConfiguration.getPassword(); + this.trustStorePath = trustStoreConfiguration.getStorePath(); + this.type = trustStoreConfiguration.getType(); + } + + /** + * {@inheritDoc} + */ + @Override + public Properties getConfigurationProperties() { + Properties properties = new Properties(); + properties.setProperty(WS_CRYPTO_PROVIDER_KEY, Merlin.class.getCanonicalName()); + properties.setProperty(MERLIN_PROP_PREFIX + TRUSTSTORE_FILE, trustStorePath); + properties.setProperty(MERLIN_PROP_PREFIX + TRUSTSTORE_TYPE, type); + properties.setProperty(MERLIN_PROP_PREFIX + TRUSTSTORE_PASSWORD, password); + return properties; + } +} diff --git a/src/main/java/org/mule/service/soap/util/AttachmentsUtils.java b/src/main/java/org/mule/service/soap/util/AttachmentsUtils.java new file mode 100644 index 00000000..4fab7c78 --- /dev/null +++ b/src/main/java/org/mule/service/soap/util/AttachmentsUtils.java @@ -0,0 +1,64 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.util; + +import org.mule.runtime.api.metadata.MediaType; +import org.mule.service.soap.ds.ByteArrayDataSource; +import org.mule.service.soap.ds.InputStreamDataSource; +import org.mule.service.soap.ds.StringDataSource; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +import javax.activation.DataHandler; +import javax.activation.FileDataSource; + +public class AttachmentsUtils { + + /** + * Transforms an Object into a DataHandler of its corresponding type. + * + * @param name the name of the attachment being handled + * @param object the attachment to be handled + * @param contentType the Content-Type of the attachment that is being handled + * @return a {@link DataHandler} of the corresponding attachment + * @throws IOException if the transformation fails. + */ + public static DataHandler toDataHandler(String name, Object object, MediaType contentType) throws IOException { + DataHandler dh; + if (object instanceof File) { + if (contentType != null) { + dh = new DataHandler(new FileInputStream((File) object), contentType.toString()); + } else { + dh = new DataHandler(new FileDataSource((File) object)); + } + } else if (object instanceof URL) { + if (contentType != null) { + dh = new DataHandler(((URL) object).openStream(), contentType.toString()); + } else { + dh = new DataHandler((URL) object); + } + } else if (object instanceof String) { + if (contentType != null) { + dh = new DataHandler(new StringDataSource((String) object, name, contentType)); + } else { + dh = new DataHandler(new StringDataSource((String) object, name)); + } + } else if (object instanceof byte[] && contentType != null) { + dh = new DataHandler(new ByteArrayDataSource((byte[]) object, contentType, name)); + } else if (object instanceof InputStream && contentType != null) { + dh = new DataHandler(new InputStreamDataSource((InputStream) object, contentType, name)); + } else { + dh = new DataHandler(object, contentType != null ? contentType.toString() : null); + } + return dh; + } + +} diff --git a/src/main/java/org/mule/service/soap/util/SoapServiceMetadataTypeUtils.java b/src/main/java/org/mule/service/soap/util/SoapServiceMetadataTypeUtils.java new file mode 100644 index 00000000..c9ae7b21 --- /dev/null +++ b/src/main/java/org/mule/service/soap/util/SoapServiceMetadataTypeUtils.java @@ -0,0 +1,48 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.util; + +import static java.util.stream.Collectors.toList; +import static org.mule.metadata.api.utils.MetadataTypeUtils.isObjectType; +import org.mule.metadata.api.model.BinaryType; +import org.mule.metadata.api.model.MetadataType; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.metadata.api.model.ObjectType; +import org.mule.runtime.soap.api.SoapService; + +import java.util.Collection; +import java.util.List; + + +/** + * Utility class for handling XML {@link MetadataType}s on the {@link SoapService}. + * + * @since 1.0 + */ +public class SoapServiceMetadataTypeUtils { + + /** + * No accessible constructor. + */ + private SoapServiceMetadataTypeUtils() {} + + public static ObjectType getOperationType(MetadataType bodyType) { + if (isObjectType(bodyType)) { + Collection bodyFields = ((ObjectType) bodyType).getFields(); + if (bodyFields.size() == 1) { + // Contains only one field which represents de operation + return (ObjectType) bodyFields.iterator().next().getValue(); + } + } + throw new IllegalArgumentException("Could not find soap operation element in the provided body MetadataType"); + } + + public static List getAttachmentFields(MetadataType bodyType) { + Collection operationParams = getOperationType(bodyType).getFields(); + return operationParams.stream().filter(field -> field.getValue() instanceof BinaryType).collect(toList()); + } +} diff --git a/src/main/java/org/mule/service/soap/util/XmlTransformationException.java b/src/main/java/org/mule/service/soap/util/XmlTransformationException.java new file mode 100644 index 00000000..f64d478b --- /dev/null +++ b/src/main/java/org/mule/service/soap/util/XmlTransformationException.java @@ -0,0 +1,20 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.util; + + +/** + * {@link Exception} implementation that aims to be thrown when an XML transformation problem occur. + * + * @since 1.0 + */ +public class XmlTransformationException extends Exception { + + XmlTransformationException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/org/mule/service/soap/util/XmlTransformationUtils.java b/src/main/java/org/mule/service/soap/util/XmlTransformationUtils.java new file mode 100644 index 00000000..4ad5e278 --- /dev/null +++ b/src/main/java/org/mule/service/soap/util/XmlTransformationUtils.java @@ -0,0 +1,125 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.util; + +import static javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD; +import static javax.xml.XMLConstants.ACCESS_EXTERNAL_STYLESHEET; +import static javax.xml.stream.XMLInputFactory.IS_COALESCING; + +import org.mule.runtime.core.api.util.xmlsecurity.XMLSecureFactories; +import org.mule.runtime.soap.api.SoapService; +import org.mule.service.soap.xml.stax.StaxSource; + +import java.io.ByteArrayInputStream; +import java.io.StringReader; +import java.io.StringWriter; +import java.nio.charset.Charset; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamReader; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMResult; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import com.ctc.wstx.stax.WstxInputFactory; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.InputSource; + +import net.sf.saxon.jaxp.SaxonTransformerFactory; + +/** + * {@link SoapService} Transformation utility class + * + * @since 1.0 + */ +public class XmlTransformationUtils { + + private static final XMLInputFactory XML_INPUT_FACTORY = getXmlInputFactory(); + private static final TransformerFactory SAXON_TRANSFORMER_FACTORY; + + static { + final TransformerFactory factory = new SaxonTransformerFactory(); + factory.setAttribute(ACCESS_EXTERNAL_STYLESHEET, ""); + factory.setAttribute(ACCESS_EXTERNAL_DTD, ""); + SAXON_TRANSFORMER_FACTORY = factory; + } + + private static XMLInputFactory getXmlInputFactory() { + XMLInputFactory xmlInputFactory = new WstxInputFactory(); + // Preserve the CDATA tags + xmlInputFactory.setProperty(IS_COALESCING, false); + return xmlInputFactory; + } + + public static Document xmlStreamReaderToDocument(XMLStreamReader xmlStreamReader) throws XmlTransformationException { + StaxSource staxSource = new StaxSource(xmlStreamReader); + DOMResult writer = new DOMResult(); + try { + Transformer transformer = SAXON_TRANSFORMER_FACTORY.newTransformer(); + transformer.transform(staxSource, writer); + } catch (TransformerException e) { + throw new XmlTransformationException("Error transforming reader to DOM document", e); + } + return (Document) writer.getNode(); + } + + public static Element stringToDomElement(String xml) throws XmlTransformationException { + try { + DocumentBuilder db = XMLSecureFactories.createDefault().getDocumentBuilderFactory().newDocumentBuilder(); + InputSource is = new InputSource(); + is.setCharacterStream(new StringReader(xml)); + return db.parse(is).getDocumentElement(); + } catch (Exception e) { + throw new XmlTransformationException("Could not transform xml string to Dom Element", e); + } + } + + public static Document stringToDocument(String xml) throws XmlTransformationException { + DocumentBuilderFactory factory = XMLSecureFactories.createDefault().getDocumentBuilderFactory(); + try { + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + return builder.parse(new ByteArrayInputStream(xml.getBytes())); + } catch (Exception e) { + throw new XmlTransformationException("Could not transform xml to Dom Document", e); + } + } + + public static String nodeToString(Node node) throws XmlTransformationException { + try { + StringWriter writer = new StringWriter(); + DOMSource source = new DOMSource(node); + StreamResult result = new StreamResult(writer); + TransformerFactory idTransformer = SaxonTransformerFactory.newInstance(); + Transformer transformer = idTransformer.newTransformer(); + transformer.transform(source, result); + return writer.toString(); + } catch (Exception e) { + throw new XmlTransformationException("Could not transform Node to String", e); + } + } + + public static XMLStreamReader stringToXmlStreamReader(String xml) throws XmlTransformationException { + return stringToXmlStreamReader(xml, "UTF-8"); + } + + public static XMLStreamReader stringToXmlStreamReader(String xml, String encoding) throws XmlTransformationException { + try { + return XML_INPUT_FACTORY.createXMLStreamReader(new ByteArrayInputStream(xml.getBytes(Charset.forName(encoding)))); + } catch (Exception e) { + throw new XmlTransformationException("Could not transform xml to XmlStreamReader", e); + } + } +} diff --git a/src/main/java/org/mule/service/soap/xml/stax/DelegateXMLStreamReader.java b/src/main/java/org/mule/service/soap/xml/stax/DelegateXMLStreamReader.java new file mode 100644 index 00000000..f1e75dc3 --- /dev/null +++ b/src/main/java/org/mule/service/soap/xml/stax/DelegateXMLStreamReader.java @@ -0,0 +1,256 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.xml.stax; + +import javax.xml.namespace.NamespaceContext; +import javax.xml.namespace.QName; +import javax.xml.stream.Location; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +/** + * @since 1.0, Copied from the removed XML module. + */ +public class DelegateXMLStreamReader implements XMLStreamReader { + + private XMLStreamReader reader; + + public DelegateXMLStreamReader(XMLStreamReader reader) { + super(); + this.reader = reader; + } + + @Override + public void close() throws XMLStreamException { + reader.close(); + } + + @Override + public int getAttributeCount() { + return reader.getAttributeCount(); + } + + @Override + public String getAttributeLocalName(int arg0) { + return reader.getAttributeLocalName(arg0); + } + + @Override + public QName getAttributeName(int arg0) { + return reader.getAttributeName(arg0); + } + + @Override + public String getAttributeNamespace(int arg0) { + return reader.getAttributeNamespace(arg0); + } + + @Override + public String getAttributePrefix(int arg0) { + return reader.getAttributePrefix(arg0); + } + + @Override + public String getAttributeType(int arg0) { + return reader.getAttributeType(arg0); + } + + @Override + public String getAttributeValue(int arg0) { + return reader.getAttributeValue(arg0); + } + + @Override + public String getAttributeValue(String arg0, String arg1) { + return reader.getAttributeValue(arg0, arg1); + } + + @Override + public String getCharacterEncodingScheme() { + return reader.getCharacterEncodingScheme(); + } + + @Override + public String getElementText() throws XMLStreamException { + return reader.getElementText(); + } + + @Override + public String getEncoding() { + return reader.getEncoding(); + } + + @Override + public int getEventType() { + return reader.getEventType(); + } + + @Override + public String getLocalName() { + return reader.getLocalName(); + } + + @Override + public Location getLocation() { + return reader.getLocation(); + } + + @Override + public QName getName() { + return reader.getName(); + } + + @Override + public NamespaceContext getNamespaceContext() { + return reader.getNamespaceContext(); + } + + @Override + public int getNamespaceCount() { + return reader.getNamespaceCount(); + } + + @Override + public String getNamespacePrefix(int arg0) { + return reader.getNamespacePrefix(arg0); + } + + @Override + public String getNamespaceURI() { + return reader.getNamespaceURI(); + } + + @Override + public String getNamespaceURI(int arg0) { + return reader.getNamespaceURI(arg0); + } + + @Override + public String getNamespaceURI(String arg0) { + return reader.getNamespaceURI(arg0); + } + + @Override + public String getPIData() { + return reader.getPIData(); + } + + @Override + public String getPITarget() { + return reader.getPITarget(); + } + + @Override + public String getPrefix() { + return reader.getPrefix(); + } + + @Override + public Object getProperty(String arg0) throws IllegalArgumentException { + return reader.getProperty(arg0); + } + + @Override + public String getText() { + return reader.getText(); + } + + @Override + public char[] getTextCharacters() { + return reader.getTextCharacters(); + } + + @Override + public int getTextCharacters(int arg0, char[] arg1, int arg2, int arg3) throws XMLStreamException { + return reader.getTextCharacters(arg0, arg1, arg2, arg3); + } + + @Override + public int getTextLength() { + return reader.getTextLength(); + } + + @Override + public int getTextStart() { + return reader.getTextStart(); + } + + @Override + public String getVersion() { + return reader.getVersion(); + } + + @Override + public boolean hasName() { + return reader.hasName(); + } + + @Override + public boolean hasNext() throws XMLStreamException { + return reader.hasNext(); + } + + @Override + public boolean hasText() { + return reader.hasText(); + } + + @Override + public boolean isAttributeSpecified(int arg0) { + return reader.isAttributeSpecified(arg0); + } + + @Override + public boolean isCharacters() { + return reader.isCharacters(); + } + + @Override + public boolean isEndElement() { + return reader.isEndElement(); + } + + @Override + public boolean isStandalone() { + return reader.isStandalone(); + } + + @Override + public boolean isStartElement() { + return reader.isStartElement(); + } + + @Override + public boolean isWhiteSpace() { + return reader.isWhiteSpace(); + } + + @Override + public int next() throws XMLStreamException { + return reader.next(); + } + + @Override + public int nextTag() throws XMLStreamException { + return reader.nextTag(); + } + + @Override + public void require(int arg0, String arg1, String arg2) throws XMLStreamException { + reader.require(arg0, arg1, arg2); + } + + @Override + public boolean standaloneSet() { + return reader.standaloneSet(); + } + + public XMLStreamReader getDelegateReader() { + return reader; + } + +} diff --git a/src/main/java/org/mule/service/soap/xml/stax/StaxSource.java b/src/main/java/org/mule/service/soap/xml/stax/StaxSource.java new file mode 100755 index 00000000..d95dd2d9 --- /dev/null +++ b/src/main/java/org/mule/service/soap/xml/stax/StaxSource.java @@ -0,0 +1,210 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.xml.stax; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.xml.sax.ContentHandler; +import org.xml.sax.DTDHandler; +import org.xml.sax.EntityResolver; +import org.xml.sax.ErrorHandler; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.SAXParseException; +import org.xml.sax.XMLReader; +import org.xml.sax.ext.LexicalHandler; + +import javanet.staxutils.StAXReaderToContentHandler; +import javanet.staxutils.StAXSource; +import javanet.staxutils.helpers.XMLFilterImplEx; + +/** + * A StaxSource which gives us access to the underlying XMLStreamReader if we are StaxCapable down the line. + * + * @since 1.0, Copied from the removed XML module. + */ +public class StaxSource extends StAXSource { + + private XMLStreamReader reader; + + // StAX to SAX converter that will read from StAX and produce SAX + // this object will be wrapped by the XMLReader exposed to the client + protected final StAXReaderToContentHandler handler; + + // SAX allows ContentHandler to be changed during the parsing, + // but JAXB doesn't. So this repeater will sit between those + // two components. + protected XMLFilterImplEx repeater = new XMLFilterImplEx(); + + protected final XMLReader pseudoParser = new PseudoReader(); + + public StaxSource(XMLStreamReader reader) { + super(reader); + + this.reader = reader; + + this.handler = new XMLStreamReaderToContentHandler(reader, repeater); + + super.setXMLReader(pseudoParser); + // pass a dummy InputSource. We don't care + super.setInputSource(new InputSource()); + } + + public XMLStreamReader getXMLStreamReader() { + return reader; + } + + private final class PseudoReader implements XMLReader { + + // we will store this value but never use it by ourselves. + private EntityResolver entityResolver; + private DTDHandler dtdHandler; + private ErrorHandler errorHandler; + + @Override + public boolean getFeature(String name) throws SAXNotRecognizedException { + if ("http://xml.org/sax/features/namespaces".equals(name)) { + return true; + } else if ("http://xml.org/sax/features/namespace-prefixes".equals(name)) { + return repeater.getNamespacePrefixes(); + } else if ("http://xml.org/sax/features/external-general-entities".equals(name)) { + return true; + } else if ("http://xml.org/sax/features/external-parameter-entities".equals(name)) { + return true; + } + + throw new SAXNotRecognizedException(name); + } + + @Override + public void setFeature(String name, boolean value) throws SAXNotRecognizedException, SAXNotSupportedException { + if ("http://xml.org/sax/features/namespaces".equals(name)) { + // Presently we only support namespaces==true. [Issue 9] + if (!value) { + throw new SAXNotSupportedException(name); + } + } else if ("http://xml.org/sax/features/namespace-prefixes".equals(name)) { + repeater.setNamespacePrefixes(value); + } else if ("http://xml.org/sax/features/external-general-entities".equals(name)) { + // Pass over, XOM likes to get this feature + } else if ("http://xml.org/sax/features/external-parameter-entities".equals(name)) { + // Pass over, XOM likes to get this feature + } else if ("http://xml.org/sax/features/validation".equals(name)) { + // Don't really make sense when using Stax + } else { + throw new SAXNotRecognizedException(name); + } + } + + @Override + public Object getProperty(String name) throws SAXNotRecognizedException { + if ("http://xml.org/sax/properties/lexical-handler".equals(name)) { + return repeater.getLexicalHandler(); + } + + throw new SAXNotRecognizedException(name); + } + + @Override + public void setProperty(String name, Object value) throws SAXNotRecognizedException { + if ("http://xml.org/sax/properties/lexical-handler".equals(name)) { + repeater.setLexicalHandler((LexicalHandler) value); + } else { + throw new SAXNotRecognizedException(name); + } + } + + @Override + public void setEntityResolver(EntityResolver resolver) { + this.entityResolver = resolver; + } + + @Override + public EntityResolver getEntityResolver() { + return entityResolver; + } + + @Override + public void setDTDHandler(DTDHandler handler) { + this.dtdHandler = handler; + } + + @Override + public DTDHandler getDTDHandler() { + return dtdHandler; + } + + @Override + public void setContentHandler(ContentHandler handler) { + repeater.setContentHandler(handler); + } + + @Override + public ContentHandler getContentHandler() { + return repeater.getContentHandler(); + } + + @Override + public void setErrorHandler(ErrorHandler handler) { + this.errorHandler = handler; + } + + @Override + public ErrorHandler getErrorHandler() { + return errorHandler; + } + + @Override + public void parse(InputSource input) throws SAXException { + parse(); + } + + @Override + public void parse(String systemId) throws SAXException { + parse(); + } + + public void parse() throws SAXException { + // parses from a StAX reader and generates SAX events which + // go through the repeater and are forwarded to the appropriate + // component + try { + handler.bridge(); + } catch (XMLStreamException e) { + // determine location + int lineNumber = -1; + int columnNumber = -1; + if (e.getLocation() != null) { + lineNumber = e.getLocation().getLineNumber(); + columnNumber = e.getLocation().getColumnNumber(); + } + + // wrap it in a SAXException + SAXParseException se = new SAXParseException(e.getMessage(), null, null, lineNumber, columnNumber, e); + + // if the consumer sets an error handler, it is our responsibility + // to notify it. + if (errorHandler != null) + errorHandler.fatalError(se); + + // this is a fatal error. Even if the error handler + // returns, we will abort anyway. + throw se; + } finally { + try { + reader.close(); + } catch (XMLStreamException e) { + throw new SAXException(e); + } + } + } + } + +} diff --git a/src/main/java/org/mule/service/soap/xml/stax/XMLStreamReaderToContentHandler.java b/src/main/java/org/mule/service/soap/xml/stax/XMLStreamReaderToContentHandler.java new file mode 100644 index 00000000..29770986 --- /dev/null +++ b/src/main/java/org/mule/service/soap/xml/stax/XMLStreamReaderToContentHandler.java @@ -0,0 +1,375 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.xml.stax; + +import javanet.staxutils.DummyLocator; +import javanet.staxutils.StAXReaderToContentHandler; +import javanet.staxutils.helpers.XMLFilterImplEx; + +import javax.xml.namespace.QName; +import javax.xml.stream.Location; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.xml.sax.Attributes; +import org.xml.sax.Locator; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.AttributesImpl; + +/** + * This is a simple utility class that adapts StAX events from an {@link javax.xml.stream.XMLStreamReader} to SAX events on a + * {@link org.xml.sax.ContentHandler}, bridging between the two parser technologies. + * + * @author Ryan.Shoemaker@Sun.COM + * @version 1.0 + */ +public class XMLStreamReaderToContentHandler implements StAXReaderToContentHandler { + + // StAX event source + private final XMLStreamReader staxStreamReader; + + // SAX event sinks + private XMLFilterImplEx filter; + + /** + * Construct a new StAX to SAX adapter that will convert a StAX event stream into a SAX event stream. + * + * @param staxCore StAX event source + * @param filter SAX event sink + */ + public XMLStreamReaderToContentHandler(XMLStreamReader staxCore, XMLFilterImplEx filter) { + staxStreamReader = staxCore; + + this.filter = filter; + } + + public void bridge() throws XMLStreamException { + try { + // remembers the nest level of elements to know when we are done. + int depth = 0; + boolean isDocument = false; + + handleStartDocument(); + + // if the parser is at the start document, procees any comments or PIs + int event = staxStreamReader.getEventType(); + if (event == XMLStreamConstants.START_DOCUMENT) { + isDocument = true; + event = staxStreamReader.next(); + while (event != XMLStreamConstants.START_ELEMENT) { + switch (event) { + case XMLStreamConstants.COMMENT: + handleComment(); + break; + case XMLStreamConstants.PROCESSING_INSTRUCTION: + handlePI(); + break; + } + event = staxStreamReader.next(); + } + } + + if (event != XMLStreamConstants.START_ELEMENT) + throw new IllegalStateException("The current event is not START_ELEMENT\n but" + event); + + do { + // These are all of the events listed in the javadoc for + // XMLEvent. + // The spec only really describes 11 of them. + switch (event) { + case XMLStreamConstants.START_ELEMENT: + depth++; + handleStartElement(); + break; + case XMLStreamConstants.END_ELEMENT: + handleEndElement(); + depth--; + break; + case XMLStreamConstants.CHARACTERS: + handleCharacters(); + break; + case XMLStreamConstants.ENTITY_REFERENCE: + handleEntityReference(); + break; + case XMLStreamConstants.PROCESSING_INSTRUCTION: + handlePI(); + break; + case XMLStreamConstants.COMMENT: + handleComment(); + break; + case XMLStreamConstants.DTD: + handleDTD(); + break; + case XMLStreamConstants.ATTRIBUTE: + handleAttribute(); + break; + case XMLStreamConstants.NAMESPACE: + handleNamespace(); + break; + case XMLStreamConstants.CDATA: + handleCDATA(); + break; + case XMLStreamConstants.ENTITY_DECLARATION: + handleEntityDecl(); + break; + case XMLStreamConstants.NOTATION_DECLARATION: + handleNotationDecl(); + break; + case XMLStreamConstants.SPACE: + handleSpace(); + break; + default: + throw new InternalError("processing event: " + event); + } + + event = staxStreamReader.next(); + } while (depth != 0); + + // procees any remaining comments or PIs + if (isDocument) { + while (event != XMLStreamConstants.END_DOCUMENT) { + switch (event) { + case XMLStreamConstants.COMMENT: + handleComment(); + break; + case XMLStreamConstants.PROCESSING_INSTRUCTION: + handlePI(); + break; + } + event = staxStreamReader.next(); + } + } + + handleEndDocument(); + } catch (SAXException e) { + throw new XMLStreamException(e); + } + } + + protected void handleEndDocument() throws SAXException { + filter.endDocument(); + } + + protected void handleStartDocument() throws SAXException { + final Location location = staxStreamReader.getLocation(); + if (location != null) { + filter.setDocumentLocator(new Locator() { + + public int getColumnNumber() { + return location.getColumnNumber(); + } + + public int getLineNumber() { + return location.getLineNumber(); + } + + public String getPublicId() { + return location.getPublicId(); + } + + public String getSystemId() { + return location.getSystemId(); + } + }); + } else { + filter.setDocumentLocator(new DummyLocator()); + } + filter.startDocument(); + } + + protected void handlePI() throws XMLStreamException { + try { + filter.processingInstruction(staxStreamReader.getPITarget(), staxStreamReader.getPIData()); + } catch (SAXException e) { + throw new XMLStreamException(e); + } + } + + protected void handleCharacters() throws XMLStreamException { + char[] chars = staxStreamReader.getText().toCharArray(); + + try { + filter.characters(chars, 0, chars.length); + } catch (SAXException e) { + throw new XMLStreamException(e); + } + } + + protected void handleEndElement() throws XMLStreamException { + QName qName = staxStreamReader.getName(); + + try { + // fire endElement + String prefix = qName.getPrefix(); + String rawname; + if (prefix == null || prefix.length() == 0) + rawname = qName.getLocalPart(); + else + rawname = prefix + ':' + qName.getLocalPart(); + + filter.endElement(qName.getNamespaceURI(), qName.getLocalPart(), rawname); + + // end namespace bindings + int nsCount = staxStreamReader.getNamespaceCount(); + for (int i = nsCount - 1; i >= 0; i--) { + String nsprefix = staxStreamReader.getNamespacePrefix(i); + if (nsprefix == null) { // true for default namespace + nsprefix = ""; + } + filter.endPrefixMapping(nsprefix); + } + } catch (SAXException e) { + throw new XMLStreamException(e); + } + } + + protected void handleStartElement() throws XMLStreamException { + + try { + // start namespace bindings + int nsCount = staxStreamReader.getNamespaceCount(); + for (int i = 0; i < nsCount; i++) { + String uri = staxStreamReader.getNamespaceURI(i); + if (uri == null) { + uri = ""; + } + String prefix = staxStreamReader.getNamespacePrefix(i); + if (prefix == null) { // true for default namespace + prefix = ""; + } + filter.startPrefixMapping(prefix, uri); + } + + // fire startElement + QName qName = staxStreamReader.getName(); + String prefix = qName.getPrefix(); + String rawname; + if (prefix == null || prefix.length() == 0) + rawname = qName.getLocalPart(); + else + rawname = prefix + ':' + qName.getLocalPart(); + Attributes attrs = getAttributes(); + filter.startElement(qName.getNamespaceURI(), qName.getLocalPart(), rawname, attrs); + } catch (SAXException e) { + throw new XMLStreamException(e); + } + } + + /** + * Get the attributes associated with the given START_ELEMENT or ATTRIBUTE StAXevent. + * + * @return the StAX attributes converted to an org.xml.sax.Attributes + */ + protected Attributes getAttributes() { + AttributesImpl attrs = new AttributesImpl(); + + int eventType = staxStreamReader.getEventType(); + if (eventType != XMLStreamConstants.ATTRIBUTE && eventType != XMLStreamConstants.START_ELEMENT) { + throw new InternalError("getAttributes() attempting to process: " + eventType); + } + + // Add namspace declarations if required + if (filter.getNamespacePrefixes()) { + for (int i = 0; i < staxStreamReader.getNamespaceCount(); i++) { + String uri = staxStreamReader.getNamespaceURI(i); + if (uri == null) + uri = ""; + + String prefix = staxStreamReader.getNamespacePrefix(i); + if (prefix == null) + prefix = ""; + + String qName = "xmlns"; + if (prefix.length() == 0) { + prefix = qName; + } else { + qName = qName + ':' + prefix; + } + attrs.addAttribute("http://www.w3.org/2000/xmlns/", prefix, qName, "CDATA", uri); + } + } + + // gather non-namespace attrs + for (int i = 0; i < staxStreamReader.getAttributeCount(); i++) { + String uri = staxStreamReader.getAttributeNamespace(i); + if (uri == null) + uri = ""; + String localName = staxStreamReader.getAttributeLocalName(i); + String prefix = staxStreamReader.getAttributePrefix(i); + String qName; + if (prefix == null || prefix.length() == 0) + qName = localName; + else + qName = prefix + ':' + localName; + String type = staxStreamReader.getAttributeType(i); + String value = staxStreamReader.getAttributeValue(i); + + attrs.addAttribute(uri, localName, qName, type, value); + } + + return attrs; + } + + protected void handleNamespace() { + // no-op ??? + // namespace events don't normally occur outside of a startElement + // or endElement + } + + protected void handleAttribute() { + // no-op ??? + // attribute events don't normally occur outside of a startElement + // or endElement + } + + protected void handleDTD() { + // no-op ??? + // it seems like we need to pass this info along, but how? + } + + protected void handleComment() throws XMLStreamException { + char[] chars = staxStreamReader.getText().toCharArray(); + + try { + filter.comment(chars, 0, chars.length); + } catch (SAXException e) { + throw new XMLStreamException(e); + } + } + + protected void handleEntityReference() { + // no-op ??? + } + + protected void handleSpace() { + // no-op ??? + // this event is listed in the javadoc, but not in the spec. + } + + protected void handleNotationDecl() { + // no-op ??? + // this event is listed in the javadoc, but not in the spec. + } + + protected void handleEntityDecl() { + // no-op ??? + // this event is listed in the javadoc, but not in the spec. + } + + protected void handleCDATA() throws XMLStreamException { + char[] chars = staxStreamReader.getText().toCharArray(); + + try { + filter.startCDATA(); + filter.characters(chars, 0, chars.length); + filter.endCDATA(); + } catch (SAXException e) { + throw new XMLStreamException(e); + } + } +} diff --git a/src/main/java/org/mule/service/soap/xml/util/XMLUtils.java b/src/main/java/org/mule/service/soap/xml/util/XMLUtils.java new file mode 100644 index 00000000..a4c3529d --- /dev/null +++ b/src/main/java/org/mule/service/soap/xml/util/XMLUtils.java @@ -0,0 +1,29 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.xml.util; + +import org.dom4j.io.DOMReader; +import org.w3c.dom.Document; + +/** + * General utility methods for working with XML. + * + * @since 1.0, Copied from the removed XML module. + */ +public class XMLUtils { + + /** + * Converts a DOM to an XML string. + * + * @param dom the dome object to convert + * @return A string representation of the document + */ + public static String toXml(Document dom) { + return new DOMReader().read(dom).asXML(); + } + +} diff --git a/src/main/resources/META-INF/mule-artifact/mule-artifact.json b/src/main/resources/META-INF/mule-artifact/mule-artifact.json index 5be488e0..f2d4f7bd 100644 --- a/src/main/resources/META-INF/mule-artifact/mule-artifact.json +++ b/src/main/resources/META-INF/mule-artifact/mule-artifact.json @@ -3,6 +3,10 @@ "minMuleVersion": "4.2.0", "requiredProduct": "MULE", "contracts": [ + { + "serviceProviderClassName": "org.mule.service.soap.provider.SoapServiceProvider", + "contractClassName": "org.mule.runtime.soap.api.SoapService" + } ], "classLoaderModelLoaderDescriptor": { "id": "mule", diff --git a/src/test/java/org/mule/service/soap/AbstractSoapServiceTestCase.java b/src/test/java/org/mule/service/soap/AbstractSoapServiceTestCase.java new file mode 100755 index 00000000..ff388b3b --- /dev/null +++ b/src/test/java/org/mule/service/soap/AbstractSoapServiceTestCase.java @@ -0,0 +1,104 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap; + +import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; +import static org.mule.runtime.soap.api.SoapVersion.SOAP11; +import static org.mule.runtime.soap.api.SoapVersion.SOAP12; +import static org.mule.service.soap.client.TestSoapClient.getDefaultConfiguration; + +import org.mule.runtime.extension.api.soap.security.SecurityStrategy; +import org.mule.runtime.soap.api.SoapVersion; +import org.mule.service.soap.client.DefaultTestDispatcher; +import org.mule.service.soap.client.TestSoapClient; +import org.mule.service.soap.server.HttpServer; +import org.mule.service.soap.service.Soap11Service; +import org.mule.service.soap.service.Soap12Service; +import org.mule.tck.junit4.rule.DynamicPort; + +import java.util.Collection; +import java.util.List; + +import org.apache.cxf.interceptor.Interceptor; +import org.custommonkey.xmlunit.XMLUnit; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public abstract class AbstractSoapServiceTestCase { + + public final SoapTestXmlValues testValues = new SoapTestXmlValues("http://service.soap.service.mule.org/"); + + public final DefaultTestDispatcher dispatcher = new DefaultTestDispatcher(); + + @Rule + public DynamicPort port = new DynamicPort("port"); + + @Parameterized.Parameter + public SoapVersion soapVersion; + + @Parameterized.Parameter(1) + public String serviceClass; + + protected TestSoapClient client; + protected HttpServer server; + + @Parameterized.Parameters(name = "{0}") + public static Collection data() { + return asList(new Object[][] { + {SOAP11, Soap11Service.class.getName()}, + {SOAP12, Soap12Service.class.getName()} + }); + } + + @Before + public void before() throws Exception { + XMLUnit.setIgnoreWhitespace(true); + server = new HttpServer(port.getNumber(), buildInInterceptor(), buildOutInterceptor(), createServiceInstance());; + client = new TestSoapClient(getDefaultConfiguration(server.getDefaultAddress()) + .enableMtom(isMtom()) + .withVersion(soapVersion) + .withDispatcher(dispatcher) + .withSecurities(getSecurityStrategies()) + .build()); + } + + protected boolean isMtom() { + return false; + } + + @After + public void tearDown() throws Exception { + client.stop(); + dispatcher.stop(); + } + + protected List getSecurityStrategies() { + return emptyList(); + } + + protected String getServiceClass() { + return serviceClass; + } + + protected Interceptor buildInInterceptor() { + return null; + } + + protected Interceptor buildOutInterceptor() { + return null; + } + + private Object createServiceInstance() throws Exception { + Class serviceClass = this.getClass().getClassLoader().loadClass(getServiceClass()); + return serviceClass.newInstance(); + } +} diff --git a/src/test/java/org/mule/service/soap/SoapTestUtils.java b/src/test/java/org/mule/service/soap/SoapTestUtils.java new file mode 100644 index 00000000..bd91d74c --- /dev/null +++ b/src/test/java/org/mule/service/soap/SoapTestUtils.java @@ -0,0 +1,76 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap; + +import static org.custommonkey.xmlunit.XMLUnit.compareXML; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +import org.mule.runtime.api.message.Message; +import org.mule.runtime.api.metadata.TypedValue; +import org.mule.runtime.api.streaming.bytes.CursorStreamProvider; +import org.mule.runtime.extension.api.soap.SoapOutputPayload; +import org.apache.commons.io.IOUtils; +import org.custommonkey.xmlunit.Diff; +import org.custommonkey.xmlunit.XMLUnit; +import org.w3c.dom.Document; +import org.xml.sax.InputSource; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.InputStream; +import java.io.StringReader; +import java.io.StringWriter; + +public class SoapTestUtils { + + public static void assertSimilarXml(String expected, String result) throws Exception { + XMLUnit.setIgnoreWhitespace(true); + Diff diff = compareXML(result, expected); + if (!diff.similar()) { + System.out.println("Expected xml is:\n"); + System.out.println(prettyPrint(expected)); + System.out.println("########################################\n"); + System.out.println("But got:\n"); + System.out.println(prettyPrint(result)); + } + assertThat(diff.similar(), is(true)); + } + + public static void assertSimilarXml(String expected, InputStream result) throws Exception { + assertSimilarXml(expected, IOUtils.toString(result)); + } + + private static String prettyPrint(String a) throws Exception { + DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + InputSource is = new InputSource(); + is.setCharacterStream(new StringReader(a)); + Document doc = db.parse(is); + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); + // initialize StreamResult with File object to save to file + StreamResult result = new StreamResult(new StringWriter()); + DOMSource source = new DOMSource(doc); + transformer.transform(source, result); + return result.getWriter().toString(); + } + + public static String payloadBodyAsString(Message message) throws Exception { + Object payload = message.getPayload().getValue(); + assertThat(payload, is(instanceOf(SoapOutputPayload.class))); + TypedValue body = ((SoapOutputPayload) payload).getBody(); + InputStream val = + body.getValue() instanceof CursorStreamProvider ? ((CursorStreamProvider) body.getValue()).openCursor() : body.getValue(); + return IOUtils.toString(val); + } +} diff --git a/src/test/java/org/mule/service/soap/SoapTestXmlValues.java b/src/test/java/org/mule/service/soap/SoapTestXmlValues.java new file mode 100644 index 00000000..33ff1306 --- /dev/null +++ b/src/test/java/org/mule/service/soap/SoapTestXmlValues.java @@ -0,0 +1,135 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap; + + +public class SoapTestXmlValues { + + public static final String ECHO = "echo"; + public static final String ECHO_HEADERS = "echoWithHeaders"; + public static final String ECHO_ACCOUNT = "echoAccount"; + public static final String NO_PARAMS = "noParams"; + public static final String NO_PARAMS_HEADERS = "noParamsWithHeader"; + public static final String FAIL = "fail"; + public static final String UPLOAD_ATTACHMENT = "uploadAttachment"; + public static final String DOWNLOAD_ATTACHMENT = "downloadAttachment"; + public static final String LARGE = "large"; + public static final String ONE_WAY = "oneWay"; + + public static final String HEADER_IN = "headerIn"; + public static final String HEADER_INOUT = "headerInOut"; + public static final String HEADER_OUT = "headerOut"; + + private final String ns; + + public SoapTestXmlValues(String ns) { + this.ns = ns; + } + + public String getEchoResquest() { + return buildXml(ECHO, "test"); + } + + public String getEchoResponse() { + return buildResponseXml(ECHO, "test response"); + } + + public String getEchoAccountRequest() { + return buildXml(ECHO_ACCOUNT, "\n" + + " 12\n" + + " chocolate\n" + + " banana\n" + + " dulce de leche\n" + + " 2016-09-23T00:00:00-03:00\n" + + "\n" + + "Juan"); + } + + public String getEchoAccountResponse() { + return buildResponseXml(ECHO_ACCOUNT, "\n" + + " Juan\n" + + " 12\n" + + " chocolate\n" + + " banana\n" + + " dulce de leche\n" + + " 2016-09-23T00:00:00-03:00\n" + + ""); + } + + public String getEchoWithHeadersRequest() { + return buildXml(ECHO_HEADERS, "test"); + } + + public String getOneWayRequest() { + return buildXml("oneWay", "text"); + } + + public String getEchoWithHeadersResponse() { + return buildResponseXml(ECHO_HEADERS, "test response"); + } + + public String getFailRequest() { + return buildXml(FAIL, "Fail Message"); + } + + public String getNoParamsRequest() { + return buildXml(NO_PARAMS, ""); + } + + public String getNoParamsResponse() { + return buildResponseXml(NO_PARAMS, "response"); + } + + public String getNoParamsWithHeadersRequest() { + return buildXml(NO_PARAMS_HEADERS, ""); + } + + public String getNoParamsWithHeadersResponse() { + return buildResponseXml(NO_PARAMS_HEADERS, "Header In Value"); + } + + public String getDownloadAttachmentRequest() { + return buildXml(DOWNLOAD_ATTACHMENT, "attachment.txt"); + } + + public String getDownloadAttachmentResponse() { + return buildResponseXml(DOWNLOAD_ATTACHMENT, ""); + } + + public String getUploadAttachmentRequest() { + return buildXml(UPLOAD_ATTACHMENT, ""); + } + + public String getUploadAttachmentResponse() { + return buildResponseXml(UPLOAD_ATTACHMENT, "Ok"); + } + + public String getHeaderIn() { + return buildXml(HEADER_IN, "Header In Value"); + } + + public String getHeaderInOutRequest() { + return buildXml(HEADER_INOUT, "Header In Out Value"); + } + + public String getHeaderInOutResponse() { + return buildXml(HEADER_INOUT, "Header In Out Value INOUT"); + } + + public String getHeaderOut() { + return buildXml(HEADER_OUT, "Header In Value OUT"); + } + + public String buildXml(String operation, String value) { + // defined this way VALUE + return "" + value + ""; + } + + private String buildResponseXml(String operation, String value) { + return buildXml(operation + "Response", value); + } +} diff --git a/src/test/java/org/mule/service/soap/client/CxfAttachmentsTestCase.java b/src/test/java/org/mule/service/soap/client/CxfAttachmentsTestCase.java new file mode 100644 index 00000000..af666430 --- /dev/null +++ b/src/test/java/org/mule/service/soap/client/CxfAttachmentsTestCase.java @@ -0,0 +1,90 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.client; + +import static org.mule.runtime.http.api.HttpHeaders.Names.CONTENT_DISPOSITION; + +import static java.util.Collections.emptyMap; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; + +import org.mule.runtime.api.metadata.MediaType; +import org.mule.runtime.extension.api.soap.SoapAttachment; + +import java.util.Map; + +import com.google.common.collect.ImmutableMap; + +import org.apache.commons.io.input.NullInputStream; +import org.apache.cxf.message.Attachment; + +import org.junit.Test; + +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; + +public class CxfAttachmentsTestCase { + + @Test + public void notMtom() { + CxfAttachmentsFactory factory = new CxfAttachmentsFactory(false); + assertThat(factory.transformToCxfAttachments(buildAttachments()), is(emptyMap())); + } + + @Test + public void MtomEnabled() { + CxfAttachmentsFactory factory = new CxfAttachmentsFactory(true); + Map attachments = factory.transformToCxfAttachments(buildAttachments()); + assertThat(attachments.keySet(), hasSize(3)); + assertThat(attachments.keySet(), + containsInAnyOrder(new AttachmentMatcher(attachments, "name1", MediaType.APPLICATION_JAVA), + new AttachmentMatcher(attachments, "name2", MediaType.APPLICATION_XML), + new AttachmentMatcher(attachments, "name3", MediaType.APPLICATION_JSON))); + } + + private Map buildAttachments() { + ImmutableMap.Builder builder = new ImmutableMap.Builder<>(); + builder.put("name1", new SoapAttachment(new NullInputStream(10), MediaType.APPLICATION_JAVA)); + builder.put("name2", new SoapAttachment(new NullInputStream(10), MediaType.APPLICATION_XML)); + builder.put("name3", new SoapAttachment(new NullInputStream(10), MediaType.APPLICATION_JSON)); + return builder.build(); + } + + private class AttachmentMatcher extends BaseMatcher { + + private String expectedName; + private String expectedMediaType; + private Map attachmentMap; + + public AttachmentMatcher(Map map, String expectedName, MediaType expectedMediaType) { + this.expectedName = expectedName; + this.expectedMediaType = expectedMediaType.toRfcString(); + this.attachmentMap = map; + } + + @Override + public boolean matches(Object o) { + String name = (String) o; + if (!this.expectedName.equals(name)) { + return false; + } + + String actualMediaType = attachmentMap.get(name).getDataHandler().getContentType(); + if (!expectedMediaType.equals(actualMediaType)) { + return false; + } + + return attachmentMap.get(name).getHeader(CONTENT_DISPOSITION).contains("attachment"); + } + + @Override + public void describeTo(Description description) {} + } +} diff --git a/src/test/java/org/mule/service/soap/client/DefaultTestDispatcher.java b/src/test/java/org/mule/service/soap/client/DefaultTestDispatcher.java new file mode 100644 index 00000000..5bca89ac --- /dev/null +++ b/src/test/java/org/mule/service/soap/client/DefaultTestDispatcher.java @@ -0,0 +1,50 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +/** + * + */ +package org.mule.service.soap.client; + +import org.mule.runtime.extension.api.soap.message.DispatchingRequest; +import org.mule.runtime.extension.api.soap.message.DispatchingResponse; +import org.mule.runtime.extension.api.soap.message.MessageDispatcher; +import org.mule.runtime.http.api.client.HttpClient; +import org.mule.runtime.http.api.client.HttpClientConfiguration.Builder; +import org.mule.runtime.soap.api.message.dispatcher.DefaultHttpMessageDispatcher; +import org.mule.service.http.impl.service.HttpServiceImplementation; +import org.mule.tck.SimpleUnitTestSupportSchedulerService; + +public class DefaultTestDispatcher implements MessageDispatcher { + + private final DefaultHttpMessageDispatcher delegate; + private final HttpClient httpClient; + + public DefaultTestDispatcher() { + HttpServiceImplementation httpService = new HttpServiceImplementation(new SimpleUnitTestSupportSchedulerService()); + this.httpClient = getHttpClient(httpService); + this.delegate = new DefaultHttpMessageDispatcher(httpClient); + } + + private HttpClient getHttpClient(HttpServiceImplementation httpService) { + HttpClient client = httpService.getClientFactory().create(new Builder().setName("soap").build()); + client.start(); + return client; + } + + @Override + public DispatchingResponse dispatch(DispatchingRequest request) { + return delegate.dispatch(request); + } + + public void stop() { + try { + httpClient.stop(); + } catch (Exception e) { + // ignore + } + } +} diff --git a/src/test/java/org/mule/service/soap/client/TestSoapClient.java b/src/test/java/org/mule/service/soap/client/TestSoapClient.java new file mode 100644 index 00000000..6db8b524 --- /dev/null +++ b/src/test/java/org/mule/service/soap/client/TestSoapClient.java @@ -0,0 +1,62 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.client; + +import org.mule.runtime.api.connection.ConnectionException; +import org.mule.runtime.api.exception.MuleException; +import org.mule.runtime.soap.api.client.SoapClient; +import org.mule.runtime.soap.api.client.SoapClientConfiguration; +import org.mule.runtime.soap.api.client.SoapClientConfigurationBuilder; +import org.mule.runtime.soap.api.client.metadata.SoapMetadataResolver; +import org.mule.runtime.soap.api.message.SoapRequest; +import org.mule.runtime.soap.api.message.SoapResponse; +import org.mule.service.soap.SoapServiceImplementation; +import org.junit.rules.ExternalResource; + +public class TestSoapClient extends ExternalResource implements SoapClient { + + private static final String DEFAULT_TEST_SERVICE_NAME = "TestService"; + private static final String DEFAULT_TEST_PORT_NAME = "TestPort"; + + private final SoapClient soapClient; + + public TestSoapClient(SoapClientConfiguration config) { + this.soapClient = getClient(config); + } + + private SoapClient getClient(SoapClientConfiguration config) { + try { + return new SoapServiceImplementation().getClientFactory().create(config); + } catch (ConnectionException e) { + throw new RuntimeException(e); + } + } + + public static SoapClientConfigurationBuilder getDefaultConfiguration(String address) { + return SoapClientConfiguration.builder() + .withAddress(address) + .withWsdlLocation(address + "?wsdl") + .withService(DEFAULT_TEST_SERVICE_NAME) + .withPort(DEFAULT_TEST_PORT_NAME); + } + + @Override + public SoapResponse consume(SoapRequest request) { + return soapClient.consume(request); + } + + @Override + public SoapMetadataResolver getMetadataResolver() { + return soapClient.getMetadataResolver(); + } + + @Override + public void start() throws MuleException {} + + @Override + public void stop() throws MuleException {} +} diff --git a/src/test/java/org/mule/service/soap/generator/AbstractEnricherTestCase.java b/src/test/java/org/mule/service/soap/generator/AbstractEnricherTestCase.java new file mode 100644 index 00000000..5ddf68cb --- /dev/null +++ b/src/test/java/org/mule/service/soap/generator/AbstractEnricherTestCase.java @@ -0,0 +1,29 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import org.mule.metadata.xml.api.XmlTypeLoader; +import org.mule.service.soap.AbstractSoapServiceTestCase; +import org.mule.wsdl.parser.WsdlParser; +import org.mule.wsdl.parser.model.WsdlModel; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.rules.ExpectedException; + +public abstract class AbstractEnricherTestCase extends AbstractSoapServiceTestCase { + + @Rule + public ExpectedException exception = ExpectedException.none(); + + protected WsdlModel model; + + @Before + public void setup() { + model = WsdlParser.Companion.parse(server.getDefaultAddress() + "?wsdl"); + } +} diff --git a/src/test/java/org/mule/service/soap/generator/AbstractRequestEnricherTestCase.java b/src/test/java/org/mule/service/soap/generator/AbstractRequestEnricherTestCase.java new file mode 100644 index 00000000..6125ca38 --- /dev/null +++ b/src/test/java/org/mule/service/soap/generator/AbstractRequestEnricherTestCase.java @@ -0,0 +1,44 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static java.util.Collections.singletonMap; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.mule.runtime.api.metadata.MediaType; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.service.soap.SoapTestUtils; +import org.mule.service.soap.generator.attachment.AttachmentRequestEnricher; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import io.qameta.allure.Description; +import io.qameta.allure.Step; + +public abstract class AbstractRequestEnricherTestCase extends AbstractEnricherTestCase { + + @Test + @Description("Enrich a request that contains attachments") + public void enrich() throws Exception { + SoapAttachment attachment = getTestAttachment(); + AttachmentRequestEnricher enricher = getEnricher(); + String request = enricher.enrichRequest(testValues.getUploadAttachmentRequest(), singletonMap("attachment-id", attachment)); + SoapTestUtils.assertSimilarXml(getExpectedResult(), request); + } + + @Step("Prepares a test attachment") + private SoapAttachment getTestAttachment() { + SoapAttachment attachment = mock(SoapAttachment.class); + when(attachment.getContent()).thenReturn(IOUtils.toInputStream("Some Content")); + when(attachment.getContentType()).thenReturn(MediaType.TEXT); + return attachment; + } + + protected abstract AttachmentRequestEnricher getEnricher(); + + protected abstract String getExpectedResult(); +} diff --git a/src/test/java/org/mule/service/soap/generator/Base64TransformersTestCase.java b/src/test/java/org/mule/service/soap/generator/Base64TransformersTestCase.java new file mode 100644 index 00000000..2742ca6c --- /dev/null +++ b/src/test/java/org/mule/service/soap/generator/Base64TransformersTestCase.java @@ -0,0 +1,68 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static org.hamcrest.CoreMatchers.endsWith; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import static org.mule.runtime.api.metadata.DataType.STRING; +import static org.mule.runtime.core.api.util.Base64.encodeBytes; +import org.mule.runtime.core.api.transformer.Transformer; +import org.mule.service.soap.generator.attachment.Base64Decoder; +import org.mule.service.soap.generator.attachment.Base64Encoder; +import org.mule.tck.core.transformer.AbstractTransformerTestCase; + +import org.junit.Test; + +public class Base64TransformersTestCase extends AbstractTransformerTestCase { + + private static final String TEST_DATA = "the quick brown fox jumped over the lazy dog"; + + @Override + public Object getResultData() { + try { + return encodeBytes(TEST_DATA.getBytes()); + } catch (Exception ex) { + fail(); + return null; + } + } + + @Override + public Object getTestData() { + return TEST_DATA; + } + + @Override + public Transformer getTransformer() { + return new Base64Encoder(); + } + + @Override + public Transformer getRoundTripTransformer() { + Transformer t = new Base64Decoder(); + // our input is a String so we expect a String as output + t.setReturnDataType(STRING); + return t; + } + + @Test + public void decodeUnpaddedString() throws Exception { + String encodeBytes = (String) getResultData(); + assertThat(encodeBytes, endsWith("=")); + while (encodeBytes.endsWith("=")) { + encodeBytes = encodeBytes.substring(0, encodeBytes.length() - 1); + } + assertThat(encodeBytes, not(endsWith("="))); + + String resultString = (String) getRoundTripTransformer().transform(encodeBytes); + + assertThat(resultString, is(TEST_DATA)); + } +} diff --git a/src/test/java/org/mule/service/soap/generator/EmptyRequestGeneratorTestCase.java b/src/test/java/org/mule/service/soap/generator/EmptyRequestGeneratorTestCase.java new file mode 100644 index 00000000..8fc5a140 --- /dev/null +++ b/src/test/java/org/mule/service/soap/generator/EmptyRequestGeneratorTestCase.java @@ -0,0 +1,54 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static org.mule.service.soap.SoapTestUtils.assertSimilarXml; +import static org.mule.service.soap.SoapTestXmlValues.ECHO; +import static org.mule.service.soap.SoapTestXmlValues.NO_PARAMS; +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.mule.runtime.soap.api.exception.BadRequestException; + +import io.qameta.allure.Description; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +@Feature(WSC_EXTENSION) +@Story("Request Generation") +public class EmptyRequestGeneratorTestCase extends AbstractEnricherTestCase { + + @Rule + public ExpectedException exception = ExpectedException.none(); + + private EmptyRequestGenerator generator; + + @Before + public void setup() { + super.setup(); + generator = new EmptyRequestGenerator(model.getService("TestService").getPort("TestPort"), model.getLoader().getValue()); + } + + @Test + @Description("Checks the generation of a body request for an operation that don't require any parameters") + public void noParams() throws Exception { + String request = generator.generateRequest(NO_PARAMS); + assertSimilarXml(request, testValues.getNoParamsRequest()); + } + + @Test + @Description("Checks that the generation of a body request for an operation that require parameters fails") + public void withParams() throws Exception { + exception.expect(BadRequestException.class); + exception + .expectMessage("Cannot build default body request for operation [echo], the operation requires input parameters"); + generator.generateRequest(ECHO); + } +} diff --git a/src/test/java/org/mule/service/soap/generator/MtomRequestEnricherTestCase.java b/src/test/java/org/mule/service/soap/generator/MtomRequestEnricherTestCase.java new file mode 100644 index 00000000..ef60d8a6 --- /dev/null +++ b/src/test/java/org/mule/service/soap/generator/MtomRequestEnricherTestCase.java @@ -0,0 +1,38 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.mule.service.soap.generator.attachment.AttachmentRequestEnricher; +import org.mule.service.soap.generator.attachment.MtomRequestEnricher; + +import io.qameta.allure.Feature; +import io.qameta.allure.Step; +import io.qameta.allure.Stories; +import io.qameta.allure.Story; + +@Feature(WSC_EXTENSION) +@Stories({@Story("Attachments"), @Story("MTOM"), @Story("Request Generation")}) +public class MtomRequestEnricherTestCase extends AbstractRequestEnricherTestCase { + + @Override + @Step("Returns an MTOM enricher that adds an XOP element to the XML referencing the attachment in the multipart message") + protected AttachmentRequestEnricher getEnricher() { + return new MtomRequestEnricher(model.getLoader().getValue()); + } + + @Override + protected String getExpectedResult() { + return "" + + "" + + "" + + "" + + "" + + ""; + } +} diff --git a/src/test/java/org/mule/service/soap/generator/MtomResponseEnricherTestCase.java b/src/test/java/org/mule/service/soap/generator/MtomResponseEnricherTestCase.java new file mode 100644 index 00000000..ca04de62 --- /dev/null +++ b/src/test/java/org/mule/service/soap/generator/MtomResponseEnricherTestCase.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static org.mule.service.soap.SoapTestUtils.assertSimilarXml; +import static org.mule.service.soap.SoapTestXmlValues.DOWNLOAD_ATTACHMENT; +import static org.mule.service.soap.util.XmlTransformationUtils.stringToDocument; + +import org.mule.service.soap.generator.attachment.AttachmentResponseEnricher; +import org.mule.service.soap.generator.attachment.MtomResponseEnricher; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; + +import io.qameta.allure.Description; +import org.apache.cxf.message.ExchangeImpl; +import org.junit.Before; +import org.junit.Test; +import org.w3c.dom.Document; + +public class MtomResponseEnricherTestCase extends AbstractEnricherTestCase { + + private AttachmentResponseEnricher enricher; + + @Before + public void setup() { + super.setup(); + Map ops = model.getService("TestService").getPort("TestPort").getOperationsMap(); + enricher = new MtomResponseEnricher(model.getLoader().getValue(), ops); + } + + @Test + @Description("Enrich a response that contains attachments") + public void enrich() throws Exception { + String response = + "" + + "" + + "" + + "" + + ""; + + ExchangeImpl exchange = new ExchangeImpl(); + Document doc = stringToDocument(response); + + String result = enricher.enrich(doc, DOWNLOAD_ATTACHMENT, exchange); + + assertSimilarXml(testValues.getDownloadAttachmentResponse(), result); + } +} diff --git a/src/test/java/org/mule/service/soap/generator/SoapAttachmentsRequestEnricherTestCase.java b/src/test/java/org/mule/service/soap/generator/SoapAttachmentsRequestEnricherTestCase.java new file mode 100644 index 00000000..e4d5ac57 --- /dev/null +++ b/src/test/java/org/mule/service/soap/generator/SoapAttachmentsRequestEnricherTestCase.java @@ -0,0 +1,37 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + + +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.mule.service.soap.generator.attachment.AttachmentRequestEnricher; +import org.mule.service.soap.generator.attachment.SoapAttachmentRequestEnricher; + +import io.qameta.allure.Feature; +import io.qameta.allure.Step; +import io.qameta.allure.Stories; +import io.qameta.allure.Story; + +@Feature(WSC_EXTENSION) +@Stories({@Story("Attachments"), @Story("Request Generation")}) +public class SoapAttachmentsRequestEnricherTestCase extends AbstractRequestEnricherTestCase { + + @Override + @Step("Returns an attachment enricher that adds the content of the attachment encoded to base64") + protected AttachmentRequestEnricher getEnricher() { + return new SoapAttachmentRequestEnricher(model.getLoader().getValue()); + } + + @Override + protected String getExpectedResult() { + return "" + + "" + + "U29tZSBDb250ZW50" + + ""; + } +} diff --git a/src/test/java/org/mule/service/soap/generator/SoapAttachmentsResponseEnricherTestCase.java b/src/test/java/org/mule/service/soap/generator/SoapAttachmentsResponseEnricherTestCase.java new file mode 100644 index 00000000..c1f69156 --- /dev/null +++ b/src/test/java/org/mule/service/soap/generator/SoapAttachmentsResponseEnricherTestCase.java @@ -0,0 +1,86 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.generator; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.mule.service.soap.SoapTestUtils.assertSimilarXml; +import static org.mule.service.soap.SoapTestXmlValues.DOWNLOAD_ATTACHMENT; +import static org.mule.service.soap.client.SoapCxfClient.MULE_ATTACHMENTS_KEY; +import static org.mule.service.soap.util.XmlTransformationUtils.stringToDocument; + +import org.mule.metadata.xml.api.XmlTypeLoader; +import org.mule.runtime.core.api.util.IOUtils; +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.service.soap.generator.attachment.AttachmentResponseEnricher; +import org.mule.service.soap.generator.attachment.SoapAttachmentResponseEnricher; +import org.mule.wsdl.parser.model.operation.OperationModel; + +import java.util.Map; + +import io.qameta.allure.Description; +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.ExchangeImpl; +import org.junit.Before; +import org.junit.Test; +import org.w3c.dom.Document; + +public class SoapAttachmentsResponseEnricherTestCase extends AbstractEnricherTestCase { + + private AttachmentResponseEnricher enricher; + + @Before + public void setup() { + super.setup(); + Map ops = model.getService("TestService").getPort("TestPort").getOperationsMap(); + enricher = new SoapAttachmentResponseEnricher(model.getLoader().getValue(), ops); + } + + @Test + @Description("Enrich a response that contains attachments encoded with windows-1252") + public void enrichWindows1252EncodingAttachment() throws Exception { + String response = + "" + + "QWxndW0gQ29udGX6ZG8gZW0gUG9ydHVndepzIHBhcmEgV2luZG93cw==" + + ""; + + ExchangeImpl exchange = new ExchangeImpl(); + Document doc = stringToDocument(response); + + String result = enricher.enrich(doc, DOWNLOAD_ATTACHMENT, exchange); + + assertSimilarXml(testValues.getDownloadAttachmentResponse(), result); + assertAttachment(exchange, "Algum Conteúdo em Português para Windows", "windows-1252"); + } + + @Test + @Description("Enrich a response that contains attachments encoded with UTF-8") + public void enrichUtf8EncodingAttachment() throws Exception { + String response = + "" + + "U29tZSBDb250ZW50" + + ""; + + ExchangeImpl exchange = new ExchangeImpl(); + Document doc = stringToDocument(response); + Map ops = model.getService("TestService").getPort("TestPort").getOperationsMap(); + enricher = new SoapAttachmentResponseEnricher(model.getLoader().getValue(), ops); + + String result = enricher.enrich(doc, DOWNLOAD_ATTACHMENT, exchange); + + assertSimilarXml(testValues.getDownloadAttachmentResponse(), result); + assertAttachment(exchange, "Some Content", "UTF-8"); + } + + private void assertAttachment(Exchange exchange, String attachmentText, String attachmentEncoding) { + Map attachments = (Map) exchange.get(MULE_ATTACHMENTS_KEY); + assertThat(attachments.entrySet(), hasSize(1)); + String value = IOUtils.toString(attachments.get("attachment").getContent(), attachmentEncoding); + assertThat(value, is(attachmentText)); + } +} diff --git a/src/test/java/org/mule/service/soap/introspection/HttpBasicAuthResourceLocator.java b/src/test/java/org/mule/service/soap/introspection/HttpBasicAuthResourceLocator.java new file mode 100644 index 00000000..27be4e67 --- /dev/null +++ b/src/test/java/org/mule/service/soap/introspection/HttpBasicAuthResourceLocator.java @@ -0,0 +1,71 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.introspection; + +import static org.mule.runtime.http.api.HttpConstants.Method.GET; +import static org.mule.service.soap.server.BasicAuthHttpServer.PASSWORD; +import static org.mule.service.soap.server.BasicAuthHttpServer.USERNAME; +import org.mule.runtime.api.exception.MuleException; +import org.mule.runtime.api.lifecycle.InitialisationException; +import org.mule.runtime.api.lifecycle.Lifecycle; +import org.mule.runtime.http.api.client.HttpClient; +import org.mule.runtime.http.api.client.HttpClientConfiguration; +import org.mule.runtime.http.api.client.auth.HttpAuthentication; +import org.mule.runtime.http.api.domain.message.request.HttpRequest; +import org.mule.runtime.http.api.domain.message.response.HttpResponse; +import org.mule.runtime.soap.api.transport.TransportResourceLocator; +import org.mule.service.http.impl.service.HttpServiceImplementation; +import org.mule.tck.SimpleUnitTestSupportSchedulerService; + +import java.io.IOException; +import java.io.InputStream; +import java.util.concurrent.TimeoutException; + +public class HttpBasicAuthResourceLocator implements TransportResourceLocator, Lifecycle { + + private final HttpServiceImplementation service = new HttpServiceImplementation(new SimpleUnitTestSupportSchedulerService()); + private final HttpClient httpClient; + + HttpBasicAuthResourceLocator() { + this.httpClient = service.getClientFactory().create(new HttpClientConfiguration.Builder().setName("locator").build()); + } + + @Override + public boolean handles(String url) { + return url.startsWith("http"); + } + + @Override + public InputStream getResource(String url) { + HttpAuthentication auth = HttpAuthentication.basic(USERNAME, PASSWORD).build(); + try { + HttpResponse response = httpClient.send(HttpRequest.builder().method(GET).uri(url).build(), 500, false, auth); + if (response.getStatusCode() == 401) { + throw new RuntimeException("Unauthorized"); + } + return response.getEntity().getContent(); + } catch (IOException | TimeoutException e) { + throw new RuntimeException(e); + } + } + + @Override + public void stop() throws MuleException { + service.stop(); + } + + @Override + public void start() throws MuleException { + httpClient.start(); + } + + @Override + public void dispose() {} + + @Override + public void initialise() throws InitialisationException {} +} diff --git a/src/test/java/org/mule/service/soap/metadata/AbstractMetadataTestCase.java b/src/test/java/org/mule/service/soap/metadata/AbstractMetadataTestCase.java new file mode 100644 index 00000000..f197ccea --- /dev/null +++ b/src/test/java/org/mule/service/soap/metadata/AbstractMetadataTestCase.java @@ -0,0 +1,38 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import org.mule.metadata.api.model.MetadataType; +import org.mule.metadata.api.model.ObjectType; +import org.mule.runtime.soap.api.client.metadata.SoapMetadataResolver; +import org.mule.service.soap.AbstractSoapServiceTestCase; + +import org.junit.Before; + +public abstract class AbstractMetadataTestCase extends AbstractSoapServiceTestCase { + + SoapMetadataResolver resolver; + + @Before + public void setup() { + resolver = client.getMetadataResolver(); + } + + ObjectType toObjectType(MetadataType type) { + assertThat(type, is(instanceOf(ObjectType.class))); + return (ObjectType) type; + } + + protected MetadataType getMessageBuilderFieldType(MetadataType messageResult, String name) { + ObjectType objectType = toObjectType(messageResult); + return objectType.getFields().stream() + .filter(f -> f.getKey().getName().getLocalPart().equals(name)).findAny().get().getValue(); + } +} diff --git a/src/test/java/org/mule/service/soap/metadata/AttachmentMetadataTestCase.java b/src/test/java/org/mule/service/soap/metadata/AttachmentMetadataTestCase.java new file mode 100644 index 00000000..0580f88c --- /dev/null +++ b/src/test/java/org/mule/service/soap/metadata/AttachmentMetadataTestCase.java @@ -0,0 +1,96 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import static java.lang.Thread.currentThread; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.core.Is.is; +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.mule.metadata.api.model.*; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.runtime.soap.api.client.SoapClientConfiguration; +import org.mule.runtime.soap.api.client.metadata.SoapMetadataResolver; +import org.mule.runtime.soap.api.client.metadata.SoapOperationMetadata; + +import java.net.URL; +import java.util.Collection; + +import io.qameta.allure.Description; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; +import org.junit.Assert; +import org.junit.Test; +import org.mule.service.soap.client.TestSoapClient; + +@Feature(WSC_EXTENSION) +@Story("Metadata") +public class AttachmentMetadataTestCase extends AbstractMetadataTestCase { + + @Test + @Description("Checks the Input Metadata of an operation with required input attachments") + public void operationWithInputAttachmentMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getInputMetadata("uploadAttachment"); + ObjectType attachments = toObjectType(result.getAttachmentsType()); + Collection attachmentFields = attachments.getFields(); + assertThat(attachmentFields, hasSize(1)); + assertThat(attachmentFields.iterator().next().getKey().getName().getLocalPart(), is("attachment")); + } + + @Test + @Description("Checks the Input Metadata of an operation without attachments") + public void operationWithoutInputAttachmentsMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getInputMetadata("echo"); + assertThat(result.getAttachmentsType(), is(instanceOf(NullType.class))); + } + + @Test + @Description("Checks the Output Metadata of an operation that contains output attachments") + public void operationWithOutputAttachmentsMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getOutputMetadata("downloadAttachment"); + ObjectType objectType = toObjectType(result.getAttachmentsType()); + assertThat(objectType.getFields(), hasSize(1)); + ObjectFieldType attachment = objectType.getFields().iterator().next(); + assertThat(attachment.getKey().getName().getLocalPart(), is("attachment")); + assertThat(attachment.getValue(), is(instanceOf(BinaryType.class))); + assertThat(result.getBodyType(), is(instanceOf(NullType.class))); + } + + @Test + @Description("Checks the metadata for a multipart related output with a body and attachment") + public void multipartOutputOperation() throws MetadataResolvingException { + URL wsdl = currentThread().getContextClassLoader().getResource("wsdl/multipart-output/Multipart.wsdl"); + SoapClientConfiguration configuration = SoapClientConfiguration.builder() + .withDispatcher(dispatcher) + .withAddress("address.com") + .withVersion(soapVersion) + .withWsdlLocation(wsdl.getPath()) + .withService("MultipartService") + .withPort("MultipartPort").build(); + TestSoapClient client = new TestSoapClient(configuration); + SoapMetadataResolver resolver = client.getMetadataResolver(); + SoapOperationMetadata result = resolver.getOutputMetadata("retrieveDocument"); + MetadataType attachmentsType = result.getAttachmentsType(); + assertThat(toObjectType(attachmentsType).getFields().size(), is(1)); + MetadataType bodyType = result.getBodyType(); + Collection bodyFields = toObjectType(bodyType).getFields(); + assertThat(bodyFields.size(), is(1)); + assertThat(bodyFields.iterator().next().getValue().toString(), containsString("AnonType_RetrieveDocumentResponse")); + } + + @Test + @Description("Checks the metadata for an operation that is ONE WAY") + public void oneWayOperationMetadata() throws MetadataResolvingException { + SoapOperationMetadata input = resolver.getInputMetadata("oneWay"); + SoapOperationMetadata output = resolver.getOutputMetadata("oneWay"); + Assert.assertThat(input.getAttachmentsType(), is(instanceOf(NullType.class))); + Assert.assertThat(output.getAttachmentsType(), is(instanceOf(NullType.class))); + } +} diff --git a/src/test/java/org/mule/service/soap/metadata/BodyMetadataTestCase.java b/src/test/java/org/mule/service/soap/metadata/BodyMetadataTestCase.java new file mode 100644 index 00000000..fba2c210 --- /dev/null +++ b/src/test/java/org/mule/service/soap/metadata/BodyMetadataTestCase.java @@ -0,0 +1,133 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import static java.lang.Thread.currentThread; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.hamcrest.Matchers; +import org.mule.metadata.api.annotation.TypeIdAnnotation; +import org.mule.metadata.api.model.MetadataType; +import org.mule.metadata.api.model.NullType; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.metadata.api.model.ObjectType; +import org.mule.metadata.api.model.StringType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.runtime.soap.api.client.SoapClientConfiguration; +import org.mule.runtime.soap.api.client.metadata.SoapMetadataResolver; +import org.mule.runtime.soap.api.client.metadata.SoapOperationMetadata; + +import java.net.URL; +import java.util.Collection; +import java.util.Iterator; + +import io.qameta.allure.Description; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; +import org.junit.Test; +import org.mule.service.soap.client.TestSoapClient; + +@Feature(WSC_EXTENSION) +@Story("Metadata") +public class BodyMetadataTestCase extends AbstractMetadataTestCase { + + @Test + @Description("Checks the dynamic metadata of an operation with required parameters") + public void operationWithSimpleInputParameterMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getInputMetadata("echo"); + MetadataType body = result.getBodyType(); + Collection fields = toObjectType(body).getFields(); + assertThat(fields, hasSize(1)); + ObjectFieldType operationField = fields.iterator().next(); + assertThat(operationField.getKey().getName().getLocalPart(), is("echo")); + Collection operationParams = toObjectType(operationField.getValue()).getFields(); + assertThat(operationParams, hasSize(1)); + ObjectFieldType field = operationParams.iterator().next(); + assertThat(field.getKey().getName().getLocalPart(), is("text")); + assertThat(field.getValue(), is(instanceOf(StringType.class))); + } + + @Test + @Description("Checks the dynamic metadata for an operation without input parameters") + public void operationNoInputParametersMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getInputMetadata("noParams"); + MetadataType body = result.getBodyType(); + Collection fields = toObjectType(body).getFields(); + assertThat(fields, hasSize(1)); + ObjectFieldType operationField = fields.iterator().next(); + assertThat(operationField.getKey().getName().getLocalPart(), is("noParams")); + Collection operationParams = toObjectType(operationField.getValue()).getFields(); + assertThat(operationParams, hasSize(0)); + } + + @Test + @Description("Checks the dynamic metadata of an operation with a complex input parameter") + public void operationComplexInputParameterMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getInputMetadata("echoAccount"); + MetadataType body = result.getBodyType(); + Collection fields = toObjectType(body).getFields(); + assertThat(fields, hasSize(1)); + ObjectFieldType operationField = fields.iterator().next(); + assertThat(operationField.getKey().getName().getLocalPart(), is("echoAccount")); + + Collection operationParams = toObjectType(operationField.getValue()).getFields(); + assertThat(operationParams, hasSize(2)); + Iterator iterator = operationParams.iterator(); + ObjectFieldType accountField = iterator.next(); + assertThat(accountField.getKey().getName().getLocalPart(), is("account")); + + ObjectType accountType = toObjectType(accountField.getValue()); + Collection accountFields = accountType.getFields(); + assertThat(accountFields, hasSize(4)); + + ObjectFieldType name = iterator.next(); + assertThat(name.getKey().getName().getLocalPart(), is("name")); + assertThat(name.getValue(), is(instanceOf(StringType.class))); + } + + @Test + @Description("Checks the Output Body Metadata for an operation that returns a simple string") + public void operationWithSimpleOutputTypeMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getOutputMetadata("echo"); + Collection resultFields = toObjectType(result.getBodyType()).getFields(); + assertThat(resultFields, hasSize(1)); + ObjectType echoType = toObjectType(resultFields.iterator().next().getValue()); + Collection echoFields = echoType.getFields(); + assertThat(echoFields, hasSize(1)); + ObjectFieldType textField = echoFields.iterator().next(); + assertThat(textField.getKey().getName().getLocalPart(), is("text")); + assertThat(textField.getValue(), is(instanceOf(StringType.class))); + } + + @Test + @Description("Checks the Output Body Metadata for an operation that returns a complex element") + public void operationWithComplexOutputTypeMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getOutputMetadata("echoAccount"); + Collection resultFields = toObjectType(result.getBodyType()).getFields(); + assertThat(resultFields, hasSize(1)); + ObjectType echoType = toObjectType(resultFields.iterator().next().getValue()); + Collection echoFields = echoType.getFields(); + assertThat(echoFields, hasSize(1)); + ObjectFieldType accountField = echoFields.iterator().next(); + assertThat(accountField.getKey().getName().getLocalPart(), is("account")); + ObjectType objectType = toObjectType(accountField.getValue()); + assertThat(objectType.getFields(), hasSize(4)); + } + + @Test + @Description("Checks the metadata for an operation that is ONE WAY") + public void oneWayOperationMetadata() throws MetadataResolvingException { + SoapOperationMetadata input = resolver.getInputMetadata("oneWay"); + SoapOperationMetadata output = resolver.getOutputMetadata("oneWay"); + assertThat(output.getBodyType(), is(instanceOf(NullType.class))); + assertThat(toObjectType(input.getBodyType()).getFields(), hasSize(1)); + } +} diff --git a/src/test/java/org/mule/service/soap/metadata/HeadersMetadataTestCase.java b/src/test/java/org/mule/service/soap/metadata/HeadersMetadataTestCase.java new file mode 100644 index 00000000..30dfda3e --- /dev/null +++ b/src/test/java/org/mule/service/soap/metadata/HeadersMetadataTestCase.java @@ -0,0 +1,113 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.metadata; + +import static java.lang.Thread.currentThread; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.collection.IsIn.isIn; +import static org.junit.Assert.assertThat; +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.mule.metadata.api.annotation.TypeIdAnnotation; +import org.mule.metadata.api.model.MetadataType; +import org.mule.metadata.api.model.NullType; +import org.mule.metadata.api.model.ObjectFieldType; +import org.mule.metadata.api.model.ObjectType; +import org.mule.metadata.api.model.StringType; +import org.mule.runtime.api.metadata.MetadataResolvingException; +import org.mule.runtime.soap.api.client.SoapClientConfiguration; +import org.mule.runtime.soap.api.client.metadata.SoapOperationMetadata; +import org.mule.service.soap.client.TestSoapClient; + +import java.net.URL; +import java.util.Collection; + +import io.qameta.allure.Description; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; +import org.hamcrest.core.Is; +import org.junit.Test; + +@Feature(WSC_EXTENSION) +@Story("Metadata") +public class HeadersMetadataTestCase extends AbstractMetadataTestCase { + + @Test + @Description("Checks the input Soap Headers metadata for an operation with headers") + public void operationWithInputHeadersMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getInputMetadata("echoWithHeaders"); + ObjectType headers = toObjectType(result.getHeadersType()); + Collection fields = headers.getFields(); + assertThat(fields, hasSize(2)); + fields.forEach(field -> { + Collection headerFields = ((ObjectType) field.getValue()).getFields(); + assertThat(headerFields, hasSize(1)); + MetadataType headerField = headerFields.iterator().next().getValue(); + assertThat(headerField, is(instanceOf(StringType.class))); + }); + } + + @Test + @Description("Checks the input Soap Headers metadata for an operation without headers") + public void operationWithoutInputHeadersMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getInputMetadata("echo"); + assertThat(result.getHeadersType(), is(instanceOf(NullType.class))); + } + + @Test + @Description("Checks the metadata for a Header that is defined in another message that is not the main operation message") + public void operationWithCommonHeaderDefinedInDifferentMessageMetadata() throws MetadataResolvingException { + URL humanWsdl = currentThread().getContextClassLoader().getResource("wsdl/human.wsdl"); + SoapClientConfiguration configuration = SoapClientConfiguration.builder() + .withDispatcher(dispatcher) + .withAddress("address.com") + .withVersion(soapVersion) + .withWsdlLocation(humanWsdl.getPath()) + .withService("Human_ResourcesService") + .withPort("Human_Resources").build(); + TestSoapClient humanWsdlClient = new TestSoapClient(configuration); + SoapOperationMetadata result = humanWsdlClient.getMetadataResolver().getInputMetadata("Get_Employee"); + ObjectType headers = toObjectType(result.getHeadersType()); + assertThat(headers.getFields(), hasSize(1)); + ObjectFieldType header = headers.getFields().iterator().next(); + assertThat(header.getKey().getName().getLocalPart(), is("header")); + String headerTypeId = header.getValue().getAnnotation(TypeIdAnnotation.class).get().getValue(); + assertThat(headerTypeId, is("#root:{urn:com.workday/bsvc}Workday_Common_Header")); + } + + @Test + @Description("Checks the Output Attributes Metadata for an operation with output soap headers") + public void operationWithOutputSoapHeadersMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getOutputMetadata("echoWithHeaders"); + ObjectType outputHeaders = toObjectType(result.getHeadersType()); + assertThat(outputHeaders.getFields(), hasSize(2)); + outputHeaders.getFields().forEach(e -> { + assertThat(e.getKey().getName().getLocalPart(), isIn(new String[] {"headerOut", "headerInOut"})); + MetadataType value = toObjectType(e.getValue()).getFields().iterator().next().getValue(); + assertThat(value, is(instanceOf(StringType.class))); + }); + } + + @Test + @Description("Checks the Output Attributes Metadata for an operation without output soap headers") + public void operationWithoutOutputSoapHeadersMetadata() throws MetadataResolvingException { + SoapOperationMetadata result = resolver.getOutputMetadata("echo"); + MetadataType outputHeaders = result.getHeadersType(); + assertThat(outputHeaders, is(instanceOf(NullType.class))); + } + + @Test + @Description("Checks the metadata for an operation that is ONE WAY") + public void oneWayOperationMetadata() throws MetadataResolvingException { + SoapOperationMetadata input = resolver.getInputMetadata("oneWay"); + SoapOperationMetadata output = resolver.getOutputMetadata("oneWay"); + assertThat(input.getHeadersType(), Is.is(instanceOf(NullType.class))); + assertThat(output.getHeadersType(), Is.is(instanceOf(NullType.class))); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/CustomDispatcherTestCase.java b/src/test/java/org/mule/service/soap/runtime/CustomDispatcherTestCase.java new file mode 100644 index 00000000..66d6d7de --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/CustomDispatcherTestCase.java @@ -0,0 +1,69 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime; + +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.junit.Assert.assertThat; +import static org.mule.runtime.soap.api.message.SoapRequest.builder; +import static org.mule.service.soap.SoapTestUtils.assertSimilarXml; +import static org.mule.service.soap.client.TestSoapClient.getDefaultConfiguration; + +import org.mule.runtime.extension.api.soap.message.DispatchingRequest; +import org.mule.runtime.extension.api.soap.message.DispatchingResponse; +import org.mule.runtime.extension.api.soap.message.MessageDispatcher; +import org.mule.runtime.soap.api.message.ImmutableSoapRequest; +import org.mule.runtime.soap.api.message.SoapRequest; +import org.mule.runtime.soap.api.message.SoapResponse; +import org.mule.service.soap.AbstractSoapServiceTestCase; +import org.mule.service.soap.client.TestSoapClient; +import com.google.common.collect.ImmutableMap; +import org.junit.Test; +import java.io.ByteArrayInputStream; +import java.util.Map; + +public class CustomDispatcherTestCase extends AbstractSoapServiceTestCase { + + private static final String RESPONSE = "RESPONSE"; + + @Test + public void customDispatcher() throws Exception { + SoapResponse response = getTestClient().consume(SoapRequest.empty("noParams")); + assertSimilarXml(RESPONSE, response.getContent()); + } + + @Test + public void transportHeaders() { + ImmutableSoapRequest request = builder().operation("noParams").transportHeaders(ImmutableMap.builder() + .put("H1", "H1Value") + .put("H2", "H2Value") + .build()).build(); + SoapResponse response = getTestClient().consume(request); + Map transportHeaders = response.getTransportHeaders(); + assertThat(transportHeaders.entrySet(), hasSize(4)); + assertThat(transportHeaders, hasEntry("H1", "H1Value")); + assertThat(transportHeaders, hasEntry("H2", "H2Value")); + } + + private TestSoapClient getTestClient() { + return new TestSoapClient(getDefaultConfiguration(server.getDefaultAddress()) + .withVersion(soapVersion) + .withDispatcher(new TestDispatcher()) + .build()); + } + + public class TestDispatcher implements MessageDispatcher { + + @Override + public DispatchingResponse dispatch(DispatchingRequest request) { + String envelope = "" + + "" + RESPONSE + "" + + ""; + return new DispatchingResponse(new ByteArrayInputStream(envelope.getBytes()), request.getHeaders()); + } + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/OperationExecutionTestCase.java b/src/test/java/org/mule/service/soap/runtime/OperationExecutionTestCase.java new file mode 100644 index 00000000..6a092063 --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/OperationExecutionTestCase.java @@ -0,0 +1,153 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime; + +import static java.lang.Thread.currentThread; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.core.Is.is; +import static org.mule.runtime.api.metadata.MediaType.APPLICATION_XML; +import static org.mule.runtime.soap.api.message.SoapRequest.builder; +import static org.mule.service.soap.SoapTestUtils.assertSimilarXml; +import static org.mule.service.soap.SoapTestXmlValues.ECHO; +import static org.mule.service.soap.SoapTestXmlValues.ECHO_ACCOUNT; +import static org.mule.service.soap.SoapTestXmlValues.ECHO_HEADERS; +import static org.mule.service.soap.SoapTestXmlValues.HEADER_IN; +import static org.mule.service.soap.SoapTestXmlValues.HEADER_INOUT; +import static org.mule.service.soap.SoapTestXmlValues.HEADER_OUT; +import static org.mule.service.soap.SoapTestXmlValues.NO_PARAMS; +import static org.mule.service.soap.SoapTestXmlValues.ONE_WAY; +import static org.mule.service.soap.client.TestSoapClient.getDefaultConfiguration; +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.mule.runtime.soap.api.client.SoapClient; +import org.mule.runtime.soap.api.message.ImmutableSoapRequest; +import org.mule.runtime.soap.api.message.SoapRequest; +import org.mule.runtime.soap.api.message.SoapResponse; +import org.mule.service.soap.AbstractSoapServiceTestCase; +import org.mule.service.soap.client.TestSoapClient; + +import com.google.common.collect.ImmutableMap; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Map; + +import io.qameta.allure.Description; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +@Feature(WSC_EXTENSION) +@Story("Operation Execution") +public class OperationExecutionTestCase extends AbstractSoapServiceTestCase { + + @Test + @Description("Consumes an operation that expects a simple type and returns a simple type") + public void simpleOperation() throws Exception { + testSimpleOperation(client); + } + + @Test + @Description("Consumes an operation using a connection that uses a local .wsdl file") + public void echoWithLocalWsdl() throws Exception { + URL wsdl = currentThread().getContextClassLoader().getResource("wsdl/simple-service.wsdl"); + TestSoapClient localWsdlClient = new TestSoapClient(getDefaultConfiguration(server.getDefaultAddress()) + .withWsdlLocation(wsdl.getPath()) + .withDispatcher(dispatcher) + .withVersion(soapVersion).build()); + testSimpleOperation(localWsdlClient); + } + + @Test + @Description("Consumes an operation that expects an input and a set of headers and returns a simple type and a set of headers") + public void simpleOperationWithHeaders() throws Exception { + Map headers = ImmutableMap.builder() + .put(HEADER_IN, testValues.getHeaderIn()) + .put(HEADER_INOUT, testValues.getHeaderInOutRequest()) + .build(); + + ImmutableSoapRequest req = + builder().content(testValues.getEchoWithHeadersRequest()) + .operation(ECHO_HEADERS) + .soapHeaders(headers) + .contentType(APPLICATION_XML) + .build(); + + SoapResponse response = client.consume(req); + assertSimilarXml(response.getSoapHeaders().get(HEADER_OUT), testValues.getHeaderOut()); + assertSimilarXml(response.getSoapHeaders().get(HEADER_INOUT), testValues.getHeaderInOutResponse()); + assertSimilarXml(testValues.getEchoWithHeadersResponse(), response.getContent()); + } + + @Test + @Description("Consumes an operation that expects 2 parameters (a simple one and a complex one) and returns a complex type") + public void complexTypeOperation() throws Exception { + ImmutableSoapRequest req = builder().content(testValues.getEchoAccountRequest()).operation(ECHO_ACCOUNT).build(); + SoapResponse response = client.consume(req); + assertThat(response.getSoapHeaders().isEmpty(), is(true)); + assertSimilarXml(testValues.getEchoAccountResponse(), response.getContent()); + } + + @Test + @Description("Consumes an operation that expects no parameters and returns a simple type") + public void noParamsOperation() throws Exception { + SoapRequest req = builder().content(testValues.getNoParamsRequest()).operation(NO_PARAMS).build(); + testNoParams(req); + } + + @Test + @Description("Consumes an operation that expects no parameters and returns a simple type") + public void large() throws Exception { + SoapRequest req = builder().operation("large").build(); + InputStream response = client.consume(req).getContent(); + String largeContent = IOUtils.toString(currentThread().getContextClassLoader().getResource("large.json").openStream()); + assertSimilarXml(testValues.buildXml("largeResponse", "" + largeContent + ""), response); + } + + @Test + @Description("Consumes an operation that expects no parameters auto-generating the request and returns a simple type") + public void noParamsOperationWithoutXmlPayload() throws Exception { + testNoParams(SoapRequest.empty(NO_PARAMS)); + } + + @Test + @Description("Consumes an operation and checks the output transport headers") + public void transportHeaders() { + SoapRequest request = builder().content(testValues.getEchoResquest()).operation(ECHO).build(); + SoapResponse response = client.consume(request); + Map transportHeaders = response.getTransportHeaders(); + assertThat(transportHeaders.entrySet(), hasSize(4)); + } + + @Test + @Description("Consumes an operation that is one way, without response") + public void oneWayOperation() throws IOException { + SoapRequest req = builder().operation(ONE_WAY).content(testValues.getOneWayRequest()).build(); + SoapResponse response = client.consume(req); + assertThat(IOUtils.toString(response.getContent()), is("")); + assertThat(response.getContentType(), is(nullValue())); + } + + private void testSimpleOperation(SoapClient client) throws Exception { + SoapRequest request = builder().content(testValues.getEchoResquest()).operation(ECHO).build(); + SoapResponse response = client.consume(request); + assertThat(response.getSoapHeaders().isEmpty(), is(true)); + assertSimilarXml(testValues.getEchoResponse(), response.getContent()); + } + + private void testNoParams(SoapRequest request) throws Exception { + SoapResponse response = client.consume(request); + assertThat(response.getSoapHeaders().isEmpty(), is(true)); + assertSimilarXml(testValues.getNoParamsResponse(), response.getContent()); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/SoapClientFactoryTestCase.java b/src/test/java/org/mule/service/soap/runtime/SoapClientFactoryTestCase.java new file mode 100644 index 00000000..820dab0b --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/SoapClientFactoryTestCase.java @@ -0,0 +1,79 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime; + +import static org.mockito.Mockito.mock; +import static org.mule.runtime.soap.api.client.SoapClientConfiguration.builder; +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; +import static java.lang.Thread.currentThread; + +import org.mule.runtime.api.connection.ConnectionException; +import org.mule.runtime.extension.api.soap.message.MessageDispatcher; +import org.mule.runtime.soap.api.client.SoapClientFactory; +import org.mule.service.soap.AbstractSoapServiceTestCase; +import org.mule.service.soap.SoapServiceImplementation; + +import java.net.URL; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import io.qameta.allure.Description; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; + +@Feature(WSC_EXTENSION) +@Story("Connection") +public class SoapClientFactoryTestCase extends AbstractSoapServiceTestCase { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + private SoapClientFactory factory = new SoapServiceImplementation().getClientFactory(); + + @Test + @Description("Tries to instantiate a connection with an RPC WSDL and fails.") + public void rpcWsdlFails() throws Exception { + expectedException.expect(ConnectionException.class); + expectedException.expectMessage("RPC WSDLs are not supported"); + URL resource = currentThread().getContextClassLoader().getResource("wsdl/rpc.wsdl"); + factory.create(builder() + .withPort("SoapResponderPortType") + .withService("SoapResponder") + .withDispatcher(mock(MessageDispatcher.class)) + .withWsdlLocation(resource.getPath()) + .build()); + } + + @Test + @Description("Tries to create a client with an invalid service") + public void invalidService() throws Exception { + expectedException.expect(ConnectionException.class); + expectedException.expectMessage("Service [INVALID_SERVICE] is not defined in the wsdl"); + URL resource = currentThread().getContextClassLoader().getResource("wsdl/simple-service.wsdl"); + factory.create(builder() + .withPort("INVALID PORT") + .withService("INVALID_SERVICE") + .withDispatcher(mock(MessageDispatcher.class)) + .withWsdlLocation(resource.getPath()) + .build()); + } + + @Test + @Description("Tries to create a client with an invalid service") + public void invalidPort() throws Exception { + expectedException.expect(ConnectionException.class); + expectedException.expectMessage("Port [INVALID PORT] not found in service [TestService]"); + URL resource = currentThread().getContextClassLoader().getResource("wsdl/simple-service.wsdl"); + factory.create(builder() + .withPort("INVALID PORT") + .withService("TestService") + .withDispatcher(mock(MessageDispatcher.class)) + .withWsdlLocation(resource.getPath()) + .build()); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/SoapFaultTestCase.java b/src/test/java/org/mule/service/soap/runtime/SoapFaultTestCase.java new file mode 100644 index 00000000..188d5100 --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/SoapFaultTestCase.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.isOneOf; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.StringContains.containsString; +import static org.mule.runtime.soap.api.message.SoapRequest.builder; +import static org.mule.service.soap.SoapTestXmlValues.FAIL; +import org.mule.runtime.soap.api.exception.BadRequestException; +import org.mule.runtime.soap.api.exception.SoapFaultException; +import org.mule.service.soap.AbstractSoapServiceTestCase; + +import io.qameta.allure.Description; +import io.qameta.allure.Feature; +import io.qameta.allure.Stories; +import io.qameta.allure.Story; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +@Feature("SOAP SERVICE") +@Stories({@Story("Operation Execution"), @Story("Soap Fault")}) +public class SoapFaultTestCase extends AbstractSoapServiceTestCase { + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Test + @Description("Consumes an operation that throws a SOAP Fault and expects a Soap Fault Exception") + public void failOperation() throws Exception { + try { + client.consume(builder().content(testValues.getFailRequest()).operation(FAIL).build()); + } catch (SoapFaultException e) { + // Server is for 1.1, Receiver for 1.2 + assertThat(e.getFaultCode().getLocalPart(), isOneOf("Server", "Receiver")); + assertThat(e.getReason(), is("Fail Message")); + assertThat(e.getDetail(), containsString("EchoException")); + assertThat(e.getDetail(), containsString("Fail Message")); + } + } + + @Test + @Description("Consumes an operation that does not exist and throws a SOAP Fault because of it and asserts the thrown exception") + public void noExistentOperation() throws Exception { + expectedException.expect(BadRequestException.class); + expectedException.expectMessage("The provided operation [FAIL] does not exist in the WSDL file"); + client.consume(builder().content(testValues.buildXml("FAIL", "")).operation("FAIL").build()); + } + + @Test + @Description("Consumes an operation with a body that is not a valid XML") + public void echoBodyIsNotValidXml() throws Exception { + expectedException.expect(BadRequestException.class); + expectedException.expectMessage("Error consuming the operation [echo], the request body is not a valid XML"); + client.consume(builder().operation("echo").content("Invalid Test Payload: this is not an XML").build()); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/attachments/AttachmentsTestCase.java b/src/test/java/org/mule/service/soap/runtime/attachments/AttachmentsTestCase.java new file mode 100644 index 00000000..f53d71db --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/attachments/AttachmentsTestCase.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.attachments; + +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; +import static org.mule.runtime.api.metadata.MediaType.HTML; +import static org.mule.runtime.soap.api.message.SoapRequest.builder; +import static org.mule.service.soap.SoapTestUtils.assertSimilarXml; +import static org.mule.service.soap.SoapTestXmlValues.DOWNLOAD_ATTACHMENT; +import static org.mule.service.soap.SoapTestXmlValues.UPLOAD_ATTACHMENT; + +import org.mule.runtime.extension.api.soap.SoapAttachment; +import org.mule.runtime.soap.api.message.SoapRequest; +import org.mule.runtime.soap.api.message.SoapResponse; +import org.mule.service.soap.AbstractSoapServiceTestCase; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import io.qameta.allure.Description; +import java.io.ByteArrayInputStream; +import java.util.Map; + +public class AttachmentsTestCase extends AbstractSoapServiceTestCase { + + @Test + @Description("Downloads an attachment from a mtom server") + public void downloadAttachment() throws Exception { + SoapRequest req = builder().content(testValues.getDownloadAttachmentRequest()).operation(DOWNLOAD_ATTACHMENT).build(); + SoapResponse response = client.consume(req); + assertSimilarXml(testValues.getDownloadAttachmentResponse(), response.getContent()); + Map attachments = response.getAttachments(); + assertThat(attachments.entrySet(), hasSize(1)); + SoapAttachment attachment = attachments.entrySet().iterator().next().getValue(); + assertThat(IOUtils.toString(attachment.getContent()), containsString("Simple Attachment Content")); + } + + @Test + @Description("Uploads an attachment to a mtom server") + public void uploadAttachment() throws Exception { + SoapRequest request = builder() + .attachment("attachment", new SoapAttachment(new ByteArrayInputStream("Some Content".getBytes()), HTML)) + .content(testValues.getUploadAttachmentRequest()) + .operation(UPLOAD_ATTACHMENT) + .build(); + SoapResponse response = client.consume(request); + assertSimilarXml(testValues.getUploadAttachmentResponse(), response.getContent()); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/attachments/MtomAttachmentsTestCase.java b/src/test/java/org/mule/service/soap/runtime/attachments/MtomAttachmentsTestCase.java new file mode 100644 index 00000000..531da5ce --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/attachments/MtomAttachmentsTestCase.java @@ -0,0 +1,25 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.attachments; + +import static org.mule.runtime.soap.api.SoapVersion.SOAP11; + +import org.mule.service.soap.service.Mtom11Service; +import org.mule.service.soap.service.Mtom12Service; + +public class MtomAttachmentsTestCase extends AttachmentsTestCase { + + @Override + protected String getServiceClass() { + return soapVersion.equals(SOAP11) ? Mtom11Service.class.getName() : Mtom12Service.class.getName(); + } + + @Override + protected boolean isMtom() { + return true; + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/wss/AbstractWebServiceSecurityTestCase.java b/src/test/java/org/mule/service/soap/runtime/wss/AbstractWebServiceSecurityTestCase.java new file mode 100644 index 00000000..690c6d53 --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/wss/AbstractWebServiceSecurityTestCase.java @@ -0,0 +1,28 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.wss; + +import static org.mule.runtime.soap.api.message.SoapRequest.builder; + +import org.mule.runtime.soap.api.message.SoapRequest; +import org.mule.service.soap.AbstractSoapServiceTestCase; + +import org.junit.Test; +import io.qameta.allure.Description; + +public abstract class AbstractWebServiceSecurityTestCase extends AbstractSoapServiceTestCase { + + @Test + @Description("Consumes a simple operation of a secured web service and expects a valid response") + public void expectedSecuredRequest() throws Exception { + SoapRequest req = builder() + .content("test") + .operation("echo") + .build(); + client.consume(req); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/wss/WssDecryptTestCase.java b/src/test/java/org/mule/service/soap/runtime/wss/WssDecryptTestCase.java new file mode 100644 index 00000000..ff5e478d --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/wss/WssDecryptTestCase.java @@ -0,0 +1,52 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.wss; + +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; +import static java.util.Collections.singletonList; +import org.mule.runtime.extension.api.soap.security.DecryptSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.SecurityStrategy; +import org.mule.runtime.extension.api.soap.security.config.WssKeyStoreConfiguration; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; + +@Feature(WSC_EXTENSION) +@Story("WSS") +public class WssDecryptTestCase extends AbstractWebServiceSecurityTestCase { + + @Override + protected Interceptor buildOutInterceptor() { + final Map props = new HashMap<>(); + props.put("action", "Encrypt"); + props.put("encryptionUser", "s1as"); + + final String encryptionPropRefId = "securityProperties"; + props.put("encryptionPropRefId", encryptionPropRefId); + final Properties securityProperties = new Properties(); + securityProperties.put("org.apache.ws.security.crypto.merlin.truststore.type", "jks"); + securityProperties.put("org.apache.ws.security.crypto.merlin.truststore.password", "changeit"); + securityProperties.put("org.apache.ws.security.crypto.merlin.truststore.file", "security/ssltest-cacerts.jks"); + props.put(encryptionPropRefId, securityProperties); + + return new WSS4JOutInterceptor(props); + } + + @Override + protected List getSecurityStrategies() { + return singletonList(new DecryptSecurityStrategy( + new WssKeyStoreConfiguration("s1as", "changeit", "changeit", + "security/ssltest-keystore.jks", "jks"))); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/wss/WssEncryptTestCase.java b/src/test/java/org/mule/service/soap/runtime/wss/WssEncryptTestCase.java new file mode 100644 index 00000000..7a545fee --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/wss/WssEncryptTestCase.java @@ -0,0 +1,54 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.wss; + + +import static java.util.Collections.singletonList; +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.mule.runtime.extension.api.soap.security.EncryptSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.SecurityStrategy; +import org.mule.runtime.extension.api.soap.security.config.WssKeyStoreConfiguration; +import org.mule.service.soap.service.EncryptPasswordCallback; +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; +import org.apache.wss4j.common.crypto.Merlin; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +@Feature(WSC_EXTENSION) +@Story("WSS") +public class WssEncryptTestCase extends AbstractWebServiceSecurityTestCase { + + @Override + protected Interceptor buildInInterceptor() { + final Map props = new HashMap<>(); + props.put("action", "Encrypt"); + props.put("passwordCallbackClass", EncryptPasswordCallback.class.getName()); + final String decryptionPropRefId = "securityProperties"; + props.put("decryptionPropRefId", decryptionPropRefId); + final Properties securityProperties = new Properties(); + securityProperties.put("org.apache.ws.security.crypto.provider", Merlin.class.getName()); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.type", "jks"); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.password", "changeit"); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.private.password", "changeit"); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.alias", "s1as"); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.file", "security/ssltest-keystore.jks"); + props.put(decryptionPropRefId, securityProperties); + return new WSS4JInInterceptor(props); + } + + @Override + protected List getSecurityStrategies() { + WssKeyStoreConfiguration keyStoreConfig = new WssKeyStoreConfiguration("s1as", "changeit", "security/ssltest-cacerts.jks"); + return singletonList(new EncryptSecurityStrategy(keyStoreConfig)); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/wss/WssSignTestCase.java b/src/test/java/org/mule/service/soap/runtime/wss/WssSignTestCase.java new file mode 100644 index 00000000..290feca0 --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/wss/WssSignTestCase.java @@ -0,0 +1,51 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.wss; + +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; +import static java.util.Collections.singletonList; +import org.mule.runtime.extension.api.soap.security.SecurityStrategy; +import org.mule.runtime.extension.api.soap.security.SignSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.config.WssKeyStoreConfiguration; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; + +@Feature(WSC_EXTENSION) +@Story("WSS") +public class WssSignTestCase extends AbstractWebServiceSecurityTestCase { + + @Override + protected Interceptor buildInInterceptor() { + final Map props = new HashMap<>(); + props.put("action", "Signature"); + + final String signaturePropRefId = "serverInSecurityProperties"; + props.put("signaturePropRefId", signaturePropRefId); + final Properties securityProperties = new Properties(); + securityProperties.put("org.apache.ws.security.crypto.merlin.truststore.type", "jks"); + securityProperties.put("org.apache.ws.security.crypto.merlin.truststore.password", "mulepassword"); + securityProperties.put("org.apache.ws.security.crypto.merlin.truststore.file", "security/trustStore"); + props.put(signaturePropRefId, securityProperties); + + return new WSS4JInInterceptor(props); + } + + @Override + protected List getSecurityStrategies() { + return singletonList(new SignSecurityStrategy( + new WssKeyStoreConfiguration("muleclient", "mulepassword", "mulepassword", + "security/clientKeystore", "jks"))); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/wss/WssTimestampTestCase.java b/src/test/java/org/mule/service/soap/runtime/wss/WssTimestampTestCase.java new file mode 100644 index 00000000..d498a5cf --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/wss/WssTimestampTestCase.java @@ -0,0 +1,46 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.wss; + +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; +import static java.util.Collections.singletonList; +import org.mule.runtime.extension.api.soap.security.SecurityStrategy; +import org.mule.runtime.extension.api.soap.security.TimestampSecurityStrategy; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; + +@Feature(WSC_EXTENSION) +@Story("WSS") +public class WssTimestampTestCase extends AbstractWebServiceSecurityTestCase { + + @Override + protected Interceptor buildInInterceptor() { + final Map props = new HashMap<>(); + props.put("action", "Timestamp"); + return new WSS4JInInterceptor(props); + } + + @Override + protected Interceptor buildOutInterceptor() { + final Map props = new HashMap<>(); + props.put("action", "Timestamp"); + return new WSS4JOutInterceptor(props); + } + + @Override + protected List getSecurityStrategies() { + return singletonList(new TimestampSecurityStrategy(30)); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/wss/WssUsernameTestCase.java b/src/test/java/org/mule/service/soap/runtime/wss/WssUsernameTestCase.java new file mode 100644 index 00000000..749b00b1 --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/wss/WssUsernameTestCase.java @@ -0,0 +1,42 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.wss; + +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; +import static java.util.Collections.singletonList; + +import static org.mule.runtime.extension.api.soap.security.PasswordType.TEXT; +import org.mule.runtime.extension.api.soap.security.SecurityStrategy; +import org.mule.runtime.extension.api.soap.security.UsernameTokenSecurityStrategy; +import org.mule.service.soap.service.ServerPasswordCallback; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; + +@Feature(WSC_EXTENSION) +@Story("WSS") +public class WssUsernameTestCase extends AbstractWebServiceSecurityTestCase { + + @Override + protected Interceptor buildInInterceptor() { + final Map props = new HashMap<>(); + props.put("action", "UsernameToken"); + props.put("passwordCallbackClass", ServerPasswordCallback.class.getName()); + return new WSS4JInInterceptor(props); + } + + @Override + protected List getSecurityStrategies() { + return singletonList(new UsernameTokenSecurityStrategy("admin", "textPassword", TEXT, true, true)); + } +} diff --git a/src/test/java/org/mule/service/soap/runtime/wss/WssVerifySignatureTestCase.java b/src/test/java/org/mule/service/soap/runtime/wss/WssVerifySignatureTestCase.java new file mode 100644 index 00000000..f23adf0d --- /dev/null +++ b/src/test/java/org/mule/service/soap/runtime/wss/WssVerifySignatureTestCase.java @@ -0,0 +1,57 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.runtime.wss; + + +import static java.util.Collections.singletonList; +import static org.mule.test.allure.AllureConstants.WscFeature.WSC_EXTENSION; + +import org.mule.runtime.extension.api.soap.security.SecurityStrategy; +import org.mule.runtime.extension.api.soap.security.VerifySignatureSecurityStrategy; +import org.mule.runtime.extension.api.soap.security.config.WssTrustStoreConfiguration; +import org.mule.service.soap.service.VerifyPasswordCallback; +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; +import org.apache.wss4j.common.crypto.Merlin; +import io.qameta.allure.Feature; +import io.qameta.allure.Story; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +@Feature(WSC_EXTENSION) +@Story("WSS") +public class WssVerifySignatureTestCase extends AbstractWebServiceSecurityTestCase { + + @Override + protected Interceptor buildOutInterceptor() { + final Map props = new HashMap<>(); + props.put("action", "Signature"); + props.put("signatureUser", "muleserver"); + props.put("passwordCallbackClass", VerifyPasswordCallback.class.getName()); + + final String signaturePropRefId = "serverOutSecurityProperties"; + props.put("signaturePropRefId", signaturePropRefId); + final Properties securityProperties = new Properties(); + securityProperties.put("org.apache.ws.security.crypto.provider", Merlin.class.getName()); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.type", "jks"); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.password", "mulepassword"); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.private.password", "mulepassword"); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.alias", "muleserver"); + securityProperties.put("org.apache.ws.security.crypto.merlin.keystore.file", "security/serverKeystore"); + props.put(signaturePropRefId, securityProperties); + + return new WSS4JOutInterceptor(props); + } + + @Override + protected List getSecurityStrategies() { + WssTrustStoreConfiguration trustStoreConfig = new WssTrustStoreConfiguration("security/trustStore", "mulepassword", "jks"); + return singletonList(new VerifySignatureSecurityStrategy(trustStoreConfig)); + } +} diff --git a/src/test/java/org/mule/service/soap/server/BasicAuthHttpServer.java b/src/test/java/org/mule/service/soap/server/BasicAuthHttpServer.java new file mode 100644 index 00000000..8be2b7ab --- /dev/null +++ b/src/test/java/org/mule/service/soap/server/BasicAuthHttpServer.java @@ -0,0 +1,78 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.server; + +import static org.eclipse.jetty.servlet.ServletContextHandler.SESSIONS; +import static org.eclipse.jetty.util.security.Constraint.__BASIC_AUTH; +import static org.eclipse.jetty.util.security.Credential.getCredential; + +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.transport.servlet.CXFNonSpringServlet; +import org.eclipse.jetty.security.ConstraintMapping; +import org.eclipse.jetty.security.ConstraintSecurityHandler; +import org.eclipse.jetty.security.HashLoginService; +import org.eclipse.jetty.security.SecurityHandler; +import org.eclipse.jetty.security.UserStore; +import org.eclipse.jetty.security.authentication.BasicAuthenticator; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.eclipse.jetty.util.security.Constraint; + +public class BasicAuthHttpServer extends HttpServer { + + public static final String USERNAME = "juani"; + public static final String PASSWORD = "changeIt"; + + public BasicAuthHttpServer(int port, Interceptor in, Interceptor out, Object serviceInstance) { + super(port, in, out, serviceInstance); + } + + @Override + protected void init() { + try { + CXFNonSpringServlet cxf = new CXFNonSpringServlet(); + ServletHolder servlet = new ServletHolder(cxf); + servlet.setName("server"); + servlet.setForcedPath("/"); + ServletContextHandler context = new ServletContextHandler(SESSIONS); + context.setSecurityHandler(getBasicAuth()); + context.setContextPath("/"); + context.addServlet(servlet, "/*"); + httpServer.setHandler(context); + httpServer.start(); + initializeServer(cxf); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private SecurityHandler getBasicAuth() { + UserStore userStore = new UserStore(); + userStore.addUser(USERNAME, getCredential(PASSWORD), new String[] {"user"}); + + HashLoginService l = new HashLoginService(); + l.setUserStore(userStore); + l.setName("private"); + + Constraint constraint = new Constraint(); + constraint.setName(__BASIC_AUTH); + constraint.setRoles(new String[] {"user"}); + constraint.setAuthenticate(true); + + ConstraintMapping cm = new ConstraintMapping(); + cm.setConstraint(constraint); + cm.setPathSpec("/*"); + + ConstraintSecurityHandler csh = new ConstraintSecurityHandler(); + csh.setAuthenticator(new BasicAuthenticator()); + csh.setRealmName("testRealm"); + csh.addConstraintMapping(cm); + csh.setLoginService(l); + return csh; + } + +} diff --git a/src/test/java/org/mule/service/soap/server/HttpServer.java b/src/test/java/org/mule/service/soap/server/HttpServer.java new file mode 100644 index 00000000..3c3f374b --- /dev/null +++ b/src/test/java/org/mule/service/soap/server/HttpServer.java @@ -0,0 +1,124 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.server; + +import org.apache.cxf.Bus; +import org.apache.cxf.BusFactory; +import org.apache.cxf.interceptor.Interceptor; +import org.apache.cxf.transport.servlet.CXFNonSpringServlet; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.ServletHandler; +import org.eclipse.jetty.servlet.ServletHolder; + +import javax.xml.ws.Endpoint; + +public class HttpServer { + + final Server httpServer; + private final String defaultAddress; + private final Interceptor in; + private final Interceptor out; + private final Object serviceInstance; + + public HttpServer(int port, Object serviceInstance) { + this(port, null, null, serviceInstance); + } + + public HttpServer(int port, Interceptor in, Interceptor out, Object serviceInstance) { + this.httpServer = new Server(port); + this.defaultAddress = "http://localhost:" + port + "/server"; + this.in = in; + this.out = out; + this.serviceInstance = serviceInstance; + init(); + } + + protected void init() { + try { + ServletHandler servletHandler = new ServletHandler(); + httpServer.setHandler(servletHandler); + CXFNonSpringServlet cxf = new CXFNonSpringServlet(); + ServletHolder servlet = new ServletHolder(cxf); + servlet.setName("server"); + servlet.setForcedPath("/"); + servletHandler.addServletWithMapping(servlet, "/*"); + initializeServer(cxf); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + void initializeServer(CXFNonSpringServlet cxf) { + try { + httpServer.start(); + } catch (Exception e) { + throw new RuntimeException(e); + } + Bus bus = cxf.getBus(); + if (in != null) { + bus.getInInterceptors().add(in); + } + if (out != null) { + bus.getOutInterceptors().add(out); + } + BusFactory.setDefaultBus(bus); + Endpoint.publish("/server", serviceInstance); + } + + public void stop() throws Exception { + httpServer.stop(); + httpServer.destroy(); + } + + public String getDefaultAddress() { + return defaultAddress; + } + + /** + * Starts this server, which is stopped when the JVM is shutdown. + *

+ * The expected arguments are: + *

    + *
  • portNumber: The port where the HTTP server will listen for SOAP requests.
  • + *
  • serviceClass: Refer to @link {@link Endpoint#publish(String, Object)}
  • + *
+ */ + public static void main(String[] args) { + final int port; + final Object service; + try { + port = Integer.parseInt(args[0]); + service = Class.forName(args[1]).newInstance(); + } catch (NumberFormatException | InstantiationException | IllegalAccessException | ClassNotFoundException e) { + e.printStackTrace(); + System.exit(-1); + return; + } + + final HttpServer server = new HttpServer(port, service); + + Runtime.getRuntime().addShutdownHook(new Thread() { + + @Override + public void run() { + try { + server.stop(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + + while (true) { + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + System.exit(0); + } + } + } +} diff --git a/src/test/java/org/mule/service/soap/service/Account.java b/src/test/java/org/mule/service/soap/service/Account.java new file mode 100644 index 00000000..87dd4b92 --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/Account.java @@ -0,0 +1,53 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +public class Account { + + private Long id; + private String clientName; + private Calendar startingDate; + private List items = new ArrayList<>(); + + public Account() {} + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getClientName() { + return clientName; + } + + public void setClientName(String clientName) { + this.clientName = clientName; + } + + public Calendar getStartingDate() { + return startingDate; + } + + public void setStartingDate(Calendar startingDate) { + this.startingDate = startingDate; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } +} diff --git a/src/test/java/org/mule/service/soap/service/EchoException.java b/src/test/java/org/mule/service/soap/service/EchoException.java new file mode 100644 index 00000000..6dc6542d --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/EchoException.java @@ -0,0 +1,27 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + + +import javax.xml.ws.WebFault; + + +@WebFault +public class EchoException extends Exception { + + private EchoFault echoFault; + + public EchoException(String message) { + super(message); + this.echoFault = new EchoFault(); + this.echoFault.setText(message); + } + + public EchoFault getFaultInfo() { + return echoFault; + } +} diff --git a/src/test/java/org/mule/service/soap/service/EchoFault.java b/src/test/java/org/mule/service/soap/service/EchoFault.java new file mode 100644 index 00000000..05426a63 --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/EchoFault.java @@ -0,0 +1,24 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +/** + * Bean that is used as "detail" in the SOAP fault when an EchoException is thrown. + */ +public class EchoFault { + + private String text; + + public void setText(String text) { + this.text = text; + } + + public String getText() { + return text; + } + +} diff --git a/src/test/java/org/mule/service/soap/service/EncryptPasswordCallback.java b/src/test/java/org/mule/service/soap/service/EncryptPasswordCallback.java new file mode 100644 index 00000000..ba8e2b3b --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/EncryptPasswordCallback.java @@ -0,0 +1,21 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +import org.apache.wss4j.common.ext.WSPasswordCallback; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; +import java.io.IOException; + +public class EncryptPasswordCallback implements CallbackHandler { + + public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { + WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; + pc.setPassword("changeit"); + } +} diff --git a/src/test/java/org/mule/service/soap/service/Mtom11Service.java b/src/test/java/org/mule/service/soap/service/Mtom11Service.java new file mode 100644 index 00000000..db4dc440 --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/Mtom11Service.java @@ -0,0 +1,16 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +import javax.jws.WebService; +import javax.xml.ws.soap.MTOM; + +@MTOM +@WebService(portName = "TestPort", serviceName = "TestService") +public class Mtom11Service extends Soap11Service { + +} diff --git a/src/test/java/org/mule/service/soap/service/Mtom12Service.java b/src/test/java/org/mule/service/soap/service/Mtom12Service.java new file mode 100644 index 00000000..434abee1 --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/Mtom12Service.java @@ -0,0 +1,19 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +import javax.jws.WebService; +import javax.xml.ws.BindingType; +import javax.xml.ws.soap.MTOM; +import javax.xml.ws.soap.SOAPBinding; + +@MTOM +@WebService(portName = "TestPort", serviceName = "TestService") +@BindingType(value = SOAPBinding.SOAP12HTTP_BINDING) +public class Mtom12Service extends Soap12Service { + +} diff --git a/src/test/java/org/mule/service/soap/service/ServerPasswordCallback.java b/src/test/java/org/mule/service/soap/service/ServerPasswordCallback.java new file mode 100644 index 00000000..c98a917c --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/ServerPasswordCallback.java @@ -0,0 +1,29 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +import org.apache.wss4j.common.ext.WSPasswordCallback; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; +import java.io.IOException; + + +public class ServerPasswordCallback implements CallbackHandler { + + public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { + WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; + + if (pc.getIdentifier().equals("admin")) { + if (pc.getType().contains("PasswordText")) { + pc.setPassword("textPassword"); + } else if (pc.getType().contains("PasswordDigest")) { + pc.setPassword("digestPassword"); + } + } + } +} diff --git a/src/test/java/org/mule/service/soap/service/Soap11Service.java b/src/test/java/org/mule/service/soap/service/Soap11Service.java new file mode 100644 index 00000000..cf8da694 --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/Soap11Service.java @@ -0,0 +1,128 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +import static java.lang.String.format; +import static org.mule.service.soap.client.TestSoapClient.getDefaultConfiguration; + +import org.mule.runtime.core.api.util.IOUtils; +import org.mule.service.soap.client.TestSoapClient; +import org.mule.service.soap.server.HttpServer; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URISyntaxException; +import java.net.URL; + +import javax.activation.DataHandler; +import javax.activation.FileDataSource; +import javax.jws.Oneway; +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebResult; +import javax.jws.WebService; +import javax.xml.ws.Endpoint; +import javax.xml.ws.Holder; + +@WebService(portName = "TestPort", serviceName = "TestService") +public class Soap11Service { + + @WebResult(name = "text") + @WebMethod(action = "echoOperationCustomAction") + public String echo(@WebParam(name = "text") String s) { + return s + " response"; + } + + @WebResult(name = "text") + @WebMethod(action = "fail") + public String fail(@WebParam(name = "text") String s) throws EchoException { + throw new EchoException(s); + } + + @WebResult(name = "text") + @WebMethod(action = "echoWithHeaders") + public String echoWithHeaders(@WebParam(name = "headerIn", header = true, mode = WebParam.Mode.IN) String headerIn, + @WebParam(name = "headerOut", header = true, mode = WebParam.Mode.OUT) Holder headerOut, + @WebParam(name = "headerInOut", header = true, + mode = WebParam.Mode.INOUT) Holder headerInOut, + @WebParam(name = "text") String s) + throws EchoException { + + if (headerIn == null || headerInOut == null) { + throw new EchoException("Missing Required Headers"); + } + + headerOut.value = headerIn + " OUT"; + headerInOut.value = headerInOut.value + " INOUT"; + return echo(s); + } + + @WebResult(name = "text") + public String noParams() { + return "response"; + } + + @WebResult(name = "text") + @WebMethod(action = "noParamsWithHeader") + public String noParamsWithHeader(@WebParam(name = "headerIn", header = true, mode = WebParam.Mode.IN) String header) { + return header; + } + + @WebResult(name = "account") + @WebMethod(action = "echoAccount") + public Account echoAccount(@WebParam(name = "account") Account account, @WebParam(name = "name") String accountName) { + Account a = new Account(); + a.setClientName(accountName); + a.setId(account.getId()); + a.setItems(account.getItems()); + a.setStartingDate(account.getStartingDate()); + return a; + } + + @WebResult(name = "result") + @WebMethod(action = "uploadAttachment") + public String uploadAttachment(@WebParam(name = "attachment") DataHandler attachment) { + try { + String received = IOUtils.toString(attachment.getInputStream()); + if (received.contains("Some Content")) { + return "Ok"; + } else { + return format("Unexpected Content: [%s], was expecting [Some Content]", received); + } + } catch (IOException e) { + return "Error: " + e.getMessage(); + } + } + + @WebResult(name = "attachment") + @WebMethod(action = "downloadAttachment") + public DataHandler downloadAttachment(@WebParam(name = "fileName") String fileName) { + File file = new File(getResourceAsUrl(fileName).getPath()); + return new DataHandler(new FileDataSource(file)); + } + + @WebResult(name = "largeResponse") + @WebMethod(action = "large") + public String large() throws IOException { + return IOUtils.toString(getResourceAsUrl("large.json").openStream()); + } + + @Oneway + @WebMethod(action = "oneWay") + public void oneWay(@WebParam(name = "text") String text) { + // Do something without a response /shrug + } + + private URL getResourceAsUrl(String fileName) { + try { + return Thread.currentThread().getContextClassLoader().getResource(fileName).toURI().toURL(); + } catch (MalformedURLException | URISyntaxException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/test/java/org/mule/service/soap/service/Soap12Service.java b/src/test/java/org/mule/service/soap/service/Soap12Service.java new file mode 100644 index 00000000..0cf00793 --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/Soap12Service.java @@ -0,0 +1,17 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +import javax.jws.WebService; +import javax.xml.ws.BindingType; +import javax.xml.ws.soap.SOAPBinding; + +@WebService(portName = "TestPort", serviceName = "TestService") +@BindingType(value = SOAPBinding.SOAP12HTTP_BINDING) +public class Soap12Service extends Soap11Service { + +} diff --git a/src/test/java/org/mule/service/soap/service/VerifyPasswordCallback.java b/src/test/java/org/mule/service/soap/service/VerifyPasswordCallback.java new file mode 100644 index 00000000..6d8363fc --- /dev/null +++ b/src/test/java/org/mule/service/soap/service/VerifyPasswordCallback.java @@ -0,0 +1,21 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.service; + +import org.apache.wss4j.common.ext.WSPasswordCallback; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; +import java.io.IOException; + +public class VerifyPasswordCallback implements CallbackHandler { + + public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { + WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]; + pc.setPassword("mulepassword"); + } +} diff --git a/src/test/java/org/mule/service/soap/unit/DispatchingRequestFactoryTestCase.java b/src/test/java/org/mule/service/soap/unit/DispatchingRequestFactoryTestCase.java new file mode 100644 index 00000000..dd3f63e3 --- /dev/null +++ b/src/test/java/org/mule/service/soap/unit/DispatchingRequestFactoryTestCase.java @@ -0,0 +1,50 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.unit; + +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.Message; +import org.junit.Test; +import org.mule.runtime.extension.api.soap.message.DispatchingRequest; +import org.mule.service.soap.interceptor.DispatchingRequestFactory; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import static java.util.Collections.singletonMap; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.mule.service.soap.client.SoapCxfClient.MULE_TRANSPORT_HEADERS_KEY; +import static org.mule.service.soap.interceptor.SoapActionInterceptor.SOAP_ACTION; + + +public class DispatchingRequestFactoryTestCase { + + private static final String CONTENT = "content"; + private static final String SOAP_ACTION_VALUE = "noOPE"; + + @Test + public void checkOverrideDefaultHeaders() throws IOException { + Message messageMock = getMessageMock(); + DispatchingRequest dispatchingRequest = DispatchingRequestFactory.createDispatchingRequest(messageMock); + assertThat(dispatchingRequest.getHeader(SOAP_ACTION).get(), is(SOAP_ACTION_VALUE)); + } + + private Message getMessageMock() throws IOException { + Exchange exchangeMock = mock(Exchange.class); + ByteArrayOutputStream os = new ByteArrayOutputStream(); + os.write(CONTENT.getBytes()); + when(exchangeMock.get(MULE_TRANSPORT_HEADERS_KEY)).thenReturn(singletonMap(SOAP_ACTION.toLowerCase(), SOAP_ACTION_VALUE)); + Message messageMock = mock(Message.class); + when(messageMock.getContent(OutputStream.class)).thenReturn(os); + when(messageMock.getExchange()).thenReturn(exchangeMock); + return messageMock; + } +} diff --git a/src/test/java/org/mule/service/soap/unit/SoapOutputPayloadTestCase.java b/src/test/java/org/mule/service/soap/unit/SoapOutputPayloadTestCase.java new file mode 100644 index 00000000..a14aefaa --- /dev/null +++ b/src/test/java/org/mule/service/soap/unit/SoapOutputPayloadTestCase.java @@ -0,0 +1,89 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.unit; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Collections.emptyMap; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.mule.runtime.api.metadata.TypedValue; +import org.mule.runtime.api.streaming.bytes.CursorStream; +import org.mule.runtime.api.streaming.bytes.CursorStreamProvider; +import org.mule.runtime.extension.api.soap.SoapOutputPayload; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import com.google.common.collect.ImmutableMap; + +import org.junit.Test; + +public class SoapOutputPayloadTestCase { + + @Test + public void toStringOnlyBody() { + TypedValue body = new TypedValue<>(new ByteArrayInputStream("ABC".getBytes(UTF_8)), null); + String result = new SoapOutputPayload(body, emptyMap(), emptyMap()).toString(); + assertThat(result, is("{\n" + + "body:ABC,\n" + + "headers: [],\n" + + "attachments: []\n" + + "}")); + } + + @Test + public void toStringFullPayload() { + TypedValue body = TypedValue.of(new ByteArrayInputStream("ABC".getBytes(UTF_8))); + Map> hs = ImmutableMap.of("header1", TypedValue.of("content"), + "header2", TypedValue.of("content")); + Map> as = ImmutableMap.of("attachment1", TypedValue.of(null), + "attachment2", TypedValue.of(null)); + String result = new SoapOutputPayload(body, as, hs).toString(); + assertThat(result, is("{\n" + + "body:ABC,\n" + + "headers: [\"content\",\n" + + " \"content\"],\n" + + "attachments: [attachment1, attachment2]\n" + + "}")); + } + + @Test + public void withCursorProvider() throws IOException { + final CursorStream cursorStream = mock(CursorStream.class); + final ByteArrayInputStream bais = new ByteArrayInputStream("ABC".getBytes(UTF_8)); + when(cursorStream.read()).thenAnswer(inv -> { + return bais.read(); + }); + when(cursorStream.read(any(byte[].class), anyInt(), anyInt())).thenAnswer(inv -> { + return bais.read(inv.getArgument(0), inv.getArgument(1), inv.getArgument(2)); + }); + + CursorStreamProvider mock = mock(CursorStreamProvider.class); + when(mock.openCursor()).thenReturn(cursorStream); + TypedValue body = TypedValue.of(mock); + Map> hs = ImmutableMap.of("header1", TypedValue.of("content"), + "header2", TypedValue.of("content")); + Map> as = ImmutableMap.of("attachment1", TypedValue.of(null), + "attachment2", TypedValue.of(null)); + String result = new SoapOutputPayload(body, as, hs).toString(); + assertThat(result, is("{\n" + + "body:ABC,\n" + + "headers: [\"content\",\n" + + " \"content\"],\n" + + "attachments: [attachment1, attachment2]\n" + + "}")); + } + +} diff --git a/src/test/java/org/mule/service/soap/unit/SoapResponseGeneratorTestCase.java b/src/test/java/org/mule/service/soap/unit/SoapResponseGeneratorTestCase.java new file mode 100644 index 00000000..73814082 --- /dev/null +++ b/src/test/java/org/mule/service/soap/unit/SoapResponseGeneratorTestCase.java @@ -0,0 +1,61 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.unit; + +import static java.util.Collections.emptyMap; +import static java.util.Collections.singletonMap; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.mule.service.soap.client.SoapCxfClient.MULE_ATTACHMENTS_KEY; +import static org.mule.service.soap.client.SoapCxfClient.MULE_HEADERS_KEY; +import static org.mule.service.soap.client.SoapCxfClient.MULE_TRANSPORT_HEADERS_KEY; +import org.mule.runtime.api.metadata.MediaType; +import org.mule.runtime.soap.api.message.SoapResponse; +import org.mule.service.soap.generator.SoapResponseGenerator; +import org.mule.service.soap.generator.attachment.AttachmentResponseEnricher; +import org.mule.service.soap.xml.util.XMLUtils; + +import java.io.Reader; +import java.io.StringReader; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.cxf.message.Exchange; +import org.junit.Test; + +public class SoapResponseGeneratorTestCase { + + private static final String TEST_CHARSET = "windows-1252"; + + @Test + public void responseWithCharset() throws XMLStreamException { + AttachmentResponseEnricher enricher = mock(AttachmentResponseEnricher.class); + when(enricher.enrich(any(), any(), any())).thenAnswer(a -> XMLUtils.toXml(a.getArgument(0))); + Exchange exchange = mock(Exchange.class); + when(exchange.get(MULE_ATTACHMENTS_KEY)).thenReturn(emptyMap()); + when(exchange.get(MULE_HEADERS_KEY)).thenReturn(emptyMap()); + when(exchange.get(MULE_TRANSPORT_HEADERS_KEY)).thenReturn(singletonMap("content-type", "text/html; charset=" + TEST_CHARSET)); + + SoapResponseGenerator generator = new SoapResponseGenerator(enricher); + SoapResponse response = generator.generate("dummy", new Object[] {getTestXml()}, exchange); + MediaType contentType = response.getContentType(); + + assertThat(contentType.getCharset().get().toString(), is(TEST_CHARSET)); + } + + private XMLStreamReader getTestXml() throws XMLStreamException { + String text = "This is some XML"; + Reader reader = new StringReader(text); + XMLInputFactory factory = XMLInputFactory.newInstance(); // Or newFactory() + return factory.createXMLStreamReader(reader); + } +} diff --git a/src/test/java/org/mule/service/soap/unit/XmlTransformationUtilsTestCase.java b/src/test/java/org/mule/service/soap/unit/XmlTransformationUtilsTestCase.java new file mode 100644 index 00000000..61e680a0 --- /dev/null +++ b/src/test/java/org/mule/service/soap/unit/XmlTransformationUtilsTestCase.java @@ -0,0 +1,74 @@ +/* + * Copyright 2023 Salesforce, Inc. All rights reserved. + * The software in this package is published under the terms of the CPAL v1.0 + * license, a copy of which has been included with this distribution in the + * LICENSE.txt file. + */ +package org.mule.service.soap.unit; + +import org.junit.Test; +import org.mule.service.soap.util.XmlTransformationUtils; + +import javax.xml.stream.XMLStreamReader; + +import static javax.xml.stream.XMLStreamConstants.*; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +public class XmlTransformationUtilsTestCase { + + @Test + public void stringToXmlStreamReaderPreservesCDataElements() throws Exception { + + String cdataContent = "M4cr1!#EWDSA!@#!@#@!"; + String data = ""; + XMLStreamReader reader = XmlTransformationUtils.stringToXmlStreamReader(data); + + boolean foundCdata = false; + int event = reader.next(); + while (reader.hasNext()) { + switch (event) { + case CDATA: + foundCdata = true; + break; + } + event = reader.next(); + } + + assertThat(foundCdata, is(true)); + } + + @Test + public void stringToXmlStreamReader() throws Exception { + String data = "Juani"; + XMLStreamReader reader = XmlTransformationUtils.stringToXmlStreamReader(data); + + int startTagCount = 0; + int endTagCount = 0; + String textFound = ""; + + int event = reader.next(); + while (reader.hasNext()) { + switch (event) { + case END_ELEMENT: + endTagCount++; + break; + case CHARACTERS: + textFound = reader.getText(); + break; + case START_ELEMENT: + startTagCount++; + break; + default: + break; + } + event = reader.next(); + } + + assertThat(startTagCount, is(2)); + assertThat(textFound, is("Juani")); + assertThat(endTagCount, is(2)); + } + + +} diff --git a/src/test/resources/attachment.txt b/src/test/resources/attachment.txt new file mode 100644 index 00000000..27cae3e5 --- /dev/null +++ b/src/test/resources/attachment.txt @@ -0,0 +1 @@ +Simple Attachment Content diff --git a/src/test/resources/large.json b/src/test/resources/large.json new file mode 100644 index 00000000..35fb6723 --- /dev/null +++ b/src/test/resources/large.json @@ -0,0 +1,1082 @@ +[ + { + "_id": "591b0703a828c033183f5aad", + "index": 0, + "guid": "af571be5-9a85-4759-b834-4bc99eb211c3", + "isActive": false, + "balance": "$1,382.43", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "brown", + "name": "Shari Sandoval", + "gender": "female", + "company": "CAPSCREEN", + "email": "sharisandoval@capscreen.com", + "phone": "+1 (908) 472-2614", + "address": "227 Newel Street, Allison, Virgin Islands, 9230", + "about": "Fugiat culpa irure quis adipisicing eiusmod aliquip aliqua dolor. Ipsum aliquip amet amet excepteur consectetur nisi sint enim id. Ullamco eu mollit proident esse fugiat non consectetur sunt excepteur et Lorem exercitation. Proident mollit dolore tempor voluptate do. Deserunt laboris velit deserunt duis sunt eiusmod nostrud. Veniam aute sit occaecat cupidatat adipisicing nostrud.\r\n", + "registered": "2014-03-31T01:52:31 +03:00", + "latitude": -34.630491, + "longitude": -72.422474, + "tags": [ + "cupidatat", + "commodo", + "non", + "dolore", + "laborum", + "officia", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Amanda Barry" + }, + { + "id": 1, + "name": "Lopez Elliott" + }, + { + "id": 2, + "name": "Patricia Lamb" + } + ], + "greeting": "Hello, Shari Sandoval! You have 1 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "591b070387ab8206348d375c", + "index": 1, + "guid": "7cd8fb4e-9a9d-469e-a645-0bcf94221b26", + "isActive": false, + "balance": "$2,046.89", + "picture": "http://placehold.it/32x32", + "age": 25, + "eyeColor": "blue", + "name": "Jenkins Mccoy", + "gender": "male", + "company": "SPORTAN", + "email": "jenkinsmccoy@sportan.com", + "phone": "+1 (906) 442-3237", + "address": "640 Kingsland Avenue, Gibsonia, Delaware, 3887", + "about": "Proident cillum cillum ea enim cillum proident adipisicing. Cupidatat mollit voluptate et cupidatat amet eiusmod amet culpa sint officia sint eiusmod cupidatat et. Dolor est Lorem consequat laborum exercitation qui labore ullamco irure elit deserunt dolore qui. Fugiat adipisicing proident aliquip dolor nostrud ea ipsum nisi culpa aliqua do officia sint.\r\n", + "registered": "2015-12-07T12:25:10 +03:00", + "latitude": 47.344745, + "longitude": -12.904505, + "tags": [ + "adipisicing", + "duis", + "Lorem", + "tempor", + "ea", + "ut", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Walsh Huber" + }, + { + "id": 1, + "name": "Meghan Terry" + }, + { + "id": 2, + "name": "Raquel Blake" + } + ], + "greeting": "Hello, Jenkins Mccoy! You have 4 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "591b070365fa64d585a83139", + "index": 2, + "guid": "6de7bdc5-04f9-4f25-b111-868d8b0ac371", + "isActive": false, + "balance": "$2,672.77", + "picture": "http://placehold.it/32x32", + "age": 28, + "eyeColor": "brown", + "name": "Eleanor Garza", + "gender": "female", + "company": "XIIX", + "email": "eleanorgarza@xiix.com", + "phone": "+1 (921) 492-2896", + "address": "980 Times Placez, Gerton, Florida, 7882", + "about": "Voluptate nisi est voluptate eiusmod ut. Sint fugiat ullamco ex sit ad Lorem duis. In cillum duis sint sit sunt cillum in nulla culpa pariatur sunt amet proident excepteur. Amet excepteur tempor ipsum laborum laborum aute. Id dolor qui incididunt ex sit id occaecat labore laboris fugiat ex fugiat. Cupidatat est tempor cupidatat dolore. Laborum magna pariatur Lorem excepteur eu laborum.\r\n", + "registered": "2015-09-28T07:10:55 +03:00", + "latitude": -38.966648, + "longitude": 74.110167, + "tags": [ + "in", + "consectetur", + "magna", + "nisi", + "eiusmod", + "voluptate", + "magna" + ], + "friends": [ + { + "id": 0, + "name": "Rodriquez Haley" + }, + { + "id": 1, + "name": "Tonya Mullen" + }, + { + "id": 2, + "name": "Buchanan Butler" + } + ], + "greeting": "Hello, Eleanor Garza! You have 1 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b07037856f38582ee90c6", + "index": 3, + "guid": "f81b7871-4f63-4dd3-8e72-6a43857cb2a0", + "isActive": true, + "balance": "$3,503.80", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "green", + "name": "Maryellen Keith", + "gender": "female", + "company": "RECOGNIA", + "email": "maryellenkeith@recognia.com", + "phone": "+1 (985) 584-2828", + "address": "261 Gotham Avenue, Thornport, California, 2494", + "about": "Ut et Lorem magna proident excepteur adipisicing consequat commodo. Do ullamco Lorem amet nostrud et dolore enim anim ex excepteur labore quis adipisicing ad. Voluptate eiusmod ipsum sunt adipisicing incididunt. Duis adipisicing consectetur ullamco esse cillum. Pariatur nostrud ut labore sint voluptate dolor incididunt occaecat magna. Ad sunt ipsum qui ut commodo irure id proident deserunt dolor exercitation consectetur do laboris. Deserunt aliquip eiusmod ipsum occaecat pariatur eiusmod fugiat non incididunt.\r\n", + "registered": "2015-02-08T03:53:25 +03:00", + "latitude": 41.711707, + "longitude": -75.629836, + "tags": [ + "exercitation", + "aute", + "incididunt", + "et", + "nulla", + "labore", + "labore" + ], + "friends": [ + { + "id": 0, + "name": "Leah Byers" + }, + { + "id": 1, + "name": "Hill Maldonado" + }, + { + "id": 2, + "name": "Randi Sellers" + } + ], + "greeting": "Hello, Maryellen Keith! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b070376244a6bc712d018", + "index": 4, + "guid": "fdcf003c-dbf8-4783-8a73-d875e5c8f601", + "isActive": true, + "balance": "$2,258.02", + "picture": "http://placehold.it/32x32", + "age": 36, + "eyeColor": "blue", + "name": "Mcgowan Whitfield", + "gender": "male", + "company": "ZIDANT", + "email": "mcgowanwhitfield@zidant.com", + "phone": "+1 (843) 404-3951", + "address": "386 Whitney Avenue, Maplewood, Mississippi, 4327", + "about": "Ea sit aute laboris proident consequat id cillum ad sint. Laboris anim irure velit irure ad laborum et tempor et consequat adipisicing qui elit. Officia non commodo anim laborum voluptate et. Consectetur anim Lorem sit consequat incididunt proident ut non Lorem. Dolore deserunt minim consequat quis et. Deserunt laboris proident voluptate ea in magna adipisicing esse aute fugiat.\r\n", + "registered": "2016-08-31T07:50:32 +03:00", + "latitude": -46.725263, + "longitude": -26.864704, + "tags": [ + "aliquip", + "Lorem", + "nostrud", + "duis", + "eiusmod", + "amet", + "qui" + ], + "friends": [ + { + "id": 0, + "name": "Hebert Rogers" + }, + { + "id": 1, + "name": "Lauren Henderson" + }, + { + "id": 2, + "name": "Hall Estes" + } + ], + "greeting": "Hello, Mcgowan Whitfield! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "591b070361aa7a2effe33523", + "index": 5, + "guid": "62b36a6d-916b-4ef5-9e57-65dd8f4f9080", + "isActive": true, + "balance": "$1,492.25", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "green", + "name": "Alta Salazar", + "gender": "female", + "company": "CONFERIA", + "email": "altasalazar@conferia.com", + "phone": "+1 (855) 577-3543", + "address": "932 Beach Place, Trail, Pennsylvania, 5696", + "about": "Sint ad exercitation cupidatat dolore minim sint. Quis voluptate qui dolor dolor id officia ut. Irure quis dolore quis et culpa eiusmod irure duis aute exercitation.\r\n", + "registered": "2016-07-10T07:42:07 +03:00", + "latitude": -82.412231, + "longitude": -12.157523, + "tags": [ + "incididunt", + "Lorem", + "officia", + "incididunt", + "ad", + "sit", + "aliqua" + ], + "friends": [ + { + "id": 0, + "name": "Pamela Montgomery" + }, + { + "id": 1, + "name": "Reid Brady" + }, + { + "id": 2, + "name": "Wilda Schultz" + } + ], + "greeting": "Hello, Alta Salazar! You have 5 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "591b070328c7ea2fae2de28c", + "index": 6, + "guid": "204c2a0c-5662-4647-8bbe-cb162804f9dd", + "isActive": false, + "balance": "$3,665.91", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "brown", + "name": "Christa Conley", + "gender": "female", + "company": "ISOSPHERE", + "email": "christaconley@isosphere.com", + "phone": "+1 (876) 459-3441", + "address": "165 Ridge Boulevard, Cascades, Indiana, 5571", + "about": "Deserunt ipsum dolore dolore et ex. Tempor amet consequat eu proident incididunt eiusmod amet quis. Laboris dolor consectetur aliqua et laboris veniam excepteur do anim deserunt. Sint anim nisi incididunt eu irure ad fugiat. Enim ea in ad nostrud ipsum ullamco. Cupidatat dolor consectetur enim cillum et pariatur minim esse qui. Consectetur nostrud ea anim veniam laborum sit incididunt ad.\r\n", + "registered": "2015-04-26T08:59:24 +03:00", + "latitude": 73.481427, + "longitude": 23.313418, + "tags": [ + "velit", + "culpa", + "deserunt", + "ex", + "dolore", + "voluptate", + "id" + ], + "friends": [ + { + "id": 0, + "name": "Brewer Moon" + }, + { + "id": 1, + "name": "Mercado Bauer" + }, + { + "id": 2, + "name": "Jenifer Robles" + } + ], + "greeting": "Hello, Christa Conley! You have 4 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "591b070312bbd64ca178ed17", + "index": 7, + "guid": "ef144ec9-872c-4a2d-aff4-7d5649360bd7", + "isActive": true, + "balance": "$3,113.87", + "picture": "http://placehold.it/32x32", + "age": 39, + "eyeColor": "blue", + "name": "Miles Shaw", + "gender": "male", + "company": "EARTHPURE", + "email": "milesshaw@earthpure.com", + "phone": "+1 (816) 593-3101", + "address": "799 Royce Street, Bangor, New York, 7437", + "about": "Magna incididunt irure Lorem nostrud adipisicing proident fugiat aute velit amet veniam culpa voluptate consectetur. Aute amet duis laboris esse enim mollit occaecat fugiat ea. Proident cupidatat ut deserunt anim sint consequat magna. Dolor nostrud ullamco in minim adipisicing qui. Ad minim esse Lorem pariatur elit aute ullamco dolor aliquip sunt ad laborum. Non excepteur eu aliqua excepteur ea.\r\n", + "registered": "2017-05-13T02:58:39 +03:00", + "latitude": -88.760377, + "longitude": 44.830553, + "tags": [ + "id", + "quis", + "non", + "ex", + "aliquip", + "magna", + "culpa" + ], + "friends": [ + { + "id": 0, + "name": "Summers Stein" + }, + { + "id": 1, + "name": "Laurie Trujillo" + }, + { + "id": 2, + "name": "Eve Doyle" + } + ], + "greeting": "Hello, Miles Shaw! You have 3 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b0703307772a45047a419", + "index": 8, + "guid": "f60a0dfe-d658-4dde-a2f5-717cb2242052", + "isActive": true, + "balance": "$1,540.03", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "blue", + "name": "Hutchinson Shields", + "gender": "male", + "company": "RETROTEX", + "email": "hutchinsonshields@retrotex.com", + "phone": "+1 (950) 539-3292", + "address": "181 Langham Street, Forestburg, Arizona, 8370", + "about": "Amet deserunt commodo enim veniam dolor deserunt cillum consectetur. Proident reprehenderit dolore eu ea minim minim ea esse est. Eu aliqua qui non Lorem deserunt aliqua eiusmod. In duis id incididunt esse elit consectetur aliquip culpa. Dolore nulla enim laborum velit fugiat nostrud in officia esse esse eiusmod officia.\r\n", + "registered": "2016-06-18T06:15:13 +03:00", + "latitude": 14.443081, + "longitude": -105.539191, + "tags": [ + "cillum", + "non", + "adipisicing", + "laborum", + "magna", + "aliqua", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Prince Harrell" + }, + { + "id": 1, + "name": "Nettie Whitney" + }, + { + "id": 2, + "name": "Walter Mullins" + } + ], + "greeting": "Hello, Hutchinson Shields! You have 9 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "591b0703334031898a653b97", + "index": 9, + "guid": "70e474e9-7310-481c-9f6c-0317f62b0359", + "isActive": true, + "balance": "$1,169.91", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Rojas Norton", + "gender": "male", + "company": "PODUNK", + "email": "rojasnorton@podunk.com", + "phone": "+1 (851) 417-2007", + "address": "843 Butler Place, Caspar, West Virginia, 9792", + "about": "Deserunt laboris irure laboris aliquip cillum voluptate duis tempor nostrud amet dolor. Consequat quis dolor amet amet occaecat nisi id anim est incididunt. Non ea cupidatat dolore sit dolore minim cupidatat.\r\n", + "registered": "2015-09-13T08:19:51 +03:00", + "latitude": -36.503256, + "longitude": 130.271606, + "tags": [ + "commodo", + "dolor", + "ut", + "aute", + "elit", + "ut", + "sint" + ], + "friends": [ + { + "id": 0, + "name": "Walker Simon" + }, + { + "id": 1, + "name": "Lindsey Little" + }, + { + "id": 2, + "name": "Phyllis Hawkins" + } + ], + "greeting": "Hello, Rojas Norton! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b07036aa973823d52d88a", + "index": 10, + "guid": "0a7335a5-f578-4ce1-a92c-dd698f099da8", + "isActive": true, + "balance": "$1,751.84", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Baird Vance", + "gender": "male", + "company": "KANGLE", + "email": "bairdvance@kangle.com", + "phone": "+1 (902) 544-2249", + "address": "926 Jackson Place, Yorklyn, Hawaii, 229", + "about": "Cillum amet dolore magna proident pariatur et veniam officia laborum anim ea pariatur eiusmod dolore. Labore excepteur consequat sint pariatur in culpa cupidatat. Nostrud qui duis dolore ad labore reprehenderit qui. Ullamco laborum mollit consectetur eiusmod in sit eiusmod tempor. Ullamco voluptate consequat amet commodo labore sint est est ea excepteur. Aute reprehenderit aliquip consequat non culpa sit officia dolore duis pariatur. Commodo commodo ea veniam exercitation dolore quis et consequat exercitation ipsum tempor veniam.\r\n", + "registered": "2015-04-11T07:46:07 +03:00", + "latitude": -67.964919, + "longitude": -39.933604, + "tags": [ + "nulla", + "mollit", + "proident", + "elit", + "reprehenderit", + "pariatur", + "ipsum" + ], + "friends": [ + { + "id": 0, + "name": "Ingram Wright" + }, + { + "id": 1, + "name": "Sybil Jacobs" + }, + { + "id": 2, + "name": "Luella Woodard" + } + ], + "greeting": "Hello, Baird Vance! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "591b0703e0cbd61cdb0a6ecf", + "index": 11, + "guid": "57ffcd2c-9520-4036-8ab4-d5063e0838e3", + "isActive": true, + "balance": "$1,464.23", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Dorsey Watts", + "gender": "male", + "company": "TERRAGO", + "email": "dorseywatts@terrago.com", + "phone": "+1 (989) 562-3297", + "address": "321 Aurelia Court, Cashtown, Kentucky, 5174", + "about": "Irure dolore esse sunt nulla irure culpa veniam tempor proident nulla exercitation culpa sunt nulla. Nulla et duis et incididunt sit et consectetur ad ad officia anim minim. Ex cupidatat nisi quis commodo ipsum ea cupidatat dolore cillum non aliqua esse. Dolore cillum dolore est in sit veniam reprehenderit id veniam velit consequat amet. Eu ipsum ut id officia sint cillum irure voluptate magna reprehenderit commodo est sunt est. Et ex exercitation excepteur aliqua. Fugiat do amet nisi exercitation veniam tempor pariatur laborum aliqua.\r\n", + "registered": "2014-08-21T09:40:58 +03:00", + "latitude": 60.5579, + "longitude": -136.293965, + "tags": [ + "aute", + "ullamco", + "ea", + "elit", + "eiusmod", + "non", + "voluptate" + ], + "friends": [ + { + "id": 0, + "name": "Ilene Rice" + }, + { + "id": 1, + "name": "Aisha Yang" + }, + { + "id": 2, + "name": "Ester Carney" + } + ], + "greeting": "Hello, Dorsey Watts! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b070333e28878d71fcd52", + "index": 12, + "guid": "1d9ce010-a0e7-433f-b644-0e12911909d6", + "isActive": false, + "balance": "$3,988.17", + "picture": "http://placehold.it/32x32", + "age": 32, + "eyeColor": "green", + "name": "Augusta Park", + "gender": "female", + "company": "DOGTOWN", + "email": "augustapark@dogtown.com", + "phone": "+1 (871) 449-2607", + "address": "119 Pooles Lane, Madrid, Montana, 1199", + "about": "Incididunt laboris ipsum laboris cupidatat elit veniam ut aliqua occaecat. Ullamco amet cupidatat amet eiusmod occaecat proident labore aute et dolor nostrud excepteur cupidatat quis. Aliquip Lorem dolore qui enim eu dolor. Consequat velit incididunt dolore eiusmod velit pariatur magna duis irure veniam. Laboris ad officia mollit commodo tempor consequat eiusmod cillum elit et duis. Sint et minim pariatur consequat dolor officia ad. Anim elit non est exercitation cillum quis ut pariatur nostrud quis nulla labore sit.\r\n", + "registered": "2014-01-14T08:49:32 +03:00", + "latitude": -33.704856, + "longitude": 145.222236, + "tags": [ + "irure", + "sunt", + "laborum", + "officia", + "esse", + "cupidatat", + "proident" + ], + "friends": [ + { + "id": 0, + "name": "Jimmie Carrillo" + }, + { + "id": 1, + "name": "Leblanc Pearson" + }, + { + "id": 2, + "name": "Melva William" + } + ], + "greeting": "Hello, Augusta Park! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b0703f3f72871ced8b1c9", + "index": 13, + "guid": "d55ff4da-5c58-45d0-818d-fb1c873240aa", + "isActive": true, + "balance": "$1,252.16", + "picture": "http://placehold.it/32x32", + "age": 24, + "eyeColor": "brown", + "name": "Rivera Hickman", + "gender": "male", + "company": "BRAINCLIP", + "email": "riverahickman@brainclip.com", + "phone": "+1 (807) 513-2692", + "address": "101 Grafton Street, Clarktown, New Jersey, 7360", + "about": "Velit veniam labore minim reprehenderit exercitation velit. Aliqua officia ullamco eiusmod fugiat minim mollit ut labore cupidatat tempor reprehenderit. Labore laborum proident labore occaecat. Laboris veniam consequat deserunt non amet fugiat nisi reprehenderit mollit adipisicing. Quis magna ex cillum id labore consectetur excepteur excepteur aute dolor. Veniam et esse et voluptate nostrud ad fugiat. Ex do ad ullamco nostrud incididunt veniam consectetur amet.\r\n", + "registered": "2014-04-21T10:54:24 +03:00", + "latitude": -28.241541, + "longitude": 16.20742, + "tags": [ + "aliqua", + "non", + "pariatur", + "magna", + "veniam", + "exercitation", + "nisi" + ], + "friends": [ + { + "id": 0, + "name": "Emily Hodge" + }, + { + "id": 1, + "name": "Torres Gilbert" + }, + { + "id": 2, + "name": "Lancaster Daniels" + } + ], + "greeting": "Hello, Rivera Hickman! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "591b070318e2a138a2cdbaef", + "index": 14, + "guid": "ed0df8b0-472e-48aa-a2f8-fb3249f8f42d", + "isActive": false, + "balance": "$3,116.45", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "brown", + "name": "Calhoun Norman", + "gender": "male", + "company": "KIOSK", + "email": "calhounnorman@kiosk.com", + "phone": "+1 (947) 579-2497", + "address": "597 King Street, Allensworth, Utah, 8551", + "about": "Ea aliquip voluptate ex quis laboris nulla Lorem nostrud fugiat aute culpa fugiat id. Consequat qui occaecat aliquip enim commodo non commodo. Eiusmod velit magna laborum laborum excepteur qui aliqua eu irure quis dolore. Eu excepteur cillum quis aute do qui adipisicing veniam.\r\n", + "registered": "2016-06-18T03:51:51 +03:00", + "latitude": 72.238676, + "longitude": -28.154794, + "tags": [ + "voluptate", + "ipsum", + "sint", + "Lorem", + "deserunt", + "ad", + "enim" + ], + "friends": [ + { + "id": 0, + "name": "Debora Boyle" + }, + { + "id": 1, + "name": "Helene Beach" + }, + { + "id": 2, + "name": "Victoria Foster" + } + ], + "greeting": "Hello, Calhoun Norman! You have 9 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "591b07032f5a5b631cc311aa", + "index": 15, + "guid": "15b83501-82de-4111-a0fd-dfac925848dc", + "isActive": true, + "balance": "$2,317.33", + "picture": "http://placehold.it/32x32", + "age": 38, + "eyeColor": "blue", + "name": "Graves Gaines", + "gender": "male", + "company": "KEEG", + "email": "gravesgaines@keeg.com", + "phone": "+1 (939) 454-3986", + "address": "755 Pineapple Street, Epworth, Missouri, 4482", + "about": "Occaecat pariatur ut in voluptate ad reprehenderit aute. Ea officia ullamco officia laboris qui aliqua esse et enim aute aliqua. Duis cupidatat elit dolore Lorem consequat exercitation duis laborum anim. Aliqua amet nisi sunt exercitation deserunt occaecat anim ipsum enim velit labore eu. Culpa deserunt velit exercitation et laboris laborum ea reprehenderit cillum anim eiusmod nulla. Laborum officia sint occaecat esse exercitation non magna officia do qui magna laborum dolor.\r\n", + "registered": "2014-11-15T11:58:39 +03:00", + "latitude": 24.664679, + "longitude": -154.635313, + "tags": [ + "proident", + "commodo", + "in", + "commodo", + "reprehenderit", + "velit", + "pariatur" + ], + "friends": [ + { + "id": 0, + "name": "Winifred Clements" + }, + { + "id": 1, + "name": "Gardner Hinton" + }, + { + "id": 2, + "name": "Martha Hampton" + } + ], + "greeting": "Hello, Graves Gaines! You have 6 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b0703685c883130349283", + "index": 16, + "guid": "8e442123-5f45-4cd5-8b7e-b08e357da2d3", + "isActive": true, + "balance": "$3,976.92", + "picture": "http://placehold.it/32x32", + "age": 21, + "eyeColor": "blue", + "name": "Clay Yates", + "gender": "male", + "company": "ZAPHIRE", + "email": "clayyates@zaphire.com", + "phone": "+1 (855) 506-3669", + "address": "713 Brigham Street, Day, North Carolina, 9684", + "about": "Magna ad eu ullamco anim sint sint sit amet voluptate tempor dolore labore. Occaecat veniam do fugiat reprehenderit ipsum et pariatur velit eu irure laborum consequat qui enim. Veniam id irure non et sit pariatur officia fugiat incididunt nisi adipisicing nostrud.\r\n", + "registered": "2017-05-10T03:11:53 +03:00", + "latitude": -24.374418, + "longitude": 165.654664, + "tags": [ + "ad", + "officia", + "est", + "in", + "ea", + "ex", + "mollit" + ], + "friends": [ + { + "id": 0, + "name": "Lyons Stewart" + }, + { + "id": 1, + "name": "Noel Mann" + }, + { + "id": 2, + "name": "Hendrix Bray" + } + ], + "greeting": "Hello, Clay Yates! You have 2 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b0703f57185d705342d8b", + "index": 17, + "guid": "923f8be3-adea-46e5-b53e-1780d7c136a3", + "isActive": false, + "balance": "$2,164.71", + "picture": "http://placehold.it/32x32", + "age": 40, + "eyeColor": "green", + "name": "Samantha Jacobson", + "gender": "female", + "company": "MAINELAND", + "email": "samanthajacobson@maineland.com", + "phone": "+1 (922) 593-3505", + "address": "795 Franklin Avenue, Vale, District Of Columbia, 3146", + "about": "Sunt elit consequat ullamco ullamco aliquip Lorem ad Lorem labore sit mollit veniam do. Dolore deserunt labore nulla officia consequat nisi ea aliquip eu quis deserunt nulla. Mollit reprehenderit aute deserunt tempor laborum enim eu non culpa elit nulla consequat in ullamco. Ad consectetur ullamco dolore in laborum ad aliquip aute ullamco non ullamco id. Ea excepteur ipsum minim ex duis est cillum laboris proident. Nulla nulla commodo commodo esse ullamco est ipsum laborum dolore pariatur voluptate occaecat non irure. Proident magna cillum ea Lorem do reprehenderit sint.\r\n", + "registered": "2016-12-25T12:06:51 +03:00", + "latitude": -10.953036, + "longitude": -101.248566, + "tags": [ + "aliquip", + "ex", + "aute", + "laboris", + "et", + "sunt", + "aliqua" + ], + "friends": [ + { + "id": 0, + "name": "Madge Ruiz" + }, + { + "id": 1, + "name": "Norma Wiggins" + }, + { + "id": 2, + "name": "Terrell Maddox" + } + ], + "greeting": "Hello, Samantha Jacobson! You have 10 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "591b070398f00c74e8aa139b", + "index": 18, + "guid": "720e64fd-8db5-4c0c-96ab-a4d8656c1469", + "isActive": true, + "balance": "$3,808.91", + "picture": "http://placehold.it/32x32", + "age": 20, + "eyeColor": "blue", + "name": "Oneil Freeman", + "gender": "male", + "company": "KEENGEN", + "email": "oneilfreeman@keengen.com", + "phone": "+1 (867) 592-2743", + "address": "561 Russell Street, Nescatunga, Oklahoma, 4610", + "about": "Sunt culpa irure id proident adipisicing. Commodo commodo anim ut eu eiusmod ad est aliquip Lorem eiusmod ipsum Lorem. Et proident aliquip cupidatat elit incididunt nisi ipsum ut nulla sint qui. Cupidatat ipsum fugiat ad cupidatat cupidatat eiusmod pariatur est voluptate aliqua. Esse excepteur eu velit voluptate incididunt dolore anim cillum nostrud ipsum. Excepteur non aliquip exercitation eu deserunt exercitation non elit non voluptate. In est laboris adipisicing eu id ipsum sunt dolore nisi magna anim nulla.\r\n", + "registered": "2017-02-12T08:31:10 +03:00", + "latitude": -72.401511, + "longitude": 41.756262, + "tags": [ + "pariatur", + "non", + "nostrud", + "ad", + "adipisicing", + "et", + "minim" + ], + "friends": [ + { + "id": 0, + "name": "Shepherd Cline" + }, + { + "id": 1, + "name": "Jeanne Alvarez" + }, + { + "id": 2, + "name": "Hood Wheeler" + } + ], + "greeting": "Hello, Oneil Freeman! You have 8 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "591b0703617ecd56f741a8a6", + "index": 19, + "guid": "a250b8d3-d4bd-4cf8-8549-957dad7d5171", + "isActive": true, + "balance": "$3,763.50", + "picture": "http://placehold.it/32x32", + "age": 29, + "eyeColor": "brown", + "name": "Cooper Santos", + "gender": "male", + "company": "HOTCAKES", + "email": "coopersantos@hotcakes.com", + "phone": "+1 (933) 437-2516", + "address": "267 Kosciusko Street, Dunlo, Federated States Of Micronesia, 4996", + "about": "Aliquip deserunt fugiat ad cillum labore irure irure veniam. Esse in esse do est laborum aute tempor duis consequat et ipsum quis Lorem. Dolore ipsum in nisi consectetur. Adipisicing id proident voluptate occaecat irure. Minim do cupidatat laboris et aliquip. Fugiat ullamco cillum fugiat fugiat est pariatur nostrud incididunt mollit culpa incididunt esse sint excepteur.\r\n", + "registered": "2016-08-24T07:38:37 +03:00", + "latitude": -3.358438, + "longitude": -141.470931, + "tags": [ + "ea", + "velit", + "minim", + "dolore", + "amet", + "aute", + "ad" + ], + "friends": [ + { + "id": 0, + "name": "Holcomb Stout" + }, + { + "id": 1, + "name": "Amie Anderson" + }, + { + "id": 2, + "name": "Coffey Edwards" + } + ], + "greeting": "Hello, Cooper Santos! You have 6 unread messages.", + "favoriteFruit": "banana" + }, + { + "_id": "591b0703708563c4baaf3e0d", + "index": 20, + "guid": "69750dac-d716-438d-84a2-8b1cb2b9bdb3", + "isActive": false, + "balance": "$1,601.15", + "picture": "http://placehold.it/32x32", + "age": 31, + "eyeColor": "brown", + "name": "Ora Mckay", + "gender": "female", + "company": "BALUBA", + "email": "oramckay@baluba.com", + "phone": "+1 (994) 429-2375", + "address": "814 Aitken Place, Weogufka, Marshall Islands, 670", + "about": "Ut proident cupidatat dolor do. Est aliquip dolore fugiat incididunt ipsum nisi sint aute magna pariatur. Id consequat ipsum aliqua et nostrud in ex adipisicing aliquip aliqua ex ipsum occaecat. Incididunt incididunt adipisicing proident velit magna tempor aliquip tempor pariatur dolor fugiat incididunt duis excepteur. Sint ad anim qui amet irure.\r\n", + "registered": "2014-09-28T10:41:44 +03:00", + "latitude": -73.893262, + "longitude": 72.403113, + "tags": [ + "incididunt", + "laborum", + "non", + "non", + "exercitation", + "irure", + "incididunt" + ], + "friends": [ + { + "id": 0, + "name": "Dena Dillard" + }, + { + "id": 1, + "name": "Kristina Walters" + }, + { + "id": 2, + "name": "Emma Johnston" + } + ], + "greeting": "Hello, Ora Mckay! You have 10 unread messages.", + "favoriteFruit": "apple" + }, + { + "_id": "591b07030fab625634123040", + "index": 21, + "guid": "5971944b-37b7-41f8-8db6-b6cef6bb4222", + "isActive": false, + "balance": "$3,105.28", + "picture": "http://placehold.it/32x32", + "age": 35, + "eyeColor": "blue", + "name": "Frank Reyes", + "gender": "male", + "company": "MARKETOID", + "email": "frankreyes@marketoid.com", + "phone": "+1 (852) 446-2789", + "address": "372 Lafayette Avenue, Draper, Idaho, 628", + "about": "Ex consectetur id consequat voluptate elit voluptate nisi do dolor mollit excepteur quis. Ullamco cupidatat amet ipsum sunt occaecat sit. Irure cupidatat esse nisi officia commodo aute et amet aute ut velit. Et adipisicing ullamco excepteur dolor exercitation minim cupidatat nostrud amet. Adipisicing sunt veniam nulla et est aute est cillum elit eu sint. Laboris labore adipisicing dolore mollit mollit. Sunt commodo incididunt non ex excepteur do velit est voluptate.\r\n", + "registered": "2017-04-24T05:55:31 +03:00", + "latitude": -63.550463, + "longitude": -101.065393, + "tags": [ + "ex", + "nulla", + "sit", + "veniam", + "elit", + "ullamco", + "tempor" + ], + "friends": [ + { + "id": 0, + "name": "Tracey Collier" + }, + { + "id": 1, + "name": "Hunter Vang" + }, + { + "id": 2, + "name": "Regina Dorsey" + } + ], + "greeting": "Hello, Frank Reyes! You have 5 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b0703149d86701943e624", + "index": 22, + "guid": "4dec418e-809b-4f5e-a6a3-d66915055b7e", + "isActive": true, + "balance": "$3,153.81", + "picture": "http://placehold.it/32x32", + "age": 37, + "eyeColor": "brown", + "name": "Margarita Waters", + "gender": "female", + "company": "POLARIA", + "email": "margaritawaters@polaria.com", + "phone": "+1 (818) 448-3895", + "address": "782 Lexington Avenue, Bynum, New Hampshire, 1772", + "about": "Excepteur ullamco duis commodo occaecat sit sit ipsum non est eiusmod sit. Qui ullamco non in esse irure ad ea id ipsum nisi cupidatat consectetur eiusmod ea. Enim in ad do voluptate eu in ea non tempor nulla. Pariatur minim aute esse exercitation amet officia consectetur ea nulla pariatur deserunt anim deserunt. Consectetur eiusmod ea duis consectetur officia pariatur exercitation consectetur anim. Excepteur quis enim enim veniam ex cupidatat officia.\r\n", + "registered": "2016-06-09T05:45:08 +03:00", + "latitude": 41.011227, + "longitude": -74.81708, + "tags": [ + "mollit", + "sint", + "veniam", + "duis", + "incididunt", + "do", + "proident" + ], + "friends": [ + { + "id": 0, + "name": "Roberts Whitaker" + }, + { + "id": 1, + "name": "Rene Chandler" + }, + { + "id": 2, + "name": "Alvarez Fry" + } + ], + "greeting": "Hello, Margarita Waters! You have 7 unread messages.", + "favoriteFruit": "strawberry" + }, + { + "_id": "591b0703a78b7ee332b24e31", + "index": 23, + "guid": "6bca970b-dadb-464f-9264-3e9aa28e695e", + "isActive": false, + "balance": "$1,864.71", + "picture": "http://placehold.it/32x32", + "age": 27, + "eyeColor": "brown", + "name": "Christi Lindsey", + "gender": "female", + "company": "ZENSURE", + "email": "christilindsey@zensure.com", + "phone": "+1 (910) 431-3438", + "address": "641 Saratoga Avenue, Brutus, Minnesota, 1956", + "about": "Velit duis laboris ullamco laboris. Officia commodo tempor qui deserunt cillum eiusmod reprehenderit velit velit laboris magna tempor ex. Deserunt culpa ipsum commodo mollit veniam irure irure pariatur ex excepteur. Laborum mollit laborum anim tempor ea reprehenderit velit deserunt tempor pariatur do incididunt. Tempor reprehenderit amet cillum dolor Lorem. Exercitation amet Lorem irure eu laborum aute mollit. Dolor incididunt occaecat sit qui reprehenderit quis ipsum sunt reprehenderit.\r\n", + "registered": "2014-06-11T11:26:57 +03:00", + "latitude": -43.398228, + "longitude": 174.14127, + "tags": [ + "voluptate", + "incididunt", + "incididunt", + "dolore", + "ad", + "enim", + "occaecat" + ], + "friends": [ + { + "id": 0, + "name": "Marjorie Lester" + }, + { + "id": 1, + "name": "Rebekah Brennan" + }, + { + "id": 2, + "name": "French Salas" + } + ], + "greeting": "Hello, Christi Lindsey! You have 6 unread messages.", + "favoriteFruit": "banana" + } +] diff --git a/src/test/resources/schemas/recursive-embedded-schema.xsd b/src/test/resources/schemas/recursive-embedded-schema.xsd new file mode 100644 index 00000000..1168cccc --- /dev/null +++ b/src/test/resources/schemas/recursive-embedded-schema.xsd @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/test/resources/schemas/simple-service-types.xsd b/src/test/resources/schemas/simple-service-types.xsd new file mode 100644 index 00000000..5b25972b --- /dev/null +++ b/src/test/resources/schemas/simple-service-types.xsd @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/security/clientKeystore b/src/test/resources/security/clientKeystore new file mode 100644 index 0000000000000000000000000000000000000000..516f54ebfd0a39d7e3d25dd7e0b3cfce934f52a6 GIT binary patch literal 3212 zcmchZc{CJy8^>p7Fvb$bSfgu57;A$pQ86l6%a(13m_@ciq9N5J4B2A}gU}U;tdV7q zLS34%6fz|mOWIIe_n!BCPv_oq-uJx!+}}CBKYrieKhOD|@8@}*P2MIC004mgb%6i@ zQUuYTKs@bF4hH~$0c^9BQ2+o6z)~UKvBEF`br=u=+zk>10-*p16*6b9Y_30xaW$lj z8TqEB?vkH@MLipv0=yX80y#NZ1kFP%V3z!EXyXRR%(kZTk@E=0PH}QkW{Kz}1UYd2 zChCfAc+KtBLn?5Y8IE*MufHP4N;VB~s)k9J50Uw+qEY)lGZ+{{fD z=DK&U5VAN`%h@$0Rl`|6(-UmvgNpz^ixnGDSc|9Iuyue55#$bVFIeTjOEd1qoH|D9|y7YItz|4s1T zSWrM^Ru0N49rEgUs5RzpY6hpSLRpzk4at!=%joUM`XvV}La;iB#Q!LbHy4_L_PbT?nfmni4+Ye{xj3L+N&9 z&5e)-#KY$)b!1#bw)6Dhjbj))SQ4_*zGuYZUB{~B*^8-s+R^GpD%RG0X<~VI?x$a9 zO`;fRrL>LLXbOipZ>?*bym!d9JM)B>W-!3${`@nGxR#v@IP@)pxoAfI$(a5=kSr&6;R9Z@GxyapnqTSZtH;*6S1$%!l+{#x)h*n6eR+1H zAuzg)0`~F9xy&hJsUcb^!FHnzXuGr%0RR~7ZDa;VJ2oJgfZ1S)g`2gA{ zJ8JWNJoq8>nXQ9-?Xig4vSU^&B!N%Hkxw{+iXpcv=7FXYUQI1^@Ao3OroC&(A=*dw z{tv7eG^u%rZ?Ww?=cod>v8~G_tfjoBnEH*B-5QU;rXy(sVSKxW9Bz zO~?e%YXmcMI_M#JiasL+@$=fb?75)f9B0}eFx`1G5V6WtkeIFKKF~0^0>}Bf4bngR zSN0%@7$ei{Cs`(fQdzl08YhH!Pl@(PnbanRXVBJti z9jw96!ar9E6{z&H4cjvUOa&shhX+sqLKEL{PTvU7cnZ5uU;Kc>;)ZOkY(Ml4vExc17I3Y0Z1dY4Mu z7rl5mlUU7=-!!xl$lRSV)SCL`H;)9jLV<^(hSdA1uu{nfb)2!f8!mT4ldtKVQ(cgc zpZ~%YRLh-(H@?x^^%0?JB#STNg)2{y^-wrB8^;xCh2ab^HGRNTL8Uqur2nD1VczAb zvCP}(GJpNd5lQCh17e3VgzY{nCJrkS)<9q&09b5-HO8X1!yqRL5yy&B;Y13-hZsl+ z3%?AB+m0Dl?vFoVh$Li3)9^5%Qkid7>_wGpoJ~+_O0fH(pAFv5*|xzz04iU%%hQ^f znk*s6g{|o?MKm6S^E-&ti1o3~8)E3b(hq}-3rN8wM+2U46~a#XFAOOVCHNR|Ow%Ki zng^R)2Br^y>vON-LZHYFaWZW1Qn$?aO}s2<#piXIicvobYv-CKbkNc*nvQ;(l5##R zTZki$FFA5OGFJYcO1}#e+I^kN?dKItT=L(`$V25cH$nFP7`$1aU_55sF=x=6*I0yi zcOq385Z`Y_<`IU7Hk|=-FGev-x2ECVl3+bQJA(T!5lv~#$2pF1XY);a7m;(1*j3T8 zwj_#A=KxhLD&^&OBcUFpNAd0PWf8rqgb}{#`r-N`! z{7JVRdk#8LZI)V_R~7U)fECU4!N9Vzba_(7w59L8pbf(lj_nPqrwKY*U!xmt0pxR% zrO^e=GOWq;$D|w;+GT_C%N_TM4%MUYNPEj-v5c__-G-;QHP>-Ccj|4YvP zB-TJ)MQl!KG|+!74#^VhLXYstNyR2CR;zFFAD12gRqhWg)%B`zwF(N)z5U>(U)_(X z8k*}jEj>apZy409UL&eSn=N3Ex-8Wm?U~Y#Wca19rYrRQ@d0sgF|8MYIYKVkjr^_C z?;C$KZE-=oyRW;fF;=nrjb97`HevRV zH*rRj!xC;ZUV55$vlzqXroiniNvFu+GsQ`6t!$qG0s;RuN59_di$9t<)fZ4Hw+^BV z$ic0i57IyOi17mn$Wt<=2;w!;>Gh5gnKKNLwG&BQ;_*o`D>gF&n4Sx$`K*j=qoLb< V^mg-Guc$ohJ--t3mX%X7e+TbSE71S| literal 0 HcmV?d00001 diff --git a/src/test/resources/security/serverKeystore b/src/test/resources/security/serverKeystore new file mode 100644 index 0000000000000000000000000000000000000000..cf3e7612ac2a9e7be9a812ba82f1e73736dec458 GIT binary patch literal 3213 zcmchZXHe7W7RLYoB$R{>3IU`n2tg1Cy$eyPO0NRaLWE%GO%w?R0R;>pD9y#tQ4tZO zNKxq^Rf@C~1py0@0J4Jg%kIp*&ZEvA0#?MsxmAu(Gq*2V4vYj12fUVfhF)7UQrT-1bt&GJ+Xchp^>zApE`su(>fem7}XtDdqV0f8Cz z9gUe_)9O#3bF1fGd@L_&-o7}E)qd|eQFNz;GcrvKM*d}MbHXBO%+yl8#Y2ZysKY@& zsduhhv;|Go3~@&`{q^(I^-LsF8JFUinFV;9#K*p6k-!|Uf%kACBj(LQ2YuoNaa6QGLJbT+eH6%-pvhmxp$ zC&Z*HvLR|;E9w@V`gMdqUM|I{-Fd@bj6cn5l+J1OUHtlxICc{P1p%;753Pe1IuL^h z4~!4ZLxK|mv7Q9qz|gQn81X=BXpukOIAQ#-Lk&Yi*fL3$dESvn=ZI#0spN|;Mn4bu zKxYR71_9(TQUC~;oG%vwtemc4S7mLh&dKbh( z&*SK?#R!L4XvE?ZXQvem8=U%PPeW_7Z)yfHakcOTFb~Fe2=DBf9)YZSzAu&5?m?oh z&QaJ6PdQ&s6Z%LdM^iG{C;3c^&fbc+D*8ma$Eld9H&BXO zvuufxcTaRPxIVv}cy#%Qg@2%DTOa9I6nT6{o4r%wWo&b7X*eN-haBQmc;x{eb}BP( z6CQHlS`hftv7xw-2;4z^;8@+&1Lrb}{;S&PY{ zX2Z(X+AVRSeo@~c;vR%KV8zXvbz{Znk(^3-7v1{Dc$GkRB2Z&ArM%u>vo*Dv<=k#y zNq+nL4T%=EjTo-h7XgfWww1)|zk|+npw~yz2Oj);Bk`BhI+ey>w$EU(+`Lk%a21tr zGtw7&$^~*=(P+wNTWC4I!{UC${`Y45bG6Kn>`RtZ=K0e(3${}`^_Hz~=3Nmo$+9!y z)^}1N3c01sq_Q8?qG9hQEBbL(IkaWo(AzHPfSJJHI)Lv{e8psIatTWnMo|92^zmx5 zo`QP}H%lIhM-8z#aU@1jg;P4@)gpVOq~Z3Gc@o6U<743MsqxwfI$PA*xBV6I0WB)$K&R(p z`)XO6zB}QUjNq{(1Gxl{1v1-d5coTUZz>(d_ttsC&I)y&O) zk9_~qAt*7#-MwXPzSRLIm)i%w00E0!vDr@?b0k=Tt)EVTpWFBLi31LxBbL0TO z$&_`%pwo!CN`v|P&TG~iFro;S<*SJ?n~~M`PFXHIg)Vg0foFJ>r$Fns7tAq;^J2ZO zXZHffbi^}QaIIRkriqT94?B2K`R5<54b#Voc_}LMqtY({ikL@pNL7(M4$`qn`{=@gTp*a`;ibAc(%y;-jeN=@{%rR|OTU#q%_GkLT-ld_;p5cs~QXGUGanEp>_+$}|a2 zbjk9~(SC3d4eeJ`)HQ+Ishuaz9>NaO9jgRiesgN~z$wFKz@Z*-~LcY~!TpC!h8ahpW0F5Y&bH!LCoSK}BJa(k=}f_;!OjBkmGd*wM}zp(85nqR%E zcV{Y-&iznS#TG6NK^o;Mc@&f8b0@}}maEJ=XVfBS-sG;?hiW)eA0nJral|)^-6^x4 z_4(|V`rU^81;|qQ`*stQ@l}k@$RH@vUsHTHXi;)3`Ss6WaM=6NFdIKJ=kFV~~p(>6txq X!87#;)!d-s)zjti51sAPGMoPez&#{; literal 0 HcmV?d00001 diff --git a/src/test/resources/security/ssltest-cacerts.jks b/src/test/resources/security/ssltest-cacerts.jks new file mode 100644 index 0000000000000000000000000000000000000000..9c1ffbe49a7b27a250fc7d00fedd45405744fc38 GIT binary patch literal 29888 zcmdsg1zZ*R`aa!#=sbXQokN3kih^`XH_|DkbSf!GBM1V5NGRPR5|Rp10!j-aAxfz5 zpL0OPSa;5{yC#2}VXjB1E`)!BZzxD-0W9piKBoe?>k7 z7Y&m={7m=`E+Qf-Dgq>^2Z{~BL_^j_K?5OaYeLB&B(M!E5S|WjB~9Q;oM0s<3vMVK zga)<)8$|kL2UyF^)7=An-pb>Wvzt9s6e4_d0F>2&4Ga|#5dnWW^5_&`F0g{L8`#X# z!`9i&&ezHk?CEX=c6M^`fyzT0&36^I9zHj~prAV9()g$lccMl+vTkQ>1f!WBS1{sf%1> z?LdZHXJ%emiNO0jqL+XLk>HedBO;1mp0@4CEkVq?CG^Z%Xr+=p#4qpml%mlj&+cYz zzBE027~sjF+&gg)kw(8#e;}bX`c&V0Qp{-}2ZTUb%aS|aY;&V0r{jL+RJUjLDkR+` zuW$UGH-#kQYr{#lrc&)LDy?f4AC?PNI)#V~^Vn#S#wY1cKN!W=Q4AtMIa?OOGSs0L z**5i|xG;}=!nW9vQ2kYlmHo{dUPIzY$cPAtC%+*;+<|Wh5uwC7X7ql2XL|Lb_8{u! zO=yfk@p!QUGrsHE?NUu0b3{dUxz`7h9@wCax@{Gz${~}=>Zg&0_iy$+87>?*O%4^^ zZ4;s~>sc!ASV)-AD!2;`x|cHDhjF*IH6<{>$t{1$4wP&~_vpIVXP-EfVF}fho$UTT z8-G?cg?*(=Z+he283v!T6!?|Y5@3(p< ztgOsE-R+#L+}$nApup}AUUl3nU+oD}I3yS;7?7*g9AqR!BqT(Xliw-|U_>;(w;|LJ zN|-idfk5&{7XfR+uX1Eam?5W*be-mhy;d^EHvyKF=7Jt6GenRV3gJIiW?smN&40~B zgKnN&8%(EyVgMr4U>`7|kV8lViO+iTY7kE9lL{Ko zv=IwRT~zc}&V`$E8axzIlwa>Y;U|Dcj0~*b^FmPuGU4KD9p%2gJIbxN>F;{2>=v24 zdi86bYqit#rQM~NdJs19Qv8!SxG?mbp4H~;UNXJp`{65kw2Bd05_-8+RlDr#u1k&W zA1ag-W=C`E7j%5nSyKHK%!!w}KRF>2`2-5noC%KkM0UV_gQLp4pg_DSAW^^1fIYZU z$OkUB-#b8F8{T6F==ogdtH2_o1I`Z_5LySo0oL)D_D0^!^;N*Ez2M>yU3T*M!X04S z_rm*!4p0mt3X@xG5Z{q&;{6-0iT7vkDE!yG-0|#0Z`LyqS4h$%SoieS&L}L*_%dJ zT7Ki656Tuuq|Gn29)olFVJL{R*zPsvcIO?We3^%gs%OVG@NRvCI&?2Or?H^FU))yq z&URc?2;Z*@@7CI?d{j29KyA=X0y)HWc+Z9B*dK7|m#zlT7&q>{fT2y-kB_oHbQr5g zOQqJ@?q*PjjLl{>9j@grTCeb6Zug9?+~!FBaLP1XMUFe<_9L#GXZO7AoZTiI?qO_L zBnmAyJc5vwUg}j6C>|J#8)~j0zoF=UQHz1!lB=3DL;u19b$!wM*u>jJGd4NfrM#BL z6$)-F*NFT&Z`$p)Pa=Y-ZU`#AA56e{Pu6wYtc_Gk=33)NcsB895bQTE%_VTAw7_&j1*AA0qd?Ofd2moB))N8G*OYw;}GTxcZBDjRQ6^OOgbF%6OCg-*_; z5T(;3_o8jD5n({m=HE6B|lrbSgr0bU1q+D zI7oZyz&DPFlE}99qjefFvAp5ErF(W{K^z7`-Nx+Ok7siYwK58{5C%3j+d5Mrl&1wr zC-ayj;=K?w}wM%%HP$E}> z?RhS8RCGjMdDK8#-Zm!B;#@4Gw-doUI>zmj3S>#n`dh3(II`?&78`-gU;E6Ql=S6 z-KyvwBl*Qo-pF@U0s`CjOAJ2cO6B)ZkRDWatsA@JzP;3x{=p};u>#%Z776ZDj^1NA zKP(AzR+D;ZbWObh!Yjfa9lM8BcJXnc9xEwSWk`s~c|om^pr#Wz^y#DWrwPN#gs%6^ zo`~ljOch-mo`VF%90A#&Fi22vAn~t`$+gM1`nNpQU_=B64(xV7Ur_c5l>8;UU)kD73+iyOZB=26;BHw+gY9tt`l+nj7rnXw8e?Ym1k8zngvN-Fiv=eDJ zcp)mg@AQPr&XqJ~FtHX>iIaQSVg`K{mP0UJ(e6W>eF9pC8|x9ckMPZ|mc9+)NZyT2 z40RJ(1+Rpxh4iI3VKlCuXRdbVn1A*``GDDV){M~O?4d4Y1it4P?g4c>vK%BLv*eK> zsY(Lnw~y`;$QInr#u`aBPsbgI4DR5?ndi7EzleL2HM63Q-9Wcg2)~RbV6y2Z+*XiS zIeEa?AsYv0b2A4E2RmRJj?}mEg834@S&Rt4VuS!_{mqfZKoQRVFn>~SV9{mJ11K?s z2xbMaK-ls}=jC>?@_kyX?PuAqa#Q#y>#?`Qf1ac#|Kt`QN&%-{J7<9uKPLJI+1NwGA*Id9$Ogd*AJB z>ifZ{?ox|B6#?~&p~I!!wm#0atAvvg_Y6;|gEqC8Ld)1VZq5bHjz5`tEU&~L8E=f3 zvc95OF!iZz`W!pc{A+=IZB(>{DBqQQLfzA!{KW0j>t-Yn7_k<1@1qe~;85J2##FmwdCA)@@;5M(5j_#YG; z#x0z876?2&6#X8r5d4J8N_#MIdnvREjX8uU6#MS!O1Za915%SVTX#kW%XNGr`%&UJ~CQ19#$4U<^aQd!gRs-^|gA6!PT!u z3&|LOI0k@-wF6w(?H?8c@%$d*0Q?K=0bzmg6}9BSvVbvic7t=*P!)7ilj#%{YGLm);7J?uba5akaCD#DE`Si{-bv222%%R|HOd18e}W38Mgj z&HrDw^*d{kjGt4zp_aMq+Zow6MTW;+o-{}$j`ty{H9Dyitt&pItJadz_lkp<<|`pq zchi8%6ixJ-ntP6VNl(jS93yQ47uPD22i%}Nx2fIg4Uv{CWtR5ta6T8sy&EG_d|$pw&E@zPOuOGAMh+AISb_)X2qEPQ0%2tP@t>cO>hc(^yZmC?OZ#$$g%+4UF#m(~~d?v-Hs2Eb(z_t>4;xVt+XJIEK$f4<==!2)O?zMP_v+WXB&>S6Y8X=voNF$XlI*^BhC6(`wOGL zmf4z2cc4H8d2F=QTmyqcI< zzU9Pl!j=AV_dn=L%_oBr`n%FE$?&{sV#(9QSEE`vpSW?S>`qSo8M7zr-DvA{BinCh zbhs9KE>gG`Yc?m|S3{}}V|KF`^HekUB(AxyMk(1th=3g?Z|7Kj`=0u%voC@r9j@_L zUa}uY`VfG(VuiBVr`1#6-TN|hr%Qq`<(Vlac_ZqfLlob}8xs5@SL$JFcFDua#mddy z*~!eo+|1q10&d1e)|)kBzM3&)CcuQz1MW2XSBwE1{69J2PYtA@BoGkHbYXySbgkSy ztlXTyvSuz;P$CEc>|=BgCTtU|<$TErN(mu{eTD@h)Pmm(;C-FkJsmvkoNS=15N6mu zY!Kb|ECS3Z*;!b*gXQeJfIPdi6ZDv)K!$M?uqA=jj@Ja1fh`KiRl!g8C8>^yNJ{Z# z)m-ppOC5a`+!oG`a4#(gq^G|nsCi*5{Wqfie`>YAvvQ4%*EJnm)l`E?7SALJ6c{u+ z%k1MTzP;q>HWj0kaYHx9d$>nZ{k|P`f)^PBddkH|>etV`j9C{-&c#ug;E$&vi%NMZ zAgp_~bsNLwwV0fr+7+|(_&LUBk%S5?@3GPG8m5KF(TlaO|vf-_l+9WzmXW&h9BJ@H;qP{86wYdu@sTL3=NZcVVv=}rqZ#&qikOCNnuU-OQUA* z5T>N3lR@}C=#Hw}A|wVHh7#ur(Kp;6dBKP9F9>(<4QZ@`oU(pE@rhRJ3J68 z0dHTJsZ1dEq2zFZ-cDx+ritx*=;Vt)r)U)$Ii{Iwi zOiccSJ%L98i-VLUYp*`Gop~$EhiCM<;0b!DiZ9<`BGtBF=~yy@pe><;zfAADOzubM zlEmfss)zB3UVF2RXJ5zlY%T++VJu|mJ*SltIsSZ*}H zaw7rqW{*Um+__SmD&hLD~EXjDStNm2WUQmlWc`scqj#rhw##@{JS@nC&3DOYXC zaL-fxMlWbj(iqM4YdT1cvmrWrE~R|pSqb-K|n;; zY|R4y3+c!eOsQt~L~;8i&z}?qMz;bAb4Rrux6`JX^T~KoAD8FS6_V`JZmU;T4Y@EQ zp4&T``Y+t;h-btxJUducVf3!E8f)?;$#vW*IWC=WHh z%!M20M>G@0ZQ-1-%Y2%7Mfys5hW8mGE?sFg_F5e$&NFiI^~bq=PCEdNf-N9Boq6P9gYYSgi>aLz6M3l#pM545 z3?5O}{Vnj*`6lto`Q7(7Zrhl%=WnPGnhrY0nCh9`Wp2rG%Al;1PY+&(cNItkMZn7N`dCBwwWy-r;g<;| zKo85Hrrkx$l?1kHH>0qGO0oJE=STm<4GM}sY1o;{~6WV!rc8o2N*>Y$;)j<>?`aOS!)$ZCH!QtmxCA}9p z)4?M4K^3GFW_4QCi?XoHWia9>0JER{iX90?qyPj6phtoc34mj8AVJePL6bQ_WBKr; z!~ek3`H?AM%VEi33TL$S@Ng03;rU5zG?aN@$vSQeH;3=?6EO8SA;>UN<%=l8B^#dE z_+@@#gUlSHEq?zH3&H-QT4>6dCT@h>1q z`<5OL3$bqd)5q|W6@661J7n^Y0bzZdPpw+Nw%b8~yOY?w**-Fod=aIAv!7Yestfvf z>8<3Pu4kw(;ktq<`S!EahN1}GdbbZ^v*I^LX~x@4Wv}VsG2GxW&*P-4FGXE1;q{Kl z(Q>D#GDO|ekZ|OZ$KJuZzOsh4SNV(R@2Kp5_wt9aD_@Nuk`w?d!~l`IjYQy5KTkt2 z&cqnBN_~RFMvTqIo-PNxb=T`oSrAz8793YxuWZEtRdf zgKXssf5NiI!C!+i5yt>0GlD8HXsY1jCoICyYwuX8Z4!C>t2_2*HkOkcY2q9>i`0AF z$MRb>H_kt2ZuLUc4N5eo-yEtqTpFa;>$4-9lcUb0kQ0eAe36NOuM>lmwstFCUU|NO zAYXig7a4D}e|NcC{o11W&BdFomuuWIy9Gt9YexYggPjN& zL~wkfFWClZD6Ibc1Y1XTv{Eh$AnoV=GiU{>XyNq5Q3B#SuI_(hnZHw%XZdPQU57gM zivvd0D>$~Einod%PJ}XjD%w_5p9rf0dnAR^;(K<##xQ%2<_K{jp+I`A(P}=al9oMt z5l2qA@1S|k64RyQpu(Q5nn$VY^e_tw6F~~kQoLg;t4!Lcvg~yGdwNH$n?~(=uUhBF zFO=85c;Gi9DEhFg{aU&VtdAmoRugSC)DRmT^vHq z2y-dB&PeFXURF&O&%IiMZJz4u89fzw{(QF7WKl1#N1Ze71-KkBD4a7#OmcUe3d-6+SUaODKDs$@JnW(Gur1~JUwcfc!z8BS)cNopc?V z-mk^B0eM+pH3)?UK&ljg79k=Ln7KSrx@M9p&$d)vFs^pN_oShQQz!q~wYGn!2L8Xk z*7ol$_Rnf<%dl`Cj&M%e)Nw5&u}s}=ep#*(ci&7$?74sYcArG}lUtFqug3E2I;v({ z+6olaj1@$#j@+oPawcve=w|_Cqbg=VeL-V%blV0tz)O$LEe_&hdly9$Y@+|KO>=F3Jzl*iLdUvn$ycWRr6U&yHbr>=U#8j zC6!LFN+Hy1-8L~go)#lWr?S*8Ph;>2^&>`cy0io3Wm1dS#~866pdX&@FL+H=Q77gp z_4Oh4+4kMBtIu1d!OhGE7qsPc3@Ip+IX=B>EqUYG%g|xLLk9hhJwnqW6O_walpmO6 z%WR(RnCmb~{CRV<%R5?kc1i?{o^G>#d_L#^_n z)7rTQq^x~1O&(5xlPq$D{c=XbRPm{}v@%H*2%IQ`9(hQp3>FrBAypsS9L??RJU<(` zNY}k@@tvoi9_0NE?uKb#}?kGjfdbeC_maBo6X zyIYT7uXx>{df?o-8FsiGAv^NIUsx3vH!DXwPsd|--0E5T)tJD@BxE+g9Vh-Fp)~M+ zcE|sm4BEH)m1AH0HG`&hv@95(#13IS>6NLzteoq3=|6ks-(=DL=T`hXC*5s5zKbq5 zPMHOI;VFCTH{fPv}0AU&u;bL$*KHNXI`|(d4X47W73mVO&@0$n_~X%c-f5@9<@pI_7%DkzL)Pgpiyw; z!vC)K5w27pylP0jzbVxzK&ilhQbir}NdnW`13%a*$oUg$1<*-AmD>??ML%w9gmS^d zT_DGN>W4ql z;g~>dn~FtyFoEI>3N@#1AM)?NiTbh@apOGyo7w1O6wAAt_L?TB_n+7Vw#XpG9!w!( zzIlZ}torHW2F{dh{RNI!bb&5uB)Zp0H}O+0);zRjr0!MGhul@CJzd7}{H=w&U&pwK z+S55Te9_3I7UIt@JC6y->ed&HN_ zp6|0;v*h6J7rGm+xNIiTTgjR1e_Cg=y>lzVXWeIA^)C7);a>n=zOT7L@6y3<>U1Jk zczOH)eV~Z8hQP<>V__8k;~&-q3HrabD*jbw05&P$zcp9*AGF5bS&v@hAwnZVyTOuY zbr+S>==4(|v7}*O1xH26;V^LME64l0`D-|vWca7|3ip^s+Xg}{w)`yyZYgd(zQ7l2 zDTQL&7FcIVEq|$V%;|kHo0!@%|EM=zQN5#VLUNqEuJM(Qk3IP)t1Br&S`g<3L`7b{ zz8AU~mUd>l88p;Us)jZ{@hitfp1Mk3v*D9eicFG9L=kUp6?_{Pm$b(O21)svDq4;l zWw=ICS1q57zMa-FOEf8XL_=UE_>7Z9Y?%$Sj?mJhx61t{^_e@3W{7WR$qI1hq%cn7 zEv?GAv!`#`C9b;?w~O3$Elj|4o_9sNU$3vr?1S)O7xxw)gmt)BFDEO@F5xp=VMvaV z-4XQpj%Imyq41l|Z~!id1#m&}e@L_RpRj@dpJY_gr~2Uea)D(g=$Z_%rdWenO3*5f9k5xWmxf0DwEkZE`xr*WS|m zoK>N_{gKS&#{Cj~r;!@J2OG%4~4xC<5i>h1a7VLC2#_VP0S=!2hY$ z=s#gue@3B{s+_w+6kfTK2Sz6$wPfcwH`IcCRwZ^V(CfBMjki>*yG)mD>!c>flyR+B zs=)QDlv(~DQ9QZ}HM9c@r-*4Qg6_mzuI;ryhrEe|^P=Ro)G34jkEGlz47U4`*zY4Q zWoh@#w_h2(Xju|Q9G-k3g;&j4ysO?CXYNx|tx}s;loG|~)}p4UJR6?JHyd3kOl!Gb zb9TpjS^Fi;mU%z7(lio#o>@7-hP=mg*d34<0HLOk>JMm#0kgqB^!XIaTIZFnj(&ddYt8J<9?N@oolk-2c=Yxg_1DnU9>M-)4d%34DN$XrrAk#nC4Y%5Vp@j$L zU4wxpX??}J^r6vY-I-CEwDo~ul#j*EOH^c5`#(-JBDX}EdxnNVXy$J*$B_j^cJX?e z$C|Uc4!Uw(fMMBkQ3gXv_tR|O7{uh{)e>+XCMl&kQ19& z@~5OLyfx7TXo6I7vUcYARq4XXM#vxfApfp$`qMs0*ibGgFI0q=pAVKtfgW!Pz&2q` z1An1n;lE?8zpGp55=}FPlFi&@agO(!r#O_)<9|5WR;0RNyAt~Orl-$9TeNyoS*I?t zqGfhzFqOeXfRMLhgHS5bjsC}=%j-{ZAnJESvbA?VRxClLLn`YfHb^ZFA%)hB#IO_BLbpgW(xjrgjIPt+B z7ce~fn91gs(x-gm)7uO8d(u3vCa)-;u*bjL{XJ9g*9sVp%hx6EMQ@H;Bco=^?wDmlHtaq*^Rr8cKAi(oGP_9x5-Q zF&AY}6w8TuRT{p58^*8Y>nB2k4|LQZL(}bktkty3a9LGw3)(qQ~t7={ts^ zTe*N-y(BU&DbJ}z>7<^iqbX#g1aY4w)X$_P8Bx;WbQiS?u1FEdbab&fvoOW=yo=WF zr{Ee^yl@4JLWD6j?w4S3i&I=h|d;f2QmYxVja z-=^6i`vEb)B|y?lj{Pq%T(j=vR}D+M8k{h9O7dU2i?BeLGGDF%1-QW@fx?pg+PVv6 zfPi5iB7-Qt9ti%n`)j8zP*ETN_(NfS!K1zi0odl3PThaywf_uJ=bG@G5;)t276qhF|2R zXVh_>^>vX|7crOImkFf`hkAR=W4IRLunW|l7OAzfuDmZ{iil3XL4C)jRuX4qXHNsf z^N?!9#bqO|m8b{pN&2ht9zNeo&v)O{ZQ9DooB=&;eVBjG*z};f0QJ*@DRh0LVSVyc zi}$xJUdH2GHmXGPeHXT}I*feJI8?&qkYvrSaZg0h&2!+AhRVC{c+NWUg>FVoNxD<1 z^oHnZY)y|v-z+(Wi`u7nSnxI3l0!GVW4u~EWycz^hZm~EzhI#hIYQLHG}05+cp*z4 z60E4#dv_m0OEBC|v{u+lVCR|GOO>f>6;m1ORs%ulW&{*ZC_YpnbHhUVQpP>wJIV3d_jPR#gyR(4fawm)}Qe)f3`;&YCl zT^#KxEt)JB>1z5nwr+AaP}OXyMY<i6x(UO+fheia<$xnFJ)scaTrK z&m|JDTs!m{glj#g~**_PhbX2 zbOj>X?*<9AAX0ww1gn64E&)GkNQmE+7r}Hhr~!IhqK*!t(g98dOQ(Qg|6_SH6!yzN z+7pxfj*mL_1p*MhBh}^n`sZI}3aL2*x8`&5Y+pyrp6CQT0T#TD*8*$r5Nbs{LX$RZz@O)94vwK=@6QbkrJ?4CX0&EaUtBQyN^#i^I<^8|dG$8dd^vol>Dz zbFOL&(>i_NI{(a2W-st%0wvZ35kZ@GlG^@Mk`GKQ-TCJp5Vb^D?oJRL3bC}^mu*=0 zbKWpaceO4Q}lIDOs->v-Vi9?C?{j>Df7OHS~ zB?u~e9dci!rz#^|c-LQ-ecKK1Y>lMYBB||e^O}cpPN29$&D;?X5J3v5 zGtuAlpa9T;Tfh%C5{iPi57tRH1rHNbPWUMxOg#2U7$7WJKrF4D-JI;qzSOy+gRnKt zoB&`1h`O5@^teC{3q+vl=>%4>vv6~E_W>Ge9o^xr9k8$x!~olM*31h4Q}A72X%`nj zJ&v^Oh~fRxkBbb#QB{^dr>Uf`$)(Gu1ru`!eEJpy!Vmn0i8=5K_&M5y1pUX}`R_#d zrnqa)8K;!~xoeU(68+6`j#2C>Z8cLo|SoBGfl+cZ1)z&l-f`fEhmJRAL~R) zRc0%Co>iH>;=3QxJ<;maL&S_PC8CVHnrS!fq%mYwUG!PaU{elak*F+f}n$` ziQzIe?q-xMQg_BV2&a6M&cgJn@Cq@%TQJ$9Cl6NL1*d$**b8pfa!X-?k%)0<5B97R z-V(589hr3-E9V~vr+o0L4+;M&&d7QI^wI*vS?maUAtUkYoD^x8b(i^GqDdjdFjI{M z!d0|#J{pe#pGHmvfmPW9K#S<>=f~4fWToN42N0hpCkLP0{HI*w&ydtaFS!Ne^EMeH zrOuTLGhzlgwE7%8FB&QtkP74L~hld%?Q~x(qvsOwe={jKwsU`t+yuj zPZ473hoIr;`uBr=&TduRGXC|rBaFAk6R-J$5yp6+_{)L2+^ z!BF)Y*MS^a(;zh(wysPBMtQsh;3nhHwuY?=W1w+jz+a|3X%dYnGdq+r06Qcfee>H55 z{L$dyR^L?Hn5d5>sFpZ{my0i3)%NtB|85e|FAw+yt`eAIySTt(q!r7imUJ_Xl6XGO zo83I=7K=^x-~gqu;_J4`{DCQHO4Rci=iZ)m*4DUxDpv?=)zXWdoAcf0)1L7y`>tc1 z;zCcWP?OE;3Z|pP1^t9Cok_V{0FL7>=*D?inI@0W*-xm>!0__+N;SzDOv@ExRgWE1 ziOy&ZoJo=gO^z80k1Mon@66f7SEt{`udR~=U%q#?sy1_;rn+P?>2_OZNa^HzmIyo) zhmpgn9HX@ejT#OTq82JX&g0;itW0sKRHGh{+RaZFDK6lg0~lXJlcM6q8V3 z!ubz?0*P1dd}Lb*B?`E%kr` zRs#x{eWZX$h}A#ppUe09_fHsKL<^xlQdN>4#uvfn7J&uehzK^Sh#$%ipX>s-3O?B8 zmw4#ke@B0&+l@p{lF|OYDTr@q8$=9{w!P(UouP{LQ_}FQ^;5iGmXzV#aATk2qLpDS zb&`8?OB5DE;9K2K*H9Z=Zl;K!Oyorv7A^FYweqEp2pOKcJ0Cb$z-apMvm19(R%ic1 z6y9}jQ=_%g2z+@fTCsGj^kyTPv^PszLyvvQ#!EA_ZUj8?H*EPF~HR~_2~+}@hdBIohRrIp6V*tI}}#Y^x$DLfP+6ap_S zC3<1yo720Glsa8q6TWNy`Vu-xiw=`tn5dnmr+yWSxv*)=e>i<(8~uHu*t@%DD>C*I z_cPWOdFhMKdUd=|6<(Mb37;S7^17TlTG1D$QkB5ya5Z{$#ebbR>Cxj2y0cuot`-~? z3Cu{C)qyl?v%R$elMxnOuLd2MD}b-nnt-Y=S&N*{>CNVe=Ti|xu6F@`*rUD3I^u=D+byg8yV3YYlJL!E4t7l(149Ld%(cmGv%U@(9V?l8<5q zH#gdICx*wII5guwp30X9-N;@xd9%PG_nx&t(r@}D`$kupCQo(`D&lq8IBRN=LX~}k zYIhVS>(xsEOZtz`rZEv~tulAM3!oT*xWtu}E3hAyuClF--YiCm$Q#~^y3KDgDVq>1 zIBqRgQCk=MIa5@EpzHKHnw7P01_inJp{u$WgxjQ9{E~a65t>6gqfR3F4#0q-LmpiY|Qng7)1PqXZA} z?nEv@f)Zis%!m>c4YXqh694L$T!;LN|Gr22mu9k}W=Te74Rup$=iaq@_fCHz12KY9 zRrgM=4<`HM4o@X*Z>RCav5<(|lyxNmiA!kGdgd*$dbLy9!A_p}7$^(=!BYFeQ!c9$D>n)73Rr{V5gFt7IWv zl~$cxzPF1THNzdJbn|<5!P3~a8`~c}nstnPectcUgw1g!H@|m{m+g(AOGm(pV0*32 zpohS?GDjrKc0mzi>YDULE3~2o`eNw^$@Ix}mxuUEK+j7XU(AY&^fgI%y5y4UBX=`A zh|3%?W*@y>J&fhJTO&oNkWS}=XWoLJ^5!KE9of-X57KW0sk5aO>?K0LB&1`MAlLNz zs|7(W22cVl@{Ik)kbc)e2*c?%CydD7VMuu(Tt{et`Iii-EO2LF*jtByTl=0a6@v1^ zTCo5d!V9BI;Y2*J`R}`tKSKpwuIc1NvA&ag>7S&_#fU8-1pxsE51Y7h-ZATQnsL3i@Kv| z#1Xz(nE&{+K=o5x4e8PCM9){Zu+(%Snp3d-_`(S4Sjpe=t(+koy^x^j#W4JKz-X!H zJayKMgsIFX56mJrv*L1k(M@qqWF5?>Z7ccBeO$M)vI>d>pM$i1z;fab6VayAHR65Gtk zmMfPoFB?lx3n_LzU&((bD3_kCE@)oolISEk0@%q5H0${b=N})sJuVsnr|)s^LgUfOf|NnYO)S zjPM=F3S*W|CLsV~>GyB+IWBZZ{;AOYI3)j@FZTIYUi)|KPW=*DJd#xfzqXjtL-moF z!Xcr!p`{>qX${kitXwi?@6yhSW#%N_s%gF$QJ%@IbYBDa)I7u2AEVu=442wl0v-D9 zY(M8{-PubkwzyTHh=e~puP#a?<`8Y573wnC))7D8CjX>JzqOAqOET}qY8W3qwFIq% zsgqZxO;|@)yV;Qf{a@bi(_EC};ihIUSJTZn_Oa;jzOKEk!wH4^|gKF_(#8tA4@lW=+Zd(SpK;7LM`c(&h7%?_;A_W(D-b*&d+B392QxIJIT3K8mjl zD{82bd5MoMGV?JzzH+EdLh~lFT=|uA+s^a;bW5`p^R?;g?M?mD*u4DX)2wTJ_K$`~ z#fkJvE@N^%ad{7lPReD;f9}%Zm{iq$IVx_bD+t@EUm~~$zKvw#WsG;v> z2OhmMYxnZ|yX#+->E!eXE~-yw$zt*nR+kRnUzKmhKB-f`D8BgiSiiiy@i@=+UFyYfkd(N8_S4}x2gVV#U}iarSjKkO6^c`eDA}GZT?GhqaIO2{k-+j; z(NrA!B5fX{#$yzgxAe|(3BBY~#J{_?Q#?sKe-+Kpl%+>rqn~tL63ucc$=2VLkA%>! zEXzD54_V8;pn2gfD!D02i%j6>!J;Bs#M3)@hGls#7MTMX#cJg|cChX#T{ZLWJ=GE! zU5K~hP9gnS1$iTKXu&(?HoNMF6kM`PJ!9O|sN22V0yYKe@03qG# A2><{9 literal 0 HcmV?d00001 diff --git a/src/test/resources/security/ssltest-keystore.jks b/src/test/resources/security/ssltest-keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..a95b7c5f4fbe9f9cba881475b3854861cb182263 GIT binary patch literal 1445 zcmezO_TO6u1_mY|W&~rFV#CB@AV=73#>MqOiCqRwOxq0j*toRW7+Dy#m;@OaSs7TG zm==Ahum1KTDl}5e`kqee9lk>GwJCjfCp7D~ov*(x`E$+b6=xjpnr%q9^|4>@`!@E+ zi}uIu{+!!*!-C=Vp@lxxA&;l{Nk*7CEQ|PTX1Z`q#lHsu!v5(6#vw9KEZxO~bf#Zb zE?Il~dGkX>A=cv6>qSIP+-5VqZyGyUOVDFdgS=Z}_JfL#JMP&==)6<6Sh2b9`t5ry zzPG<5v@n$N`kc{=4oZz#{&v|`N2`6xPN7puSbB3j=P~RMOPb*@xlF*s=gqB!uVbHl z2<4ScJw8W+`&G{xr?Pq@ONfRqihy3>ye<~BGoZ+h#{_(N>D|Fs2ur2%ps7pF>I zDyq!Qu>EItI4*4OBcD3qb*tuHm9|&fwWayCaOz5XseaVX$*ge1Rv~TixJ>9JFm50^r<=XRnFV)>E5XyX* z`20}6VuG$_v3GNlivo}JLPd+C-52%4{>}87eQM$FyR%#4dd~lTX}Zdhn78D zytSvNb1s=yot+rkvqPAJ?zzMvo@KDD8@ayqLK67Bw^~d=)8$1RIHVRV%M2zL;>ym3BqC9{cp0q5C^#N!jg;Oqrb#c%Au7>88ae?(Y>*m{+_%clwSNmXJJ#2fue( zuJwJi@zm*L*}2hczl+}&I(v&Z{!e{~)NHj6dxQ**W%OyC*S>kOC&pB3PjK_JM&HO^ zRTfe!{SI<_w7t5|Kk+(W=VGl)mKCeLEB4tu{LIA6$iRr~JYXVV2D)pqdW7|<3-SD= zw~jv1mb8iy&d&Q#`!qf`dG>O9pQr~tnf__VzSRmDJ@rmb-s#wH?mS~d;Zu_jv8;Q9 z_!+M@r%rmY%EEvlj5C;{;O@<$*r}E~J@OlQHe8oaPUyCHC1O(4B!1-dme<8*cPnpb uEt|hX&w*2cNrXr4-_Nv(?*ugF{&{FJ?S$IdRLMmwGq0yv95LW9JOTidn?aWV literal 0 HcmV?d00001 diff --git a/src/test/resources/security/trustStore b/src/test/resources/security/trustStore new file mode 100644 index 0000000000000000000000000000000000000000..89b27b598e9daae9cbb3030f12259bfc235fac2b GIT binary patch literal 16970 zcmeHO2Ut^E)+GVyNbfClP|6LxDAIcektPsBfIvtf0W2sT1e9u{D$>P5QRx4L$pMM{r8^;FM%xrdXsrd=sEayuiS& zq`y2xo24n*EKgDYyD93DP0?5pt_i3weHt!}l!3uDG}K|=-yd9w5e~nyvOOp-SO@_H z!(lPI;lhC6(r39=J_2*VhY*5cR;b{eIJ`d~#Lc9k4yeG@0n(QXHLrmU{)$`pW0jAr%hOev%$PhnSnj+9VjqxYJvI7lgG*X- zeM<>vcZcC*$@Y|7?KfWHp~bgO^Wkdx!fX-Pl8F5s&uT}NAL}Me(CJ(zWNh|-5dx)z zP(aA12O1V7IImOI*O}UVF3aBRFS{id@*Yp>+iKt7Dz6{>62PkIxhh;-{=mezI<&zB|$3 z6&!Z$h;A;5;53t#y~(dCv$JJ?Q@3G&;WMo0mc=G!xZBIO{Um6q{Qxb+Uxd~Ys`mS@ zq6(@5B5D&54Jn4Q$nh_jaVHn1Prms2;eg>~2J*#2K~#DCBB;~=l_k@bUjmgP?AJg= zGI>?d!Zm)!zEOit~ok}>m{sZZsPgq|OucJq|FVQ6=oYkCW{*Nelxdp(snSr0@=ZeT=&t1A4b~rzF>&v_(MPgJ89V_2BcPBWcog`82d(q>ocme}R0l0k z8MMHYP!{M}?{F)_MfYvEO_{vzgIE871;PL!qM^~VbKBYL!VD0>2$(%_4j_jt`*(Rj zcF7baNEcAxb<*U1$E}krP#F#fzF8m~0N{YyiqrkU0{`_Bh{_>fGsz<+f*vsr8cvaM zdr$MZ7;TsG#F%YoBp{)TXV0a`s@u)F$pxOpQ4-tVrfu;>_MU0IXf*zY!V$aP3i?pW%$_T%~+jtg*fk< zI>-_<(a}}MG;#w1eN09Nv`YOmMo0qljZhQU(N*zh4 zHeK#8+xcFXk7~uW2+A5)F0@vg0WD*KJ){3I({^o@$C&!Y@*%fIO@%|AHK)ui-@-oK z@`&&XOL>T7h@tUE%h8jFLZiP&8p8%-th?WxD~cAni9Ep!R9xE zj9>MH%5TR*HHB&#r_MC-)f9)wu>@k}Ak|=1)Z#zv>XdIsVT^ z8UICV{FzrTO@N35%f8^Fe3LnRY!kBx?M&{YW8>Ki*TBf}vWHzqmyj%*qih`nE!&kP ze75rFx!qK6*)^KOG8<@RUtWu4mn}z+)4gv$1ufFMCT4Bc_hx;;XE>&F43{NE^I`10 z#jfK4lSc9L_3@n!Z>w7>?imTVbaDb;nJ^#Z)(6~<*trH*%TWeielDVSCg^j^@sF+U zwn;jfb-uGX0x^Bh@-BUyIyvS&p+NWk#>0u?jYmF;d&XND$j217$mQQXw+oHK4`9yG zzCmWFjWxCa+-G-onW~g`_oen;uH`vuOz?9MRrZpr;mUD#y5^{`<3v zUhY*!c&USIVXX!i&i!VTq4ckaG6EZ(3$pafDA%ap2&3$3xI&JqKNDpr{nb&%FHhiS z_Sos>eEcnc5`^Od%Mg{$qmgYDeug@!v5XA8O8xz;-LIie!V;f0lo_lme?=+0E8_T} z`fQ4Fv3(ED#1$Y7+woFe?=9Lwg6?QcTkE|E8KO^XOM&4snP<<4c?8O+7IntIsLF=j zv@ec(vH9}8>_u@yrN^P1Q_KZHUKS|%C||?UHTJk1Wi(o_ZS0nnq_E~-A1wL2K+hU` z@SU`PPlm$Yn%4QDH!qJg38rFX%WS&{eMML8-&j46yc!DG7M0;HGSgf2^+k_}(=9aj zh=D*ZuYpFQ+v8jcX2)b`)>J{7p~dq?mZHsX6e-uw+@5{eX?t*N$BD5MSNGN8b30Wv z{ZCkxef47UBH5$JYSbHy0y8Bf0*1%oz}M9r4Yiy#8m&5Xs3Yji?ZD__A)gWofr24M z>&y;~55sg#^KEXid^^0!&5w$hI-Y`a0US$V1=C7uMv5lj#(?2cFrmG3=T7;RxyU1N z0Sb6jAdY|z#^HA>IDk{rx3MSYmpFW&JWOvl%ns!(53@icc7VSf4CLWPfWgv@HWRbM zmH&i1O(d=ljrAd=it;ck91P5#L+}VJ5=DSX>&rOWgUP1aa*C)3D6huLfD-tvyb`Va zFRjImd?Sc)k2wWk0@bBxE1G1JloC=ucr6#J1HF0TTE|t@@ZuX!=Ll9kRYvCmxOCp- zy?zy#D$P;RIS+AGwtSQ#rQiBROABx1iL>Qj8#aTROsPu|Anqf6XM4n4NMPK{y4|#= zwGOjkrN-~de$jrBr@qP;>87#JaB2LXvk??B<@0#SGZ4vTu{y%<<1Rx^>2I| zkMzTJ1NTIk*PF0A%C*xD$LgKFT99$tz^z>GP4s%`xWeaaT8)=GrRcZURI2JJUBo&h zSnoHx!aFd>`I32mjlf7(TXsr>pLoW|!c$a3X;t`i=OZ=04zmtA>gQP`*IXEN0f?#s zSgGke<4qv(vw9E+6&2{&s7X1upfDAf@c86Gd8VCfC12$6AZlneaYBW#?m+(K>B7m8ABX%lUfEoh% z3WZPr48#HE<=K%H=$08pZ}0k{gS#!xT%mnsxmCd?F~8N_O5Xj5V$SZfC{_jmGrN}i zWpI&{CoDM_+E$t|%K8@_%Dd?3-ZoL|&AJ?n=}mf4F8ZN=MC494>L9gJ5l-+tsiF-OmDPMcET>D%fLHH~Q!Sn$k7!(qN zMqz_NF#7bFm_~d9V=4&710Wa)OJJmO6Y6jx2OtAT7e3$DL|B0JL`$S)q}ht~$KrNk z;mad5YewkTj4-Sjp<|>vyIL zQ>BQ^&-GdDeqd@X*X*fvqEL%zQg5?!hfoQ9X~S#J5?I@m zQtHQhZZR&$>FZcEqR*#NmvCLY&_8hDu+v%m!2^oBq$hG*`k^5Z5XahE* zL+fomz+!u0$hjq;ZU(dfJ|YBIsn`M5XgUlIiNN^c2*LZQB0yUsm45}-Q*lvoH1zf& zPm9q!XS;jGIl{~@HO1f6i2MPAb_PCR2nA1$Qj5Duaq2-%hEeJ{mFbXrLpoYJmMXT+ z_PrWX={tDq{Iv1{{EIAoZjK5QwxcF{gfW~nCnAcqEe7Qc8=Sg^4Jd1}64e9OF*mbg zsk`G^`4<*V1)wvCp;AfB8$5uGa~h+ezRR9;zOj^)y=li7``Jy4ERsX_2~|qoa4KHc znmjssV=C`)97^p(Hcw__1C`pB?%X_KtpStfm#U4~^#!J`4gqIWG2>rDvynX*v+F*B zcOOVi=MU3)a#1RK*&tmdLK@PFuVvat?99>bc+LFsO5d410#*Sy#PzOdncXQ57c?2$ zM6X0%jVukp;8|1fPK9Bo&{X=z^5^LAB*gyMRQT1L3+7 z4hNi{Et+DS;bzvFE1i>g*xVh9e7hIfU10pS%~dJIONYw0IkMhMz;I`KANIo$nN2n? zl^^aBE^7$TPd}1sxXnGh_4AD)s>z9CY7PLd5n`;UbnEf994|CtHb+n((b~;tO?tJQ z?%P`4y6ko{lQ);M8ltgF-jdlTFfgl)#pQ63y`@9I#tNqGItRS&K79Se5s~3h(jv%$ zP`xWFwdth{T|KK;aMwk`2?3K+O$f;AXWS)>BRaHN>t9S75H@7bpfjd}IIe4)2`Wve z!#xk8KHuQHO>#HI$62NVB|!RKxl?{#9ybkQ&pLs1b}7$OxX4M%^YOMi*T;C%{f3Ms~(+U}}THV`2J;Kopz}U?C3E zu+tIW!W@WnuGGVurWen*jT7tAVg0 zu^0EP9rt%z@Xug$M^)ADz{6{<#|NTxcciMnHl^D7pl4cu{|J}yG>?gjrrrCEe$=U2 z3KNba74gZ(xj!AhfC_GA1lV9KE8Aly52^VkN8TsJGmrg=`gg|`OS z0ai0C?Fj|Bk-2isctVYly;Dcxx=S&vb%ZVDG|BJvEMMs438*bGEJ&-%Q70I2Qmq3h z!IvNGkk}xRG?C@H<~0A3E10po+{0nZ+lQUIJl)-~YDm$Ys^Qh#Ez0#DXyX<-A?jZ( zFTdr|(|^(EV)VJWja7KYtWw&j^LmTkzNY!p&e;34wh62wMRC0T(H2FFY-h)d&TW~w zZi>o2*xI2jQF}P6F+(wk=1si&l#NsgQ;FDIC@NGt4mZEB}9)B%JOr>w=)TMp|FgVJ&v(F`?INYSWXg#E;woUW1By6 z-Y+ZLQqD%53_lZ5sr)ci*(ZVS76-L@GfZNz+>ZdnMT!4q+9FLhjRPFPSz?` zh5-#56yW8r3w;J2t#S6tnUBSmx&v*#L$CFf)^8s#xk(dixku@12LF52vwcTIRef18 zd-b~B<;u6vY~iS6w*H!y5jyv*$!t9JR(>S?r&gJnXwmI;RfADtg<%q$M!;^a*@<=L zha&{933QCqzGuDS=ekl*e zz;+-Apfm%y;_UmsIeQ7v*^7Wym$dBcDag%?<>|d5c1Yw8 zxp}!~S^kxq_ar`aE;tMk-Z;o+Zh!4;M0qKNTe{9R2{ZNb*ueV!Nao@&x6g#OOAnI} zZj>W(Qf1svW8?H5yXUmkRtGc&S3KWxv$VGI>GsRJVk8dVc@)LGnV`RbPQI6#vTF<(7k~KZLEn-HLyPuTJm& zSsH`x`h)UsPENBMV%7~kk>avd)n&zCw5AqW_OTrw&C$zV^n_pct|e%ioU`gtR6Cq- zk*TKt-CKkH`w47=p_Xs?7I0!hduIAF4XtQcrn&Tb^g{y7o;)k>gnt#L2;A%4%_2eD zF#noj+=$X!ij`BV-1TkdpsHT=K*Ey5sqh!WD70$gC*=)Fc!dD1d!p5Kxa?L{@Adqf zPF97ujD1nLJ6raa1{dd(@?>NEGww>we6SHpkv;T|gA?1>5$BQ_IrsH)u;Au*i-1J0 znzGM)anNo6A%nmARMz6N<8#e2+^C|n-J=j`8)wE@2Hxjq`YVnmE7&}uxjrF$TIuPB zjqpSgzW9H{mp2}T3P7MSze!wh5MUt4phtffV7-4az{CO3C4lk&2r#3Sg@Fj$2*{8l zOkfpZE35xQ5c?ah`DY-zhkkgk^01d{(716QqixLuKD{#5eV-gtY8cy4oJ5Fpu%@0Y zQtHH!F!Skf-u;5{6NQ8Iw~u=9UE{zSoY^~;`qGj)NLWX`grac&u8(tv7vlK^?yFwdwXX=6bWP!KeV+J!8Rn=+(ePLwpREoflNCCW+jvwAlwR; z;Kri=#E?2XeM+k)@Hw}gx9LUlu<=h7)c%XKB`Yf3Z-OyE0}LI(D*cj5S0BEVqk`oO z+Lh)M{F^FmWeB#Sl(fd$6Q49$&q`kxh{_{>bR<#O0kBiOpD2@kydf(OtF+Ll8``2F zl>905MH+MPRs;gSX;#ggUzm0r5DaYPO7v7RGKpyG$=)2AdHrPb8M|KYdJZadyc@#$ zJPLIHS@2q9uWrRzyv}vY^z){dGe2)@cag6&FP)|ne;1Xf-kLFBR+?#hst*X2^LtRC z5dMgDL)>SSr;FiBekg>pFsc%WI=i+3L~L?{ttDb1T!XB�>?AA;Y)Uk^r$$MF2Zh zYg zAYvWDjqCR41sm6J+T*2f&|xxlV4S$c$u#}m?`W4|h zrWY>+7h=!)xlSrn-OLs$$tFRMWtrcW>QCQDjjZ&>4Wf)4MA_bDQd?VkYx$>1?O#@U z;{~{vc#UP5*S?k9Bmr@9GUHxasvJ?oL0HRUKPkBVJ(l@1>bhHGgYEe0=s(uIy=H>Z zH^jK0{MtaQ#6sD7W7~nai?HCs@j}cYo#V8K57YqwmXjAcZg+LZBg?Gg&-@q-)Nd_b z9`T|JY+bDKm#I-O?a;a>MJ2&E{kqfe)#v@Lm35CV zgbk@`Uc2Zm%JyJC(;uQPnt2Pf+vg))Mz7;yEJc8n8~tTCQ@*hQ+Y!$|Oe})+BwvS# zwzK{|>m!>_9;jv5k+~-%X)wXc>bTCMvM$BodK^>R$aw>X{v=$sOimV$v{vtkj&!!m zru!FP!1xc`C_0@yZrlINLe}}zKz(%x|3|&I)9r70<`SC1UDt=1;7vKtnt-knx`Erk|$85VQOLO;7pP|5w#j> zt7@m8N-g@LBVRt?h3*rMKR;O|xQk2&UymW8tEsRFHl-@&llKNP2XBhED5Ut)-R5CpS}1Nl{210U5A ztw|7RZG{ObA*=s_uF5;8Ak_3Lq6}Kd_nL~|pf%!_f@BF!1dz-Z&lin{{e&!)NKCnw z327m(p8FoA)SDs9h!to)8J`(wb7&FMj-TlE(^NV=kxRuvqe{&%mw>y^{#s_^_2>9x zgQ?y#Fgm&6kHfs{)GIeLpNN<}4t*RCjYn8Xdbpp+5MmTB`p^@|-Yt1uf3vCJ@o0HF zk0$LlZy896RfcSnQ3z%98NzsfID^l$gB>3U$s}dQ5^O=Fg364D| zDKnIRRAvwd{(F=e=@@mnP4cJbnW`iA;|B#^XPLX(t*?sQ?!qB!=n!o-eW~%CuyQ}e zjQo7JZ)s_UP{5&K{T-ElpEb7GU#*o!BNY`s?WxVD5XwBr%a_;4-#(aeEg(}eX}@aO z{^rU8qZ+*iEh@ajqDQlxGR-emWZ%E6t8dM0Q=d9i< znZ(0K*%Ve^ZRs)0%BTA&sSKI6&}XE6HqLet*&eHV+BLd1Mk=6Mw&|4y^Sar_;ps=2 z%===*`>zn_r93d6&n|69eKN;r*(Zxlsu}Ojs1eNPF~FQy71*`Rg&|pf-3Lq?1E=X~%eJQ~p(ngj+K0=9^fYWQg$5L9{PGDLUXW} z(frQxR)8*~^41hB+p*v5kpgF4*(Q4DI#nsCm}~e(!j>&!L^k9kFq@&krpMWh*=34o05?%cw6F`MKD{9hRA|%q`@C?vYZtp z_h<gF!(9%sv>@ z3I~7+MOoNy1zoZ*9~>C_ggQ=lC%)r!M-$K{a($E0B15s)FErx@EK^#$f{w<6n3m=x- zn{@{>uWvN@fWPI-#CJXz*;wUNlW8dWiZ!|2O6kB37ZGtx_Eo(LhNmid`Wka>p?@p&ak#h9KK@;v@3-E=Z0$hr2;6H~lSsWTr$axb zi&6T1@4;I}HY4z(-WjaoLT0Y!-tMTaLLO?_OGj6JbViE*oHHVmW`hR_D8YjS(8gtF zWY+;>-y2st^_Kf~bcZ1qf!rApo1*`0cJQmkt!4H9chYR4Gg4hCJw?^61pjN#z5mCg z*~)+-G0UK2-?(DvtEDbbnk`3O==vtk{%LM-@g|>xyF{g|vj?4j&%gsSbJjdQdhKw9 zT9gMjl5jSGagPEq0kmbE)}ws`sm*lV#ZHfu zj~C4ng-ClAKe`VLi3GZvWStdpNbh~(@mXEQp8we%d#6^W?d&w?ZCa?!HD(=7*B?N$ zu`lNa{}LIt;$JAkCZ2-;>xUT(NL$f~zVWRd^Xj+min|ZL*W$TgT2gk9!+=$dBQ@Ku zt~Π4ALL`ynk!c2P9hD6GM?+7-BHi2kV6n#uD&IG&$IhK*R=zBIS|3 zN)QN?rTtvIG-QR7f-0a1fxzj3C^!s=f(5`hELum4({;ApImj`+UMnFr4Pc{ZS`%jy z_mK?>U9kcJMAoBN0493)COUcqY?D2T58$D^VMeTU1eatFE=dk)iuY1Ltpl_uCs+{5 z1`A8HnO~yK!V(R>TcRG#5;rQLv;d9yPoreKWRWOMO%3Gt*9R>zCJ+}b+llc;l1UgO z0gnqsi2y?LpXFWr2-1N_CIus{Fu~gi!~j5;k4;kpP(^6~)Grr4HYE)}13)P$t7@uh zy8JC{j66=ebI=tKcw`c|dkL_}NJw#4bsevKW%S+ax7lk$P}dLj2p!z-2&?TStRmQ{ z;mMB7o9+x4>=ot2B!;J45q%t>v_UXNUpTQt5fVsG2C%R?%U^x{XEbn8fI>jPepVQ?q} zO1nJJvEbmkPFpv!wffe{-RLd4DNlY8&T~wgI2JzUCeO6@en6n-uAy_y2gF(3%(_a; zx4dhuV1D?7=O9}@ytXwY@lwBaV-|v33B5Ml?ix@~neeD2zn?g6b>gFSE&ZL*Ht*oD zhQoT<7?RWEfy{OO<>~EBduuz50*#*G#WsAYWkz!Iup zx*(#~0a4Hb7>B&zoEcxz$<(nIU*GRDs$-!w9tNVy<2OO24yew%w!%E9l#ss%Dyqw? zfgY~;6PN$DFW^`HSmCnoB%8l@^qzoD&An5i2xWQ;$-MDRTt}Nv?WvlLu1Dt1D)O-H zI^h`*9x69W&#raugCL>&_E$w2JCEqy=1n^xz%pbumq4;B>;M!Tu z`rrrdJp$f&PG<7zPn0*ZmyCZbeklBWAHAEW^mQYfC!Sh4 zN)pifYzco8-#xS=sbG!uhofwK+pqUf{ZW=kLL*5SFESAWz7Rq0{8?~c?tvPh2daP` zcml=&JL?l}W%R{;Ghto2fP4S7f8c>gK$zla%m_X^dp)EfIv9<#r>p_YAq(+c0g#(_ zMM>%j40xWpxSxb|st2l|P{212L;(N_P+ttXKX~B3egTnLv^G;CVgeWuV`1Ttv|Bst z&qeFF6emP)E|G+Wu%11aET?{JOm&C11AHh(*S7s?3gffHD8}2oaq62!%0*#kL;NB$ zSLB(un@jqLIpX3OQa(mH2gWd9f)Lw6bh5Tv4B8|(rkhj=oswOJP%z_k&KBmmXX+qF z(!xfSAJxnb4DvM@>X*OYCLH#M-WLwR^oKt^|Elbn){|G;j57r|EAO=CUWDsP!E~6i zpK@L3cKM)Qa2XA+aOK5nw-_?A#@n+795rp#QGJA~swp0DtI<+C=vi^v-105*<4unU z@37=Y5Vr@j+plZ#Iullo-nkSVVQH!F7;>@QgKk=5dhE6b+2dx|+)(nKU2`^nNHTsm z64H_kwWV+fX8=hC9CSz=j1y9&=-Cl}{KQUUrb^c!Tw*Eh&io~o@w)*LT;u;)mhnGi zb{q>F zGme|Bifeaxd%mgkuJLM@b{^m>8}7aQ%D`I@+n3>Lfn^XCW+J*Lw|#0l_MzF`Hc>ad z(r-Fzb#%|OoGV|)PYnBvDl$!7e=u6G_V5P@&p1m%h3JAN`P@6_c3=s_KHNFRH(qJ# z!!=C+-`VXQrmDrAJt^IFm-&xuB>6jtsd&p*@Mbx?UbJ=Ay1>Fc#WmoYJ9Spc+r8YF zD7~L6tl9A5xj$qX%Kr+M5mfzLh@)3lr9$I+7`&tUDlMx13d>ObZ?lZwUcj&XvE9x2 z*jvFwDECE<0Xp4>gPTkJjdW9DSXsK2dwV%MU&EY4BtNbxGF(yo3NErE;@H8eOh~c# z?)xRNd0s}XMCpzxix%>>+nN*B`ftbs%m-SMk%V;i=@M~|AX&Bi_P7`2naCUV1+g#I z*X_>yB4MQbD1>L6J#U-01x6v#&*;=Le_UW0H5OcJJLRMx*4&8x!cTL|oH6^~$*lHG zQ`}Y2JUj5_<>6YP6r5az4=m;}oh&pTjb@w|p3fBhRJ_{zy!(=Xd?_YZG9K79Pz?#smNb~UYl<5opq zz1h5}{wTV{dV?`wrR0T15(xzGb*V!eLMtNHLlxw`#tB z%2Yes;uf=Ns}HUF(NRjr(!HW>6NW=sY zNZ4QkF;vk3T$+K6J*B=R5Q7wu`k_cWjE@4+0*l@X{&p}_Kp6vu^A}oAsSX$a6WTJ7 zVjmXoODz=@kX8gFSU;1AXuKDOgp@Imb+iYIP4$HmQ3+64;>& z6y9SF0Zd?eke2*0E-7hYjr|STcwN|y;|*=s)WQp{Kbav}b(I^R3*^;(m-G5nP>Kw9 zY5OeHS;g{Uva~_-XKihwl_$Yga5-%THyN%636$`axVh1Uwpv2mLh!jl+7QgE62}Q+phIOWq3i2kD0o z=&_v(-paPm`gQSbe%C3oe~#?ah)=XP>8}J!)Sn5KlrDtQHy5M6U2?IGpEp|&AG&N8rfH4J6aKwfsEG@Qk3@D#n+7SD18)CDtAy(jq zI4*7o@T<^V<6@Xd$6K@MGkj;F{2^~Ju#TQ({-Q=u1}GGe2iDRvuB8VXY78(augE{xB7mK8Ap{*GKo5m}g+U=hUBUGrjoYWzNOHy5Y0=*FFXGdua`zd-4z0uiTz0LYFK$JJVwo zdf(JqzTQ*&_(^THG5z(b9j77Ezr-Kl&QQ+izZi>4X#;WY=luB3dp>lW>D zjJc9iGwMPLeIf6qi@kjp4>_GB?%$`hLuO2P&*+CC7TJvFOjUy_5^vdLv{swujR%WA z!K?6VxR}{b3W#(cgh!=y=!i&_X24Wmm0liox~VNVyz>-B_3%C30<0mI@xhfg?~yUx zNUxcBpsokBfmIX;aMB?F&L}1v!3&M^Banjk(nWy2Ms5EJt)%0nC~+P zmHyf}fdToJzBh(MNLw&tT_QLhhT{2!RX2H2H zrmJC-=z&vGTG#mj8|MS8Mg}fBQ&$ZqC+|9Nl(iROns1R5vRk-J>bg_Gisq!Dq3h#0 zk76@Q59YL3Tg0yJxwhvN z8As$yCOVxAJB_6?IGQ`dM5H42$DzXS)+9fv_i2U-yL-PdbQTF;<_PuubSgomg?0=6 zQn~-Tg~9*ja{qtG#$V;|4)<=(EpFJZGk2=|Eiy!$(}85(Sfp{_#tnC4kugsLFHGl; zvrh7{YtNjTk$h0!8RPYKmse-r#D8 z)qw`7hf|C;yN5S_x}HxrHhNUu0U*>sH!3OLe6%^s8;hRK5?Y;L?dH3zyjm#tZ7pxs zx!p(?$mTf@)!di65>Fs-I0@C z_fnRriqku|;}YrkYLnBoXz1%_e1)uox{TT@UyK=&)?`j%(K096bkRfc00?SgM6hlKOB)Okk2F9BVNhHE2jwsWf{F4L z=|IVtLVzIU7&C&~VSYUZ1U!k1qt-)SUMLwrigKC-A@Y3_m(tnAQtBf^kbaZEfg(y2 z5TX1f9KpYEA)5um7Ms9&)Qc@n4w<050t=?g&-bu(=Wht5!dsY4fb+K{BCJH2#eEyc z{oM@y6^w4Hsrm1F(BOKkFH&!7ipFbGx=r`HCRPg`=G{2KZ=$MYH?`KEK1Ew`)N!yh zF6kKG$72^UWSHf|4W>L%+n%g0->z!5G%Z760)n$ov?p_{W>eLlm2X?1~hf{c@H1po(Me(*!e zfJDkfj<>;S_9bsHYjLrM!-lsH+IM)myW`cp#I~!2pXX~*sd~>CJJ$}?_-a}AmRH~4 zMU9K`r}`F7kx8>M8RPcGCjH&DvuB*~_b%JUa}MUm3Is%1}9mzkpVY1N_lexdS zO-J(bp^Ta|rELsv;@rn=qzl;!#b;`66f$t@Q?d2q!0vZv;S12C8QAH8uv-sutwOLv zeX}~k@y)>VT8A%UB^QXrn`o{7kCli2j)~oG*QdYo(jkGXfhQf&@);)EKKMSaN*cR- zEN%~T>dILS$x`F^s3B5OZkEIrHjxetp0%vYF@}F{CVdvi3DUqtC(QtS{Rf_VMMWEm zx#*KnB@tyR4^mWoR=4fbHpfv@un-My=h;t@+6V`MqH$E-RIV0o7|1 zQN^!M`u06s7VH-)ABzo@`&#@4UK=Q{+%i&lgCWLpr}Eb{!6~(~J%`2A{5WyD^gG^V zD>N}|;4Wjg{(2xSWae3|*+|OG+&#=6n`I}X#I{tH_eYAK43p$B210qKM^~61iV$j8 z-8Oi6ibHoDqR~Ud{-w$DxQk&YRLjC7t1Is$pV^?115tsbzw6$1==)$lUkBrmThSy? zn&Gt=?0dfjdr2_Zi-KO4xDf0iv~ETX_Ba0NV806BpAYt&%Yyx1iu8+C=~JyT_=8Bl z@E7t_yO&3L)XyXR-^$uw0jRe2pnc#q8|x^ZVUt6ug)Vgj{aN;nueXzl{Yj=-M>gl~ zxO;tr?FB4LY6zbg!%_bx+k@s$k|xv-pJ27@Q#l~SmvHons>WusYg3FtBkK&qY{Jo* z2L{FO#B&-;zh_}sS<~Mgfn<)aa%53hy{B(-@R;lb_Z4QtPlB%e-B-mAivFoEFaInf zpltolga^)fhoB;B`?<{R8_q@)pMtoh>TZ@a(J}56; z#P=j7R{xQER?Fq{fi=OU&o|sSb-C=xmbx9$l80_TjARdG2(+HkjNt z%Z=Vp5BCZyx6o{-ffXtHm3gl3Ni?+)zkf}d~t-qbczrt6$PwzB?VQ1BT zg*PWA5JtEa1COP7ZPoNRaX9VqFC4qMjtyn$XMXWSHTqm8X_=g}>QYia6n}}WqW9ff z!`^%GT>T-IZ&%F`#D#ZG_M{tGF>p-q>USBC1I->kD{e=96@dip^6BJ|WUQWj4H+?p z`$%*0XcxP_P48FJKi?NWFL65gn=}fmmhe$!jWSU&Q2Vaf`AR}&vzpIJ!F4Cf$u7g6 zRqsp}y=5T8`X)bKTlI{uOe+^0ghDb0-f{EbYuaL6()Y}KtqT@f|LzMQ*{!bPJ6o_V z6hO-ouRW2o_~iIptB5e9Ryrj4ENRpz>Lx#ptku%Cq-mgU^Q1K=B zBffly7)&4h5Ss^>;Ew<^UNj6u*jhlA7GbNG5VmOj zpMu!m(B@x(>@N1f-Lga8uG>a7_ORMkj1p7JV%&Gjv!#S_4a7>4WrDTz<-DYi9}Y90 z2p8BZ6gPUZzv|Wz?^O-lc*Bxi!znK<*|&-4Y7|0F?%nZW=1`pb+0kq6A!EJVC%52t z?qV%4-xNVFARBQkQ|g|7jfMoHe|l?q-^ujU&!G>8T$)x_{i!6@`YJ8lYWn?=0^hA` z^50l;dUg?#Je|-bQZ;s}Zj7D4ry{c>i6UF|#rN~EPgQ$o^ObCr9mq*{zm4k37Vsm{RwUy0`@&8=Q`od^?=2$aDQm;h97R z@;=sn+n9jo)7`hW=S5OMCi%lyO9>o9g2PP=?PzN;pT*N?XTYiit_i{|Zys(O29J&C z!&Aq#D}tW$+4-1WqNR<0siF2iq%B!g>3$Q80h%Cn1iSR}DqREAe2ogWGZ+_#Q>bsM zw8cZnMWv)Q-kx%&X=YXidO&0j?X9DV!uEla>b(@1?4vaqIe6u{8oiJvP2r@EAukTF z2X8{7iR-4-%>_jmM*yLqX5Iu(Wn+_wmafe8A?b}L>Pzgp`Kq|-uyJl^>kAmnKCisj zqPz4;&k}VTEmJR;)}?>i-0GrGW`1gdN#b2(jz)7@pV_H&+tWQjh`j&(QpNCxoNHn~ zVLV-oUJAmX@RN~cK;+rw10c$f8yqcB8sVBWqa{8VK%orZMoX(HgDMg@saif_3PJ-a zl&gr)fzv2JHdi`VGEV##b1fx#UnS~T>$~C8A56<=+EoiJxP$|B=SYVi=?h!trcA&- zo%VBO8J9D<5I>e|)v1zLsJb$Gf7eBX;#l$FIkj-V*z7rVXZ!0_tn@KYwY?cwL{$vQ z@#<>Lmz>y&G_*@|(UrS!e8-=DecESGq#p;{Vm6+AAc?Ekq5%(27cnRe&oaGqG593@ ztiS7+V)>0s;lfNR^f(ss+kF4&TT-KGz43u4Lx3pTwUE@7x89om>7@2AYrP2oeDisY zVJdgdN;r911^H-_sPQDGk?W<$JaOakaQC2_l#=PQ& zz8J~5qN$CxeX*C2!H436*~#rAjOh3DfdHOI05)QGZRJ%eyDXwDO>+Dvqu4R%`} zUVmcWWtOe!JIRUt@m5yHbRQOVCRETt|ip3-HeK3PIh zVk~Hq(cp~5i~6L8@_c8FHh=8}krfRh>(xU3k~B|@)zI%4beeANKPQIIrwziC{Plwv z_@@t<{HTZj-B}5>=d2E>pwyRo&L~iutn^LaQ@!{Y2{Ym+kC7~@Ggy{A`l1Y=C=g{q ztXWDzrr+JOCCGyJY(70HqfDuK0q{e*%VIT+=4tDq>A;x`sJ*NPX#>qthM&QD$$J*q#Rslv>2 z_q5x4UCI7lhI*y*WL(qrnv-7~rMDRrd%XvA4$2J8PBLk~yKHHt`O(ePrLtb=&iTYI zLBL`C8(-Gi?sHkEH6vzy;5_V58RIWs>SRC>f$x@k`DVJwL zM(C^Oeuv=tlcY)UJgvtglYK1?P2xInqn-X*%4bHi>9`rx=vijs3HK1MW!E-7Cngz= zcb6cUH`|&hkR*C%gT|tOWsYZkKrb5S}6zn`| zby|F6p~+Tha<#@}cvJ~#q&J+!cf!GL6&1-pYO9nfa=$;Xt@`%-7@aB*MMtR!GZ)}3 zjyo#6wuOylCfM`wBx7SEExi9q^ZYNs8&vYqJZup8|Ka`bgm)D5060e3zZ~HIh&v)F zAd{q{a2y(J(m)oxEaeF(ko!hK<-j*G;Ex0i0|rAy6cq8B9GDU;B8L}40}KX4_5wV- zKRn0?fD$n1s>rL0pzdl;c`e{0+>VbBxJB3 zmP9M9MM@#T16Zo6l|ZD(7m;9`Ct`dsL=31)Mf!oSSiAz#-rCX#xmnN7PS480)W{xb zXlid@p=WAoWC&h?qTBnH5s+X?pa@yNB?X#bv@k5G+@IdK*5p0$rXSm?3&CDB1x{KS?hTR&p%d#SYennQBL2?JH%)RdYH;ruuQAd2zI3ISL>aOC zvs~kMOXUSE@pnQ`N-$DeEMy}q7pcVZr)d9ULQfSyiNaanh_#E3zEn7aLQi?xviY0T z^OsEH(v4LP?viD4&K^twU48e>%sF#bG3$gYUdDLvdGQR%bs-_FZ>j@|-A&8=4n|9s zNOU8qVcvB2Vb3}8Y@Aqz7*xiy;Nd-BKs3nRB;%~8Lu&V9 zk53x1_JYrL+B-F~Z9y!+vl=(=NVq?p(&oQtT3EE7+mKV8J0;Vu@_fv#{#Sen_sC6&c99HsomTXoJ6^-s z<(-ug0`dH;eeS*n@lzm%yTVfAj7<+_fu3g66&<*#SI4UZr^2Oy{ZmUNS966pB v^=i1R{>nRxu}8U#C;0Vb6w@MDt0uX+*6hrUjhA+*Q03<^K9lRs-SGbac3%yo literal 0 HcmV?d00001 diff --git a/src/test/resources/wsdl/document.wsdl b/src/test/resources/wsdl/document.wsdl new file mode 100644 index 00000000..c5a6a8e3 --- /dev/null +++ b/src/test/resources/wsdl/document.wsdl @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/wsdl/human.wsdl b/src/test/resources/wsdl/human.wsdl new file mode 100644 index 00000000..56ecde4b --- /dev/null +++ b/src/test/resources/wsdl/human.wsdl @@ -0,0 +1,48774 @@ + + + The Human Resources Web Service contains operations that expose Workday Human Capital Management Business Services data, including Employee, Contingent Worker and Organization information. This Web Service can be used for integration with enterprise systems including corporate directories, data analysis tools, email or other provisioning sub-systems, or any other systems needing Worker and/or Organization data. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + Contains a unique identifier for an instance of a parent object + + + + + The unique identifier type of a parent object + + + + + + + + + + + + + + + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + Contains a unique identifier for an instance of a parent object + + + + + The unique identifier type of a parent object + + + + + + + + + + + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + Contains a unique identifier for an instance of a parent object + + + + + The unique identifier type of a parent object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + Contains a unique identifier for an instance of a parent object + + + + + The unique identifier type of a parent object + + + + + + + + + + + + + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + Contains a unique identifier for an instance of a parent object + + + + + The unique identifier type of a parent object + + + + + + + + + + + + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + Contains a unique identifier for an instance of a parent object + + + + + The unique identifier type of a parent object + + + + + + + + + + + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + Contains a unique identifier for an instance of a parent object + + + + + The unique identifier type of a parent object + + + + + + + + + + + + + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + Contains a unique identifier for an instance of an object. + + + + + + The unique identifier type. Each "ID" for an instance of an object contains a type and a value. A single instance of an object can have multiple "ID" but only a single "ID" per "type". + + + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + Display information used to describe an instance of an object. This 'optional' information is for outbound descriptive purposes only and is not processed on inbound Workday Web Services requests. + + + + + + + + + + + + + + + + + + + + + + + Country ISO code. If the Country ISO code is specified, then this ISO code will be used to determine the Country Phone Code f or the phone. Pass this ISO code to distinguish between multiple countries sharing the same Country Phone Code. (For example, Country Phone Code '1' is shared by USA, Canada, Dominican Republic, Bermuda, Jamaica and Puerto Rico) + + + + + ISO Code identifying the country where the naming rules for this name are defined. Workday provides the ability for a customer to specify an ISO Code at the country level. Each customer can also define various rules around names, required fields for names, labels for name fields at the Country level. + http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3 + + + A valid instance of Country must exist for the value of Country ISO Code. + No Country with that Country Code Exists. + + + + + + + + + Encapsulating element containing all Job Family data. + + + + + The ID of the Job Family data (Job_Family_ID). + + + + + Effective Date of Job Family. + + + The effective date of the change [date] cannot be earlier than the earliest effective date [early]. + + + + + + + Text attribute identifying Job Family Name. + + + Name is required. + + + Another Job Family or Job Family Group is already using this name. + + + + + + + Text attribute identifying Job Family Summary. + + + + + Boolean attribute indicating if a Job Family/Job Family Group is Inactive or not. Inactive Job Families/Groups will not appear in prompts. + + + + + Element containing the Job Profile reference for a Job Family. + + + + + + + + Reference element representing a unique instance of Job Classification. + + + + + Unique attribute name/description identifying a valid instance of Job Classification Group. + + + A valid instance of Job Classification Group must exist for the given value of Job Classification Group Name. + Job Classification Group does not exist. + + + + + + + Along with Job Classification Group Name (which returns and instance of Job Classification Group), unique attribute name/description identifying a valid instance of Job Classification. + + + A valid instance of Job Classification must exist for the given values of Job Classification Group Name and Job Classification Name. + Job Classification Name does not exist. + + + + + + + + + Encapsulating element containing all Location data. + + + Location Name is required when creating a new Location. + Location Name is required when creating a new Location. + + + Time Profile Reference is required when creating a new Location. + Time Profile Reference is required when creating a new Location. + + + Location Type is required when creating a new Location. + Location Type is required when creating a new Location. + + + Location Data: ID subelements of Integration ID Data cannot reference multiple Locations. + Location Data: ID subelements of Integration ID Data reference multiple Locations. + + + Usage Type must be valid for Location. + Usage Type is Invalid for this Contactable. + + + + + + + The unique location ID. The organization, position and hire tabs will reference location ID. + + + + + The unique location name. + + + + + The time profile associated with the location. This ties to the time profile description that has been set up. + + + + + The location type associated with the location that ties to the usage that has been setup. + + + + + The default currency for the location. This value is either derived from the currency of the location country (using the primary address), or the default currency overridden by the location. + + + + + The division or subsidiary name of the establishment. + + + + + + + + + + A unique alpha/numeric identifier that identifies the business at this physical location. + + + + + + + + + + Contact Data + + + + + Container Organization Reference Data + + + + + Boolean attribute indicates if the Location is inactive. + + + + + + + Reference element representing a unique instance of Location Type. + + + + + Unique attribute name/description identifying a valid instance of Location Type. + + + A valid instance of Location Type must exist for the given value of Location Type Description. + Location Type does not exist. + + + + + + + + + Utilize the following criteria options to search for Locations within the Workday system. The Location references that are returned are those that satisfy ALL criteria included in the request. Therefore, the result set will become more limited with every criteria that is populated. + + + + + If specified, this search criterium will return those references with an exact match. The search index used to query on this value is not case-sensitive. + + + + + + + + Encapsulating element containing all Organization data. + + + Assign Superior Org Vaidation Help Text + Assigning this superior organization would create a circular reference. + + + VLD DOC: Check Avail. Date. + Availability Date is required when creating a new Organization. + + + Organization Subtype is required when creating a new Organization. + Organization Subtype is required when creating a new Organization. + + + Assigning this Container Organization would create a circular reference. + Assigning this Container Organization would create a circular reference. + + + Multiple Organizations are referenced by the same ID. + Multiple Organizations are referenced by the same ID. + + + Organization Subtype needs to be valid for Organization Type. + Organization Subtype is not valid for Organization Type + + + Organization Type is required for a top level organization. + Organization Type is required for a top level organization. + + + Organization Visibility is required for a top level organization. + Organization Visibility is required for a top level organization. + + + The organization type for an existing organization cannot be changed. + The organization type for an existing organization cannot be changed. + + + Superior/subordinate organization hierarchies are allowed for only certain organization types. + Superior/subordinate organization hierarchies are not allowed for this organization type. + + + Include Manager/Leader in Name is only valid for organizations of certain organization types. + Include Manager/Leader in Name is not valid for an organization of this organization type. + + + Position management or job management must be enabled for supervisory organizations. + Position management or job management must be enabled for supervisory organizations. + + + Activating a hiring freeze is allowed only for supervisory organizations. + Activating a hiring freeze is allowed only for supervisory organizations. + + + Primary Location is required for top level supervisory organizations. + Primary Location is required for top level supervisory organizations. + + + Primary Location is allowed only for supervisory organizations. + Primary Location is allowed only for supervisory organizations. + + + If specified, the organization type for a subordinate organization must match its top level organization. + If specified, the organization type for a subordinate organization must match its top level organization. + + + If specified, the organization visibility for a subordinate organization must match its top level organization. + If specified, the organization visibility for a subordinate organization must match its top level organization. + + + Position management or job management can only be enabled for supervisory organizations. + Position management or job management can only be enabled for supervisory organizations. + + + The organization type does not match the organization type allowed for roll-up by the container organization. + The organization type does not match the organization type allowed for roll-up by the container organization. + + + Organization Code is required If 'Include Organization Code in Name' is selected. + Organization Code is required If 'Include Organization Code in Name' is selected. + + + Enter an Organization Name or use the Organization Code as the name by entering an Organization Code and selecting the 'Include Organization Code in Name' checkbox. + Enter an Organization Name or use the Organization Code as the name by entering an Organization Code and selecting the 'Include Organization Code in Name' checkbox. + + + Enter an Organization Name or select the 'Include Manager/Leader in Name' checkbox or use the Organization Code as the name by entering an Organization Code and selecting the 'Include Organization Code in Name' checkbox. + Enter an Organization Name or select the 'Include Manager/Leader in Name' checkbox or use the Organization Code as the name by entering an Organization Code and selecting the 'Include Organization Code in Name' checkbox. + + + Organization Subtype needs to be valid for the Hierarchy Structure on top level organization. + Organization Subtype does not match the Hierarchy Structure defined on top level organization. + + + 'Include Organization ID in Name' can only be set to true for supervisory organizations. + 'Include Organization ID in Name' can only be set to true for supervisory organizations. + + + A superior that is inactive now or will be inactive in future cannot be assigned to an active subordinate organization. + A superior that is inactive now or will be inactive in future cannot be assigned to an active subordinate organization. + + + An organization that is inactive now or will be inactive in future cannot include an active organization. + An organization that is inactive now or will be inactive in future cannot include an active organization. + + + The Staffing Model cannot be changed for this organization. + + + + + + + Organization Reference ID. To ensure backward compatibility, the Organization Reference ID element will not be populated on outbound data (i.e. Get Organization web service) for Workday 9 and earlier versions. It will be populated with on outbound data starting with Workday 10. + + + + + Boolean attribute identifying whether to include the Organization ID within the name (Display ID within Workday). A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + Integration ID Data + + + + + Text attribute identifying Organization Name. A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + Date the Organization is available for staffing events. + + + + + Boolean attribute identifying whether to include the Organization Code within the name (Display ID within Workday). A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + Text attribute identifying Organization Code. A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + Boolean attribute identifying whether to include the Manager/Leader Name within the name (Display ID in Workday). A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + Element containing boolean attribute identifying whether a Hiring Freeze is currently in affect. + + + + + Boolean element identifying whether Job Management is enabled. + + + + + Element containing boolean attribute identifying whether Headcount Management is enabled. + + + + + Element containing boolean attribute identifying whether Position Management is enabled. + + + + + Superior Organization Reference + + + + + Organization Type Reference + + + + + Organization Subtype Reference + + + + + Organization Visibility Reference + + + + + Primary Location Reference + + + + + Container Organization Reference + + + + + + Effective Date. A new effective-dated organization name is automatically created if any attributes used for organization name are different as of specified effective date which include: Organization Name, Organization Code, and Include 'xx' in Name booleans. + + + + + + Reference element representing a unique instance of Organization Type. + + + + + Unique attribute name/description identifying a valid instance of Organization Type. + + + Organization Type Name does not exist. + + + + + + + + + Reference element representing a unique instance of Authority. + + + A valid instance of Authority must exist for the given value of Authority Name and the derived Location Context. For Employees and Contingent Workers, the location context comes from their position's location. For Applicants, it comes from the first position in the position reference. + Authority does not exist in the person Location Context. The Location Context is derived from the person's location country. + + + + + + + Along with Organization (defines Regulatory Region), unique attribute name/description identifying a valid instance of Authority. + + + + + + + + Encapsulating element for all Internet Email Addresses. + + + Usage Type and Use For combination must be valid for Email Address. + Invalid Usage Type and Use For combination for Email Address. + + + You cannot specify the same usage type more than once for an address. + + + + + + + Text attribute identifying Email Address. + + + Email addresses must be in the format of 'xxx@yy.com'. Valid examples: john.doe@aol.com, jane@aol.com. + Invalid email address entered. Email addresses must be in the format of 'xxx@yy.com'. Valid examples: john.doe@example.com, jane@example.com. + Note that only one email address is allowed. + + + + + + + Comment + + + + + + + + Encapsulating element for all Phone Number data. + + + Usage Type and Use For combination must be valid for Phone Number. + Invalid Usage Type and Use For combination for Phone. + + + [country code] is not a valid country code for [country iso code] + + + [country iso code] is not a valid country code + + + You cannot specify the same usage type more than once for an address. + + + + + + + Country ISO code. If the Country ISO code is specified, then this ISO code will be used to determine the Country Phone Code f or the phone. Pass this ISO code to distinguish between multiple countries sharing the same Country Phone Code. (For example, Country Phone Code '1' is shared by USA, Canada, Dominican Republic, Bermuda, Jamaica and Puerto Rico) + + + + + + + + + + International Phone Code Number + + + + + Area Code Number + + + Enter an area code in the valid format: [AreaCodeValidationMessage] + + + + + + + Phone Number + + + Enter a phone number in the valid format: [PhoneValidationMessage]. + + + + + + + Phone Extension + + + + + + + + + All of the personal data. This includes name, contact information (Email, Phone, Address, Web, Instant Messenger), Visa and ID information, Biographic, Demographic, and Background Check Information. + + + At least 1 and only 1 Name must be set as Preferred. + At least 1 and only 1 Name must be set as Preferred. + + + At least 1 and only 1 Name must be set as Legal. + At least 1 and only 1 Name must be set as Legal. + + + Usage Type is Invalid for this Contactable. + Usage Type is Invalid for this Contactable. + + + + + + + Encapsulating element for all of the Name data for a person. + + + + + + + + + + + + + + + + Reference element representing a unique instance of Organization. + + + A valid instance of Organization must exist for the given Integration ID Reference. + Organization Reference Integration ID does not exist! + + + A valid instance of Organization also infers that the Organization is in an Active status. + Organization Reference references an Inactive Organization. + + + + + + + + + + Reference element representing a unique instance of Position Time Type. + + + + + Unique attribute name/description identifying a valid instance of Position Time Type. + + + A valid instance of Position Time Type must exist for the given value of Time Type Description. + Time Type does not exist. + + + + + + + + + Reference element representing a unique instance of Location. + + + A valid instance of Location must exist for the given Integration ID Reference. + Location Reference does not exist. + + + + + + + Integration ID reference is used as a unique identifier for integratable objects in the Workday system. + + + + + + + Reference element representing a unique instance of Location. + + + + + + + + Reference element representing a unique instance of Organization. + + + + + + + + Encapsulating element for all Instant Messenger data. + + + Usage Type and Use For combination must be valid for Instant Messenger Address. + Invalid Usage Type and Use For combination for Instant Messenger Address. + + + You cannot specify the same usage type more than once for an address. + + + + + + + Instant Messenger Address. + + + + + Comment + + + + + + + + + Reference element representing a unique instance of Instant Messenger Type. + + + + + Unique attribute name/description identifying a valid instance of Instant Messenger Type. + + + A valid instance of Instant Messenger Type must exist for the given value of Instant Messenger Provider. + Instant Messenger Type does not exist. + + + + + + + + + Encapsulating element for all Web Address data. + + + Usage Type and Use For combination must be valid for Web Address. + Invalid Usage Type and Use For combination for Web Address. + + + Invalid HTTP address entered. HTTP addresses must be in one of the following formats: + - http://... + - https://... + + + You cannot specify the same usage type more than once for an address. + + + + + + + Web Address (e.g. URL). + + + + + Comment + + + + + + + + Encapsulating element for all Biographical data (e.g. DOB, Gender, etc.) associated with a person. + + + + + + Text attribute identifying Place of Birth. + + + + + Date of Birth. + + + + + + + Boolean attribute identifying Tobacco usage. + + + + + + + Reference element representing a unique instance of Country of Birth. + + + + + + + + Encapsulating element for all Demographic data (e.g. Marital Status, Ethnicity, etc.) associated with a person. + + + You may only specify one ethnicity for this worker or pre-hire. This is defined by your system administrator and based on the country of the worker or pre-hire. + + + + + + + + A flag indicating Hispanic or Latino for EEO purposes. + + + + + + + Reference for the person's Country of Nationality + + ISO_3166-1_Alpha-2_Code + + + + + + The hukou region for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The hukou subregion for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The hukou locality for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The hukou postal code for the person. + + Security Note: This element is secured according to the security + + + + + The hukou type for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The native region for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + Personnel File Agency is used in China to indicate where workers have their personnel file stored. + + + + + + + + Reference element representing a unique instance of Employee Type. + + + + + Text attribute representing Description of an Employee Type. + + + A valid instance of Employee Type must exist for the given Employee Type Description. + Employee Type Name does not exist. + + + + + + + + + Encapsulating element containing all External Contact data. + + + External Contact Data: ID subelements of Integration ID Data cannot reference multiple External Contacts. + External Contact Data: ID subelements of Integration ID Data reference multiple External Contacts. + + + + + + + + Text attribute identifying name of External Contact Type. + + + A valid instance of External Contact Type must exist for the given value of External Contact Type Name. + External Contact Type Name does not exist! + + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Contingent Worker and his/her Contract Information. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Reference element representing a unique instance of Vendor. + + + + + Unique attribute name/description identifying a valid instance of Vendor (Business Entity). + + + A valid instance of Vendor (Business Entity) must exist for the given value of Vendor Name. + Vendor Name does not exist! + + + + + + + + + Encapsulating element for all Visa Identifier data. + + + + + Text attribute identifying Visa ID. + + + + + + + Date the Visa ID was issued. + + + + + Date the Visa ID expires. + + + + + Date the Visa ID was verified. + + + + + + + Encapsulating element for all Custom Identifier data. + + + + + Text attribute identifying Custom ID. + + + + + + Date the Custom ID was issued. + + + + + Date the Custom ID expires. + + + + + + Custom Description of the Custom ID. + + + + + + + Encapsulating element for all Government Identifier data. + + + Social Security Number is not valid. It must not contain any other character other than digits and hyphen. + Social Security Number is not valid. It must not contain any other character other than digits and hyphen. + + + + + + + Text attribute identifying Government ID. + + + If the Identifier ID is for a National ID Type, then formatting characters must not be included. + The Identifier ID does not match the format required for the National ID Type. The Identifier ID should not contain any formatting characters. + + + + + + + + + Date the Government ID was issued. + + + + + Date the Government ID expires. + + + + + Date the Government ID was verified. + + + + + + + Encapsulating element for all License Identifier data. + + + + + Text attribute identifying License ID. + + + + + + Text attribute identifying License Class. + + + + + Date the License ID was issued. + + + + + Date the License ID expires. + + + + + Date the License ID was verified. + + + + + + + + + + + + Encapsulating element for all Passport Identifier data. + + + The country submitted must match the country associated with the passport type. + The passport type "[passport type]" is not associated with the country "[country]." + + + + + + + Text attribute identifying Passport ID. + + + + + + Reference element representing the country. + + + + + Date the Passport ID was issued. + + + + + Date the Passport ID expires. + + + + + Date the Passport ID was verified. + + + + + + + Reference element representing a unique instance of Organization Visibility. + + + + + Unique attribute name/description identifying a valid instance of Organization Visibility. + + + A valid instance of Organization Visibility must exist for the given value of Organization Visibility Name. + Organization Visibility Name does not exist. + + + + + + + + + Reference element representing a unique instance of Organization Subtype. + + + + + Unique attribute name/description identifying a valid instance of Organization Subtype. + + + A valid instance of Organization Subtype must exist for the given value of Organization Subtype Name. + Organization Subtype Name does not exist + + + + + + + + + Reference element representing a unique instance of Employee. + + + A valid instance of Employee must exist for the given Integration ID Reference. + Employee Reference Integration ID does not exist! + + + + + + + + + + Reference element representing a unique instance of Compensation Element. + + + + + Unique attribute name/description identifying a valid instance of Compensation Element. + + + A valid instance of Compensation Element must exist for the given value of Compensation Element Name. + Compensation Element Name does not exist. + + + + + + + + + The data necessary to create or update a user's account in the Workday system. + + + Validates that the user name provided is not already in use by another system user. + User Name already taken, please choose another one. + + + Validates that a password is provided (or will be generated) for a new Workday account. + Password is required when creating a new Workday Account. + + + Validates that an email address is available if the random password option is specified. + Unable to Generate Random Password due to missing email address for notification. + + + Validates that the code provided matches one of the locale codes in the Workday system. + Invalid Locale Code. + + + One-Time Passcode Exempt cannot be modified if the user is not required to use One-Time Passcode Authentication. + + + One-Time Passcode Grace Period Remaining Login Count cannot be modified if the user is not required to use One-Time Passcode Authentication. + + + One-Time Passcode Grace Period Enabled cannot be modified if the user is not required to use One-Time Passcode Authentication. + + + One-Time Passcode Grace Period Remaining Login Count cannot be less than 0 or greater than the tenant Maximum Grace Period Login Count: [max count] + + + + + + + The user name the new user will use to sign on to Workday. + + + The entered User Name is longer than the current tenant maximum. The tenant max is set to [max]. + + + + + + + The number of minutes the user may be idle before the system requires them to re-enter their user name and password. + + + Validates that the timeout setting is between 5 and 720 minutes. + Session Timeout Minutes must be greater than 5 and less than or equal to [max]. The default value is [default]. + + + Session Timeout Minutes must be greater than 5 and less than or equal to [max]. The default value is [default]. + + + + + + + + + + + + + + The user is prevented from signing on to the system. + + + + + The user will be prevented from signing on to the system after this date (Pacific Time). + + + + + The user is prevented from signing on to the system until their account is unlocked. + + + + + The user will be required to change their password upon initial sign on. + + + + + The web browser title will include the user name in parenthesis. + + + + + The user will be presented with an icon to view reports as an RSS feed. + + + + + The user will have the Workbox tab available in the right-side slide-out. + + + + + The local defines the user's language and country which will affect their experience in the Workday system. + + + + + If set, specifies language for user. If not set, language specification taken from Locale_Reference parameter. + + + + + If set, specifies the initial search category displayed to the user. + + + + + The user will be authenticated via an external system. + + + + + The user is allowed to view mixed language transactions. + + + + + Notification Type Configurations for a particular user + + + + + + The initial password the user will sign on with. + + + Validates that the password conforms to the configured password rules. + The password does not meet password requirements. + + + + + + + The system should generate a random password for the user. + + + + + + True when the user is exempt from Delegated Authentication, False otherwise. Set this element to true if you want the user to be exempt from delegated authentication. + + + + + True when the user is exempt from One-Time Passcode Authentication, False otherwise. Set this element to true if you want the user to be exempt from one-time passcode authentication. + + + + + True when the user's One-Time Passcode grace period is enabled, False otherwise. Set this element to false if you want the user's one-time passcode grace period to be disabled. + + + + + The remaining number of times the user can login without providing a one-time passcode. This cannot be higher than the configured tenant maximum grace period login count. + + + + + + + + + + + This field is used for OpenID based authentication and contains the email address associated with the OpenID account. This value needs to be provided to enable OpenID authentication for this user. + + + + + This field is used for OpenID based authentication and contains the OpenID GUID. It will be unpopulated until the user completes an initial successful OpenID authentication attempt. + + + + + This field is used for OpenID Connect based authentication and contains the OpenID Connect subject. It will be unpopulated until the user completes an initial successful OpenID Connect authentication attempt. + + + + + + + Encapsulating element containing all Emergency Contact data. + + + Emergency Contact Data: ID subelements of Integration ID Data cannot reference multiple Emergency Contacts. + Emergency Contact Data: ID subelements of Integration ID Data reference multiple Emergency Contacts. + + + + + + + + + + + + Encapsulating element containing all Dependent data. + + + Dependent Data: ID subelements of Integration ID Data cannot reference multiple Dependents. + Dependent Data: ID subelements of Integration ID Data reference multiple Dependents. + + + Student Status Start Date must occur before Student Status End Date. + + + + + + + + Text attribute identifying name of Dependent's Educational Institution. + + + + + Boolean attribute identifying whether Dependent is a Full-time Student. + + + + + The date the dependent became a full-time student. + + + + + The date the dependent's student status ended (no longer a full-time student) + + + + + Date of Death of dependent. + + + + + Boolean attribute identifying whether Dependent is Disabled. + + + + + + + + Encapsulating element containing all Beneficiary data. + + + Beneficiary Data: ID subelements of Integration ID Data cannot reference multiple Beneficiaries. + Beneficiary Data: ID subelements of Integration ID Data reference multiple Beneficiaries. + + + + + + + + Beneficiary Court Orders + + + + + + + Reference element representing a unique instance of Time Profile. + + + + + The time profile associated with the location. This ties to the time profile description that has been set up. + + + A unique Time Profile needs to exist for the given Time Profile Description. + Time Profile does not exist. + + + + + + + + + Reference element representing a unique instance of Compensation Grade. + + + + + Unique attribute name/description identifying a valid instance of Compensation Grade. + + + A valid instance of Compensation Grade must exist for the given value of Compensation Grade Name. + Compensation Grade Name does not exist. + + + + + + + + + Reference element representing a unique instance of Compensation Package. + + + + + Unique attribute name/description identifying a valid instance of Compensation Package. + + + A valid instance of Compensation Package must exist for the given value of Compensation Package Name. + Compensation Package Name does not exist. + + + + + + + + + Encapsulating element containing all Compensation Element Values for Base Pay data. + + + + + + Amount of Compensation Element. + + + The amount entered must be greater than or equal to the minimum wage amount for the salary plan. + + + Amount cannot be negative. + + + + + + + + + + + + + + + The expected end date of the plan assignment. + + + + + The actual end date for the plan assignment. + + + The Actual End Date must be on or after the Expected End Date. + + + Please check the Enable Actual End Date tenant setup - HCM flag before attempting to set the Actual End Date. + + + + + + + + + Reference element representing a unique instance of Frequency. + + + + + Unique attribute name/description identifying a valid instance of Frequency. + + + A valid instance of Frequency must exist for the given value of Frequency Name. + Interval Name does not exist. + + + + + + + + + Reference element representing a unique instance of Position. + + + A valid instance of Position must exist for the given Integration ID Reference. + Position Reference Integration ID does not exist! + + + + + + + + + + Encapsulating element containing all Related Person Descriptor data. + + + Related Person Relationship Name is invalid. + + + + + + + Text attribute identifying name of Relationship. + + + + + + + Reference element representing a unique instance of Pay Rate Type. + + + + + Unique attribute name/description identifying a valid instance of Pay Rate Type. + + + A valid instance of Pay Rate Type must exist for the given value of Pay Type Name. + Pay Type Name does not exist! + + + + + + + + + Reference element representing a unique instance of Contingent Worker. + + + A valid instance of Contingent Worker must exist for the given Integration ID Reference. + Contingent Worker Reference Integration ID does not exist! + + + + + + + + + + Encapsulating element containing all Related Person data. + + + The Integration ID Data sub elements of Beneficiary Data, Emergency Contact Data, External Contact Data, and Dependent Data must not reference the same Person. + The Integration ID Data sub elements of Beneficiary Data, Emergency Contact Data, External Contact Data, and Dependent Data do not reference the same Person. + + + Gender Description and Date of Birth are required for Dependents. + Gender Description and Date of Birth are required for Dependents. + + + + + + + + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Worker and his/her summarized Personal and Employment/Contract information. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Encapsulating element containing all Worker Profile data. + + + + + + Text attribute identifying Employee ID. + + + + + Text attribute identifying Contingent Worker ID. + + + + + + Text attribute identifying Business Title. + + + + + + + + + + + Encapsulating element containing all Education data. + + + + + The country in which the school is located or in which studies took place. + + + + + The School in which studies took place. + + + + + Text attribute identifying name of Education Institution. + + + + + The type of school. + + + + + The degree program in which studies took place. + + + + + Indicates whether the degree was received. Possible values are 'Yes', 'No', and blank. + + + + + Lookup representing a Field of Study. + + + + + Text attribute identifying Education Institution Location. + + + + + Text attribute identifying Grade Average. + + + + + The first year in which studies took place at the school. + + + + + The last year in which studies took place at the school. + + + + + + + A unique identifier used to reference a Degree. + + + + + Unique attribute name/description identifying a valid instance of Degree. + + + A valid instance of Degree must exist for the given value of Degree Name. + Degree Name does not exist. + + + + + + + + + A unique identifier used to reference a Field Of Study. + + + + + Unique attribute name/description identifying a valid instance of Field Of Study. + + + A valid instance of Field Of Study must exist for the given value of Field Of Study Name. + Field of Study Name does not exist. + + + + + + + + + Encapsulating element containing all Qualification data. + + + + + Encapsulating element containing all Education data. + + + + + + + + Encapsulating element containing all Professional Experience data. + + + + + Text attribute identifying description of Professional Experience. + + + A valid instance of Professional Experience must exist for Professional Experience description. + Work Experience Description does not exist. + + + + + + + + Comment + + + + + + + Reference element representing a unique instance of Work Experience Rating. + + + + + Unique attribute name/description identifying a valid instance of Work Experience Rating. + + + A valid instance of Work Experience Rating must exist for the given value of Rating Description. + Work Experience Rating does not exist. + + + + + + + + + Integration ID reference is used as a unique identifier for integratable objects in the Workday system. + + + + + + + Display name inside the Workday system. + + + + + + Contains the Data for adding, updating or deleting a previous system job history entry for a worker. + + + + + Unique Identifier for a worker (Employee or Contingent Worker). + + Employee_ID + + + + + + + + + Detail data for a Previous System Job History entry. + + + + + Unique identifier for a Previous System Job History entry. This can be entered here on an add to set the reference id to a customer determined value or left blank and a default value will be saved. If you are updating an existing entry, entering a value here will change the reference id. + + + + + Name to identify the Previous System Job History. This does not have to be unique. During an update, if no value is sent then the existing value will be kept. Required on an Add. + + + Worker History Name is required. + + + + + + + Date of the Previous System Job entry. During an update, if no value is sent, then the existing date will be kept. Required on an Add. + + + Action Date is required. + + + + + + + Reason for the Previous System Job Entry. During an update, if no value is sent then the existing value will be kept. Required on an Add. + + + The Reason is required. + + + + + + + Free Form Description for the Previous System Job Entry. During an update, if no valie is sent then the existing value will be kept. + + + + + + + Encapsulating element for all of the contact methods for the person. Contact methods in workday represents methods to contact an entity. For example these methods include: Address (via post), Phone, Email, Instant Messenger and/or Web. + + + One and only one work email address must be marked as primary. + One and only one work email address must be marked as primary. + + + One and only one business email address must be marked as primary. + One and only one business email address must be marked as primary. + + + One and only one home email address must be marked as primary. + One and only one home email address must be marked as primary. + + + One and only one work phone must be marked as primary. + One and only one work phone must be marked as primary. + + + One and only one home phone must be marked as primary. + One and only one home phone must be marked as primary. + + + One and only one business phone must be marked as primary. + One and only one business phone must be marked as primary. + + + One and only one work web address must be marked as primary. + One and only one work web address must be marked as primary. + + + One and only one home web address must be marked as primary. + One and only one home web address must be marked as primary. + + + One and only one business web address must be marked as primary. + One and only one business web address must be marked as primary. + + + One and only one work instant messenger address must be marked as primary. + One and only one work instant messenger address must be marked as primary. + + + One and only one home instant messenger address must be marked as primary. + One and only one home instant messenger address must be marked as primary. + + + One and only one business instant messenger address must be marked as primary. + One and only one business instant messenger address must be marked as primary. + + + One and only one work address must be marked as primary. + One and only one work address must be marked as primary. + + + One and only one home address must be marked as primary. + One and only one home address must be marked as primary. + + + One and only one business address must be marked as primary. + One and only one business address must be marked as primary. + + + One and only one lockbox address must be marked as primary. + One and only one lockbox address must be marked as primary. + + + Subject worker must have exactly one primary home web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary home email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary home address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary lockbox address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary lockbox address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary home instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary home phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Only one Primary Address change is allowed per request. However, the one Primary Address can share both home and work usage types. + Only one Primary Address change is allowed per request. However, the one Primary Address can share both home and work usage types. + + + + + + + + + + + + + + Reference element representing a unique instance of Organization that contains other Organizations. + + + This container organization is configured to not allow locations to be included in it. + Container Organization Reference does not allow Locations. + + + + + + + + + + Utilize the following elements to Dissolve an existing Organization Structure within the Workday system. + + + Only a Top Level Organization can be dissolved. + You can only Dissolve an Organization Structure by passing in a Top Level Organization + + + + + + + + + + + + Utilize the following criteria options to search for Organizations within the Workday system. The Organization references that are returned are those that satisfy ALL criteria included in the request. Therefore, the result set will become more limited with every criterium that is populated. + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + If specified, this search criterium will return those references with an exact match. The search index used to query on this value is not case-sensitive. + + + + + If specified, this search criterium will return those references with an exact match. The search index used to query on this value is not case-sensitive. + + + + + If specified, this search criterium will return those references with an exact match. The search index used to query on this value is not case-sensitive. + + + + + If specified, this search criterium will return those references with an exact match. The search index used to query on this value is not case-sensitive. + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Organization and its associated data. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Contains the benefit plan year information. + + + + + A reference to the benefit program. + + + + + The year of the plan year definition. + + + + + The start date of the plan year. + + + + + The end date of the plan year. + + + + + + + Encapsulating element for all of the name data such as first and last name + + + Last Name is required for certain Countries. + Last Name is required for this country. + + + Last Name - Secondary is required for certain Countries. + Last Name - Secondary is required for this country. + + + Last Name - Secondary can only be set for Countries that accept it. + Last Name - Secondary is not set up for this country. + + + Last Name can only be set for Countries that accept it. + Last Name is not set up for this country. + + + Salutation can only be set for Countries that accept it. + Salutation is not setup for this country. + + + Title can only be set for Countries that accept it. + Title is not setup for this country. + + + Salutation is required for certain Countries. + Salutation is required for this country. + + + Title is required for certain Countries. + Title is required for this country. + + + Social Suffix is required for certain Countries. + Social Suffix is required for this country. + + + Social Suffix can only be set for Countries that accept it. + Social Suffix is not setup for this country. + + + Honorary Suffix is required for certain Countries. + Honorary Suffix is required for this country. + + + Honarary Suffix can only be set for Countries that accept it. + Honorary Suffix is not setup for this country. + + + Hereditary Suffix is required for certain Countries. + Hereditary Suffix is required for this country. + + + Hereditary Suffix can only be set for Countries that accept it. + Hereditary Suffix is not setup for this country. + + + Professional Suffix can only be set for Countries that accept it. + Professional Suffix is not setup for this country. + + + Professional Suffix is required for certain Countries. + Professional Suffix is required for this country. + + + Religious Suffix can only be set for Countries that accept it. + Religious Suffix is not setup for this country. + + + Religious Suffix is required for certain Countries. + Religious Suffix is required for this country. + + + Royal Suffix is required for certain Countries. + Royal Suffix is required for this country. + + + Royal Suffix can only be set for Countries that accept it. + Royal Suffix is not setup for this country. + + + Academic Suffix is required for certain Countries. + Academic Suffix is required for this country. + + + Academic Suffix can only be set for Countries that accept it. + Academic Suffix is not setup for this country. + + + + + + + + Defining the type of name. Typical uses include using to capture Preferred or Maiden names. + + + + + + Person first name.This field will only have a value if mapped to a name component for the country (identified by the ISO code above) within the workday application. + + + First Name is required for this country. + + + First Name is not setup for this country. + + + + + + + Person middle name.This field will only have a value if mapped to a name component for the country (identified by the ISO code above) within the workday application. + + + Middle Name is not setup for this country. + + + Middle Name is required for this country. + + + + + + + + + + + Boolean attribute indicating whether this is the Default name. + + + + + Boolean attribute indicating whether this is the Preferred name + + + + + Effective Date of Name. + + + + + Date of last change to Name. + + + + + + Reference element representing a unique instance of Leave of Absence Type. + + + + + Unique attribute name/description identifying a valid instance of Leave of Absence Type. + + + A valid instance of Leave of Absence Type must exist for the given value of Leave Type Name. + Leave of Absence Type does not exist. + + + Leave Type is inactive. + + + Worker is not eligible for this Leave Type on this date. + + + + + + + + + Utilize the following elements to update the Personal Information for an existing Employee within the Workday system. + + + You cannot change the preferred name because there is a pending preferred name change. + + + You cannot change the legal name because there is a pending legal name change. + + + You cannot initiate this request because a contact change event is already in progress for this worker. Either remove the contact data from the request or complete the pending event and try again. + + + + + + + + + + + + Encapsulating element containing all Salary Plan Compensation data. + + + + + Text attribute identifying name of Salary Plan. + + + A valid instance of Compensation Component must exist for the given value of Salary Plan Name. + The Salary Plan Name entered does not exist. + + + + + + + + + + Encapsulating element containing all Hourly Plan Compensation data. + + + + + Text attribute identifying name of Hourly Plan. + + + A valid instance of Compesation Component must exist for given value of Hourly Plan Name. + The Hourly Plan Name entered does not exist. + + + + + + + + + + Encapsulating element containing all Allowance Plan Compensation data. + + + + + Text attribute identifying name of Allowance Plan. + + + A valid instance of Compensation Component must exist for the given value of Allowance Plan Name. + The Allowance Plan Name entered does not exist. + + + + + + + + + + Encapsulating element containing all Compensation Element Values for Allowance Plan data. + + + + + The expected end date of the plan assignment. + + + + + Percent for Compensation Element. + + + Percent cannot be negative. + + + + + + + + + + + + + + Amount for Compensation Element. + + + Amount cannot be negative. + + + + + + + + + + + + + + + Expected End Date + + + + + Reimbursement Start Date + + + Reimbursement Start Date must be entered for reimbursable allowance plans that use an expense accumulator requiring a custom date. For all other allowance plans it must be empty. + + + + + + + The actual end date for the plan assignment. + + + The Actual End Date must be on or after the Expected End Date. + + + Please check the Enable Actual End Date tenant setup - HCM flag before attempting to set the Actual End Date. + + + + + + + + + Encapsulating element containing all Compensation Element Values for Bonus Plan data. + + + + + + Amount for Compensation Element. + + + Amount cannot be negative. + + + + + + + + + + + + + Percent for Compensation Element. + + + Percent cannot be negative. + + + + + + + + + + + + + + Guaranteed Minimum for Compensation Element. + + + + + + + Percentage Assigned for Compensation Element. + + + Percent must be greater than zero. + + + + + + + + + + + + + + The actual end date for the plan assignment. + + + Please check the Enable Actual End Date tenant setup - HCM flag before attempting to set the Actual End Date. + + + + + + + + + Encapsulating element containing all Bonus Plan Compensation data. + + + + + Text attribute identifying name of Bonus Plan. + + + A valid instance of Compensation Component must exist for the given value of Bonus Plan Name. + The Bonus Plan Name entered does not exist. + + + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Location and its associated data. + + + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Reference element representing a unique instance of Compensation Grade Profile. + + + + + Along with Compensation Grade Reference, unique attribute name/description identifying a valid instance of Compensation Grade Profile. + + + A valid instance of Compensation Grade Profile must exist for the given value of Compensation Profile Name and Compensation Grade Reference. + Compensation Grade Profile Name within Compensation Grade does not exist. + + + + + + + + + + Reference element representing a unique instance of Event Type (e.g. Hire Employee Event, Change Address Event, etc.). + + + Business Process Type does not exist for Business Process Type Name! + Business Process Type does not exist for Business Process Type Name! + + + + + + + Testing WS Word Bucket edit + + + + + + + Encapsulating element containing all Personal Information for a Person. + + + + + The Business Title for the worker's primary position. This value cannot be updated in the Update Employee Personal Information or Update Contingent Worker Personal Information. It should be updated using the Edit Position operation. + + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Employee and his/her Employment Information. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Employee and his/her Personal Information. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Utilize the following elements to update the Personal Information for an existing Contingent Worker within the Workday system. + + + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Contingent Worker and his/her Personal Information. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Reference element representing a unique instance of Unit of Measure. + + + + + Unique attribute name/description identifying a valid instance of Unit of Measure. + + + A valid instance of Unit of Measure must exist for the given value of Unit of Measure Name. + Unit of Measure does not exist. + + + + + + + + + Utilize the following elements to Inactivate an existing Organization within the Workday system. + + + An organization cannot be inactivated while it still has events in progress. + Organization has events in progress, so it cannot be inactivated. + + + An organization cannot be inactivated while it has conflicting events. Those events can be events in progress or future events. + Organization has conflicting events (in progress or future events) so it cannot be inactivated. + + + An organization must be inactive in order to be inactivated. + Organization is inactive as of entered effective date so it cannot be inactivated. + + + An organization cannot be inactivated if it has retiree members or positions or restrictions. + Organization still has retiree members or positions or restrictions, so it cannot be inactivated. + + + Value for 'Organization for Subordinates Reference' and 'Organization for Included Organizations Reference' must be the reference id of an active organization that does not have a future inactivation and is for same organization type. + Value for 'Organization for Subordinates Reference' and 'Organization for Included Organizations Reference' must be the reference id of an active organization that does not have a future inactivation and is for same organization type. + + + When 'Keep in Hierarchy' is false and there are active included organizations, you must specify a value for 'Organization for Included Organizations Reference'. + When 'Keep in Hierarchy' is false and there are active included organizations, you must specify a value for 'Organization for Included Organizations Reference'. + + + When 'Keep in Hierarchy' is false and there are active subordinates you must specify a value for 'Organization for Subordinates Reference'. + When 'Keep in Hierarchy' is false and there are active subordinates you must specify a value for 'Organization for Subordinates Reference'. + + + Organization being inactivated has no superior to move active included organizations to so you must specify a value for 'Organization for Included Organizations Reference'. + Organization being inactivated has no superior to move active included organizations to so you must specify a value for 'Organization for Included Organizations Reference'. + + + Organization being inactivated has no superior to move active organizations to so you must specify a value for 'Organization for Subordinates Reference'. + Organization being inactivated has no superior to move active organizations to so you must specify a value for 'Organization for Subordinates Reference'. + + + The superior that active subordinates are to move to cannot be inactive or have a future inactivation. + The superior that active subordinates are to move to cannot be inactive or have a future inactivation. + + + The superior that active included organizations are to move to cannot be inactive or have a future inactivation. + The superior that active included organizations are to move to cannot be inactive or have a future inactivation. + + + 'Organization for Subordinates Reference' cannot be one of the active subordinates. + 'Organization for Subordinates Reference' cannot be one of the active subordinates. + + + + + + + Use this boolean to validate the request without processing it. + + + + + + + Use this boolean to keep the organization in hierarchy. + + + + + Use this element to specify the new superior organization for current subordinates. When blank, default behavior is that active organizations are moved to superior. + + + + + Use this element to specify the new superior organization for current included organizations. When blank, default behavior is that active organizations are moved to superior. + + + + + + + + Reference element representing a unique instance of Emergency Contact Priority. + + + + + Unique attribute name/description identifying a valid instance of Emergency Contact Priority. + + + + + + + Encapsulating element containing all Worker Personal data. + + + At least 1 and only 1 Name must be set as Preferred. + At least 1 and only 1 Name must be set as Preferred. + + + At least 1 and only 1 Name must be set as Legal. + At least 1 and only 1 Name must be set as Legal. + + + Usage Type must be valid for Worker. + Usage Type is Invalid for this Contactable. + + + + + + + + + + + + + A unique identifier used to reference a Job Classification Group. + + + + + The name of a Job Classification Group. + + + + + + + Set of Location Reference elements. + + + + + Reference element representing an object within the Workday system. The sub-elements and attributes within this element are used to return one and only one instance of the identifying object. + + + + + + + Reference element representing a unique instance of Company. + + + A valid instance of Company must exist for the given value of Company Reference. + Company does not exist. + + + + + + + + + + Encapsulating element containing all Organization Structure Dissolve data. + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + + This element contains the effective date that the organization is inactivated. + + + + The effective date of the organization inactivation. + + + + + + Response element containing an instance of Employee and his/her Employment Information. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Integration ID Help Text + + + + + + + + External ID that uniquely identifies the integratable object within the context of the integration system identified by the System ID attribute. + + + + + + Integration system identifier, part of a two part key (including the text value of the ID element) that uniquely identify integratable object. + + + A valid instance of Integration ID must exist for the given System ID. + Integration System ID does not exist. + + + + + + + + + + Encapsulating element containg all Position data. + + + + + + Text attribute identifying Position ID. + + + + + Text attribute identifying Position Title. + + + + + Business title for the position. + + + + + + + Boolean attribute identifying whether Position is Exempt. + + + + + Scheduled Weekly Hours for Position. + + + + + + + + + + + Standard Weekly Hours for Position. + + + + + + + + + + + + Full Time Equivalent Percentage for Position. + + + + + + + + + + + + + + + + + + Contains the reference to the manager of the worker. This will contain only one manager - even if there are actually multiple managers for the worker. + + + + + The work hour profile(s) for the position. + + + + + The work hour profile(s) for the position. + + + + + + Effective Date for Position. + + + + + + Encapsulating element containg all Compensation Data. + + + + + Effective Date of Compensation. + + + + + + + + Encapsulating element containing all Status data for a Worker. + + + + + Boolean attribute identifying whether the Worker is Active. + + + + + Most recent Hire Date for the Worker. + + + + + Earliest Hire Date for the Worker. + + + + + Employment End Date for the Worker. + + + + + Reason for Hire from the most recent Hire event. + + + + + Continuous Service Date for the Worker. + + + + + First Day of Work only applies to the Payroll web service. + + + + + Expected retirement date for the worker. + + + + + Retirement Eligibility Date for the Worker. + + + + + Boolean attribute identifying whether the Worker is currently retired. + + + + + Most recent Retirement Date. + + + + + Seniority date for the worker. Defaults to hire date. + + + + + Severance date for the worker. + + + + + The Benefits Service Date for an employee. + + + + + The Company Service Date for an employee. + + + + + The Time Off Service Date for an employee. + + + + + The Vesting Date for an employee. + + + + + Date the employee first entered the workforce (for any employer). + + + + + Number of days the worker was unemployed between the time they first entered the workforce and the date they were hired by the current employer. + + + + + + + + + + + + Number of months that the employee worked continuously prior to being hired by the current employer. + + + + + + + + + + + + + + + + + Encapsulating element containing all Job Family Group data. + + + + + A unique identifier used to reference a Job Family Group. + + + + + Contains the detailed information about an Job Family Group. + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + Encapsulating element containg a brief summary of Compensation data. + + + + + Total Compensation (as stated for Frequency). + + + + + + + + + + + Total Base Pay (as stated for Frequency). + + + + + + + + + + + + + + + Utilize the following elements to add (or update, if already existing) a new Organization into the Workday system. A new effective-dated organization name is automatically created if any attributes used for organization name are different as of specified effective date. + + + + + + + + + Encapsulating element containg a brief summary of Organization data. + + + + + + Text attribute identifying Organization Code. A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + Text attribute identifying Organization Name. + + + + + + + + + Encapsulating element containing a brief summary of Location data. + + + + + + Text attribute identifying Location Name. + + + + + + + + + Reference element representing a unique instance of Phone Device Type. + + + + + Unique attribute name/description identifying a valid instance of Phone Device Type. + + + A valid instance of Phone Device Type must exist for the given value of Phone Device Type Description. + Phone Device Type does not exist. + + + + + + + + + Reference element representing a unique instance of Marital Status. + + + A valid instance of Marital Status must exist for the given value of Marital Status Description in a specific Location Context. The location context is derived from the person's location. + Marital Status Description does not exist for the location context for the person's location. Additionally, it must not be Inactive. + + + + + + + Unique attribute name/description identifying a valid instance of Marital Status. + + + + + + + Reference element representing a unique instance of Ethnicity. Ethnicity is a singular relationship with Demographic Data as of 8. For certain tenants, especially US Public Sector Higher Education, Ethnicity may be a non-singluar relationship (as of V13). + + + A valid instance of Ethnicity must exist for the given value of Ethnicity Name and Location Context. The Location Context is derived from the person's location country. + Ethnicity Name does not exist in the Location Context of the person. Additionally, it must not be Inactive. The Location Context is derived from the location's country. + + + + + + + Along with Organization (defines Regulatory Region), unique attribute name/description identifying a valid instance of Ethnicity. + + + + + + + + Reference element representing a unique instance of Citizenship Status. + + + A valid instance of Citizenship Status must exist for the given value of Citizenship Status Description and Country Reference. + The Citizenship Status does not exist in the specified Regulatory Region + + + + + + + Along with Country Reference, unique attribute name/description identifying a valid instance of Citizenship Status. + + + + + + + + Reference element representing a unique instance of Military Status. + + + A valid instance of Military Status must exist for the given value of Military Status Name and Country Reference. + Military Status name does not exist in the specified Country + + + + + + + Along with Country Reference, unique attribute name/description identifying a valid instance of Military Status. + + + + + + + + Reference element representing a unique instance of Gender. + + + + + Unique attribute name/description identifying a valid instance of Gender. + + + A valid instance of Gender must exist for the given value of Gender Description. + Gender Description does not exist! + + + + + + + + + Reference element representing a unique instance of Visa Type. + + + + + Unique attribute name/description identifying a valid instance of Visa Type (Identifier Type). + + + A valid instance of Visa Type must exist for the given value of Visa Type Name. + Unable to find Visa ID Type for Identifier Type Name. + + + + + + + + + Reference element representing a unique instance of Custom ID Type. + + + + + Unique attribute name/description identifying a valid instance of Custom ID Type. + + + A valid instance of Custom ID Type must exist for the given value of Custom ID Type Name. + Unable to find Custom ID Type with that Identifier Type Name. Please confirm in your tenant that the Custom ID Type exists. + + + A valid instance of Custom ID Type must exist for the given value of Custom ID Type Name. + Cannot create Custom Identifier because the Custom Identifier Type must generate an ID from a sequence generator. + + + + + + + + + Reference element representing a unique instance of Government ID Type. + + + + + Unique attribute name/description identifying a valid instance of Government ID Type. + + + A valid instance of Government ID Type (or National ID Type) must exist for the given value of Government ID Type Name. + Unable to find a Government ID Type (or a National ID Type) with that Identifier Type Name + + + + + + + + + Reference element representing a unique instance of License ID Type. + + + + + Unique attribute name/description identifying a valid instance of License ID Type (Identifier Type). + + + A valid instance of License ID Type must exist for the given value of License ID Type Name. + Unable to find License ID Type for Identifier Type Name. + + + + + + + + + Reference element representing a unique instance of Passport ID Type. + + + + + Unique attribute name/description identifying a valid instance of Passport ID Type (Identifier Type). + + + A valid instance of Passport ID Type must exist for the given value of Passport ID Type Name. + Unable to find Passport ID Type with that Identifier Type Name. + + + + + + + + + Reference element representing a unique instance of Language. + + + + + Unique attribute name/description identifying a valid instance of Language. + + + A valid instance of Language must exist for the given value of Language Description. + Language Description does not exist! + + + + + + + + + Encapsulating element containg all Employment data (e.g. Status, Position, Compensation, etc.) for an Employee. + + + + + + + + + + + Encapsulating element containg all Payroll Interface Processing data. + + + + + Reference to the pay rate type for the position. + + + + + Reference to a Frequency. + + + + + The external pay group for the position. + + + + + The external payroll entity for the position. + + + + + + Effective Date for Payroll Interface Processing. + + + + + + Reference element representing a unique instance of External Pay Group. + + + + + Unique attribute name/description identifying a valid instance of External Pay Group. + + + + + + + Response element containing an instance of Job Classification Group and its associated data. + + + + + A unique identifier for the Job Classification Group. + + + + + Encapsulating element containing Job Classification Group data. + + + + + Contains the detailed information about a Job Classification Group. + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + Set of Organization Reference elements. + + + + + Reference element representing an object within the Workday system. The sub-elements and attributes within this element are used to return one and only one instance of the identifying object. + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + + Encapsulating element containing all Termination Status data for a Worker. + + + + + Boolean attribute identifying whether the Worker is currently Terminated. + + + + + Most recent Termination Date. + + + + + Most recent termination event Category. + + + + + Most recent termination event Reason. + + + + + Boolean attribute identifying whether the Worker was terminated Involuntarily. + + + + + This boolean field shows the hire eligibility chosen by the exit interviewer. + + + + + + + Encapsulating element containg all Leave Status data. + + + + + Boolean attribute identifying whether the Worker is On Leave (as of As Of Date). + + + + + Current leave event Start Date. + + + + + Current leave event Estimated End Date. + + + + + Most recent leave event Actual End Date. + + + + + First Day of Work. + + + + + + Boolean attribute identifying whether the leave event has a Benefits Effect. + + + + + Boolean attribute identifying whether the leave event has a Payroll Effect. + + + + + Boolean attribute identifying whether the leave event has a Absence Accrual Effect. + + + + + Boolean attribute identifying whether the leave event has a Continuous Service Accrual Effect. + + + + + Boolean attribute identifying whether the leave event has a Stock Vesting Effect. + + + + + + + Encapsulating element containg all Probation Status data for a Worker. + + + + + Primary Position Probation Start Date + + + + + Primary Position Probation End Date + + + + + + + Encapsulating element containing all Personal Information for an Employee. + + + + + + + + + Reference element representing a unique instance of Educational Institution Type. + + + + + Unique attribute name/description identifying a valid instance of Educational Institution Type. + + + + + + + Response element containing an instance of Employee and his/her Personal Information. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Reference element representing a unique instance of Worker (e.g. Employee or Contingent Worker). + + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Employee, all of his/her Related Persons and personal information for each. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Response element containing an instance of Employee, all of his/her Related Persons and personal information for each. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Encapsulating element containing all Related Persons data. + + + + + + + + Encapsulating element containing all Commission Plan Compensation data. + + + + + Text attribute identifying name of Commission Plan. + + + A valid instance of Compensation Component must exist for the given value of Commission Plan Name. + The Commission Plan Name entered does not exist. + + + + + + + + + + Encapsulating element containing all Compensation Element Values for Commission Plan data. + + + + + + Target Amount for Compensation Element. + + + Amount cannot be negative. + + + + + + + + + + + + + + + Draw Amount for Compensation Element. + + + + + + + + + + + + + Text attribute describing the duration of the draw amount. + + + + + Boolean attribute identifying whether Compensation Element is recoverable. + + + + + The actual end date for the plan assignment. + + + Please check the Enable Actual End Date tenant setup - HCM flag before attempting to set the Actual End Date. + + + + + + + + + Response element containing an instance of Worker and his/her summarized Personal and Employment/Contract information. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Request element used to find and get Locations and their associated data. + + + + + Element containing reference to a specific Location. + + + + + Element containing filtering criteria to specify the Location to return in the response. + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request, then all groups will be returned. + + + + + + + + Response element containing instances of locations and their associated data. + + + + + + + + + + + + + + Response element containing an instance of Contingent Worker and his/her Contract Information. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Encapsulating element containing all Contingent Worker Contract Information data. + + + + + + + Text attribute identifying name of Contingent worker Type. + + + + + + + Date of Contract End. + + + + + + + + Response element containing an instance of Location and its associated data. + + + + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Response element containing an instance of Organization and its associated data. + + + + + A unique identifier to reference an Organization. (Not the business based Organization ID.) + + + + + + + + Response element containing an instance of Contingent Worker and his/her Personal Information. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Request element used to return a worker's job/position history loaded from a previous system. + If no worker reference is requested, then all workers with previous system job data will be returned. + + + + + + + + + + + Response element containing the instances of workers and their previous job history. + + + + + + + + + + + + + Reference element representing a unique instance of External Payroll Entity. + + + + + Unique attribute name/description identifying a valid instance of External Payroll Entity. + + + A valid instance of External Payroll Entity must exist for the given value of Payroll Entity ID. + Payroll Entity ID does not exist. + + + + + + + + + Utilize the following element to retrieve the current DateTime of the Workday system. + + + + + + Response element containing the current DateTime of the Workday system. + + + + + Encapsulating element containing all Server Timestamp data. + + + + + + + + Reference element representing a unique instance of Worker (e.g. Employee or Contingent Worker). + + + + + + + + + + + Encapsulating element for all Personal Preferences. + + + + + If true, sets email preferences to the 'immediate email' notification channel for the following notification types: tasks, to-dos, custom business process notifications, approvals. If false, sets email preferences to the 'disabled' notification channel for the following notification types: tasks, to-dos, custom business process notifications, approvals. If no value is specified, there is no impact on the email preferences. + + NOTE: To-dos, tasks, approvals, and custom business process notifications types must be enabled for user preferences and have an allowed channel of "disabled" in order to set this to false or an allowed channel of "immediate email" in order to set this to true. + + + + + + + Utilize the following elements to update the Image (e.g. picture) for an existing Employee within the Workday system. + + + + + + Reference element representing a unique instance of Employee. + + + + + + + + + + + Encapsulating element containing all Employee Image data. + + + + + Text attribute identifying Filename of the Attachment. + + + + + + + + + + File content in binary format. + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Employee and its associated data. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Response element containing an instance of Employee and its associated data. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Encapsulating element containing all Employee data. + + + + + Text attribute identifying Employee ID. + + + + + Text attribute identifying User Name. + + + + + + + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve an instance of Contingent Worker and its associated data. + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Find" operations, the "As Of Date" determines what data to be used within the search logic. For "Get" operations, the response element will only include data that is the most effective as of the "As Of Date". + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Find" operations, the "As Of Moment" determines what data to be used within the search logic. For "Get" operations, the response element will only include data entered into Workday before the "As Of Moment". + + + + + + + Response element containing an instance of Contingent Worker and its associated data. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Encapsulating element containing all Contingent Worker data. + + + + + Text attribute identifying User Name. + + + + + + + + + + This element references a unique type of Currency. + + + + + The currency code uniquely describes a currency. + + + There is no Currency for that Currency ID. + Currency ID does not exist. + + + + + + + + + Encapsulating element for all Address data. + + + Usage Type and Use For combination must be valid for Address. + Usage Type and Use For combination must be valid for Address. + + + Region Name must be valid for the specified Country. + Region Name must be valid for the specified Country. + + + Municipality is required for certain countries. + Municipality is required for certain countries. + + + Postal Code is required for certain countries. + Postal Code is required for certain countries. + + + Municipality is not a valid address component for certain countries . + Municipality is not a valid address component for certain countries . + + + Postal Code is not a valid address component for certain countries. + Postal Code is not a valid address component for certain countries. + + + Address Line is required for certain countries. + Address Line is required for certain countries. + + + Second Address Line is required for certain countries. + Second Address Line is required for certain countries. + + + Third Address Line is required for certain countries. + Third Address Line is required for certain countries. + + + Fourth Address Line is required for certain countries. + Fourth Address Line is required for certain countries. + + + Subregion is required for certain countries. + Subregion is required for certain countries. + + + Second Subregion is required for certain countries. + Second Subregion is required for certain countries. + + + Submunicipality (or City Subdivision - Local if configured on Tenant Setup Global) is required for certain countries. + Submunicipality (or City Subdivision - Local if configured on Tenant Setup Global) is required for certain countries. + + + Second Submunicipality is required for certain countries. + Second Submunicipality is required for certain countries. + + + Second Address Line is not a valid address component for certain countries. + Second Address Line is not a valid address component for certain countries. + + + Third Address Line is not a valid address component for certain countries. + Third Address Line is not a valid address component for certain countries. + + + Fourth Address Line is not a valid address component for certain countries. + Fourth Address Line is not a valid address component for certain countries. + + + Subregion is not a valid address component for certain countries. + Subregion is not a valid address component for certain countries. + + + Second Subregion is not a valid address component for certain countries. + Second Subregion is not a valid address component for certain countries. + + + Submunicipality is not a valid address component for certain countries. + Submunicipality is not a valid address component for certain countries. + + + Second Submunicipality is not a valid address component for certain countries. + Second Submunicipality is not a valid address component for certain countries. + + + A maximum of four Submunicipalities are allowed in an address. + A maximum of four Submunicipalities are allowed in an address. + + + A maximum of four Subregions are allowed in an address. + A maximum of four Subregions are allowed in an address. + + + A maximum of four Address Lines are allowed in an address. + A maximum of four Address Lines are allowed in an address. + + + Region is required for certain countries. + Region is required for certain countries. + + + Home addresses which are not additionally used as work addresses cannot be marked as public. + Home addresses which are not additionally used as work addresses cannot be marked as public. + + + Postal Code must be valid for the Region. + [postal code] is not a valid postal code for [region name] + + + Address Line 1 is not valid for this Country. + Address Line 1 is not valid for this Country. + + + Address Line 2 not Valid for this Country. + Address Line 2 not Valid for this Country. + + + Address Line 3 is not Valid for this Country. + Address Line 3 is not Valid for this Country. + + + Address Line 4 is not Valid for this Country. + Address Line 4 is not Valid for this Country. + + + Address Line 5 is not Valid for this Country. + Address Line 5 is not Valid for this Country. + + + Address Line 6 is not Valid for this Country. + Address Line 6 is not Valid for this Country. + + + Address Line 7 is not Valid for this Country. + Address Line 7 is not Valid for this Country. + + + Address Line 8 is not Valid for this Country. + Address Line 8 is not Valid for this Country. + + + Address Line 9 is not Valid for this Country. + Address Line 9 is not Valid for this Country. + + + Address Line 1 (or Address Line 1 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 1 (or Address Line 1 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 5 (or Address Line 5 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 5 (or Address Line 5 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 6 (or Address Line 6 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 6 (or Address Line 6 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 7 (or Address Line 7 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 7 (or Address Line 7 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 8 (or Address Line 8 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 8 (or Address Line 8 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 9 (or Address Line 9 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 9 (or Address Line 9 - Local if configured on Tenant Setup Global) is Required for this Country. + + + You cannot specify the same usage type more than once for an address. + + + + + + + + + Municipality + + + + + Encapsulating element for all Submunicipality data. + + + + + Region (e.g. State, Province, etc.) + + + + + + Postal Code + + + + + + + Date of last change to Address. + + + + + Effective Date of Address. + + + + + + Encapsulating element for all Address Line data. + + + + + + The Descriptor is an optional serialized attribute that shows the text Override Label (such as Apartment Number or Building Number) that helps describe the usage of the Type (such as ADDRESS_LINE_5 and ADDRESS_LINE_6) for each Country. + + + + + Enter the Address Line Type, such as ADDRESS_LINE_1, or ADDRESS_LINE_2. + + + + + + + + Encapsulating element for all Subregion data. + + + + + + The Descriptor is an optional serialized attribute that shows the text Override Label (such as Municipality or District) that helps describe the usage of the Type (such as REGION_SUBDIVISION_1 or REGION_SUBDIVISION_2) for each Country. + + + + + Enter the Region Subdivision Type, such as REGION_SUBDIVISION_1, or REGION_SUBDIVISION_2. + + + + + + + + Reference element representing a unique instance of Frequency. + + + + + Unique attribute name/description identifying a valid instance of Frequency. + + + + + + + Encapsulating element for all Communication Method Usage data. + + + + + + Reference element representing a unique instance of Communication Usage Behavior. + + + + + Description of the usage of the contact information. + + + + + + Boolean attribute identifying whether this Communication Usage is Public. + + + + + + Encapsulating element containing all Compensation Element Values for Unit Salary Plan data. + + + + + + + Amount per unit (based on Frequency). + + + Amount cannot be negative. + + + + + + + + + + + + + + Number of units. + + + + + + + + + + + + + The actual end date for the plan assignment. + + + Please check the Enable Actual End Date tenant setup - HCM flag before attempting to set the Actual End Date. + + + + + + + + + Encapsulating element containing all Unit Salary Plan Compensation data. + + + + + Text attribute identifying name of Unit Salary Plan + + + A valid instance of Compensation Component must exist for the given value of Unit Salary Plan Name. + The Unit Salary Plan provided does not exist. + + + + + + + + + + Encapsulating element containing all Compensation Element Values for Unit Allowance Plan data. + + + + + + Number of units. + + + Number Of Units cannot be negative. + + + + + + + + + + + + + + + + Amount per unit (based on Frequency). + + + Amount cannot be negative. + + + + + + + + + + + + + + Reimbursement Start Date + + + Reimbursement Start Date must be entered for reimbursable allowance plans that use an expense accumulator requiring a custom date. For all other allowance plans it must be empty. + + + + + + + The actual end date for the plan assignment. + + + Please check the Enable Actual End Date tenant setup - HCM flag before attempting to set the Actual End Date. + + + + + + + + + Encapsulating element containing all Unit Allowance Plan Compensation data. + + + + + Text attribute identifying name of Allowance Plan. + + + A valid instance of Unit Allowance Plan must exist for the given value of Unit Allowance Plan Name. + The Unit Allowance Plan provided does not exist. + + + + + + + + + + Reference element representing a unique instance of Compensation Step. + + + + + Unique attribute name/description identifying a valid instance of Compensation Step. + + + A valid instance of Compensation Step must exist for the given value of Compensation Step Name. + The Compensation Step provided does not exist. + + + + + + + Start date for the Compensation Step. + + + + + + + Reference element representing a unique instance of Communication Usage Type. + + + Invalid Communication Usage Type + Invalid Communication Usage Type + + + + + + + + Boolean attribute identifying whether the Communcation Usage Type is Primary. + + + + + + + + Encapsulating element for all Last Name data. + + + + + + Type of Last Name (e.g. Hereditary, Secondary, etc.) + + + The last name type is not valid. Valid last name types are: Primary and Secondary + + + + + + + + + + Encapsulating element for all Prefix Name data. + + + A valid instance of Prefix must exist for the given value of Type and Prefix. + The prefix value is not valid for the prefix type. + + + + + + + + Type of Prefix (e.g. Social, Royal, etc.) + + + The prefix type is not valid. Valid prefix types are: Salutation and Title. + + + + + + + + + + Encapsulating element for all Suffix Name data. + + + A valid instance of Suffix must exist for the given value of Type and Suffix. + The suffix value is not valid for the suffix type. + + + + + + + + Type of Suffix (e.g. Social, Royal, etc.) + + + The suffix type is not valid. Valid suffix types are: Academic, Hereditary, Honorary, Professional, Religious, Royal and Social. + + + + + + + + + + Utilize the following Reference element (and other optional attributes) to retrieve instances of Worker Events and their associated data. + + + + + + + + + + Response element containing an instance of Worker and his/her Worker Event History. + + + + + + + + + + Encapsulating element containing Worker Event History data. + + + + + + + + + Encapsulating element containing Event History data. + + + + + Text attribute identifying Event ID. + + + + + + Text attribute identifying Event Description. + + + + + Date the event completed. + + + + + Date the event was made effective (or completed if no Effective Date). + + + + + + + Element contains effective and updated date/time data. + + + Updated Through must be less than or equal to Current Moment! + Updated Through must be less than or equal to Current Moment! + + + Effective From must be less than or equal to Effective Through! + Effective From must be less than or equal to Effective Through! + + + If one of Effective From or Effective Through contains a value, both are Required! + If one of Effective From or Effective Through contains a value, both are Required! + + + If one of Updated From or Updated Through contains a value, both are Required! + If one of Updated From or Updated Through contains a value, both are Required! + + + Updated From must be less than or equal to Updated Through! + Updated From must be less than or equal to Updated Through! + + + + + + + Defines the earliest moment (e.g. datetime) data was entered into the Workday system. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. + + + + + Defines the earliest Effective Date (e.g. As Of Date) data is marked within the Workday system. + + + + + Defines the latest Effective Date (e.g. As Of Date) data is marked within the Workday system. + + + + + + + Reference element representing a unique instance of Disability. Does not support the update of Disability Status. Use Put Applicant web service to update the Disability Status for a Person. + + + A valid instance of Disability must exist for the given value of Disability Name and the person's location. + The Disability Name does not exist in the person's location. Additionally, it must not be Inactive. + + + + + + + Disability for a Person. Creates a new Disability Status without a Disability Status Date. To update the Disability Status Date for a Person, use the Put Applicant web service. + + + + + + + + Encapsulating element for Military Service Data. + + + + + + Date of Military Discharge. + + + + + + + Encapsulating element containing all Workday Account data. + + + User Name must be unique within the Workday system. + User Name already taken, please choose another one. + + + Either Password parameter or Generate_Random_Password parameter must be set to false. + Either Password parameter or Generate_Random_Password parameter must be set to false. + + + If Generate_Random_Password parameter is set to true, Require_New_Password_at_Next_Login parameter must also be set to true. + If Generate_Random_Password parameter is set to true, Require_New_Password_at_Next_Login parameter must also be set to true. + + + + + + + Text attribute identifying User Name. + + + User Name Parameter must not contain any semicolons or colons + User Name Parameter must not contain any semicolons or colons + + + The entered User Name is longer than the current tenant maximum. The tenant max is set to [max]. + + + + + + + Text attribute identifying Password. + + + Password must meet password requirements. + The password does not meet password requirements. + + + + + + + If True, generates a random password for the specified Workday Account and emails the new password to the email address associated with that account. If False, a new password can be provided in a different field, or if that is not provided, the associated Workday Account's password is unchanged. + + + If Generate_Random_Password is true, the user must have an email address on file, the tenant must be set up to send security emails, and the user cannot use delegated authentication. + If Generate_Random_Password is true, the user must have an email address on file, the tenant must be set up to send security emails, and the user cannot use delegated authentication. + + + + + + + Boolean attribute identifying whether user will need to enter a new password upon next sign-in to the Workday system. + + + + + True when the user is exempt from One-Time Passcode Authentication, False otherwise. Set this element to true if you want the user to be exempt from one-time passcode authentication. + + + One-Time Passcode Exempt cannot be modified if the user is not required to use One-Time Passcode Authentication. + One-Time Passcode Exempt cannot be modified if the user is not required to use One-Time Passcode Authentication. + + + + + + + True when the user's One-Time Passcode grace period is enabled, False otherwise. Set this element to false if you want the user's one-time passcode grace period to be disabled. + + + One-Time Passcode Grace Period Enabled cannot be modified if the user is not required to use One-Time Passcode Authentication. + One-Time Passcode Grace Period Enabled cannot be modified if the user is not required to use One-Time Passcode Authentication. + + + + + + + The remaining number of times the user can login without providing a one-time passcode. This cannot be higher than the configured tenant maximum grace period login count. + + + One-Time Passcode Grace Period Remaining Login Count cannot be modified if the user is not required to use One-Time Passcode Authentication. + One-Time Passcode Grace Period Remaining Login Count cannot be modified if the user is not required to use One-Time Passcode Authentication. + + + One-Time Passcode Grace Period Remaining Login Count cannot be less than 0 or greater than the tenant Maximum Grace Period Login Count + One-Time Passcode Grace Period Remaining Login Count cannot be less than 0 or greater than the tenant Maximum Grace Period Login Count: [max count] + + + + + + + + + + + + + Boolean attribute identifying whether Workday Account is disabled. + + + + + The user will be prevented from signing on to the system after this date (Pacific Time). + + + + + This field is used for OpenID based authentication and contains the email address associated with the OpenID account. This value needs to be provided to enable OpenID authentication for this user. + + + + + This field is used for OpenID based authentication and contains the OpenID GUID. It will be unpopulated until the user completes an initial successful OpenID authentication attempt. + + + + + This field is used for OpenID Connect based authentication and contains the OpenID Connect subject. It will be unpopulated until the user completes an initial successful OpenID Connect authentication attempt. + + + + + The user will be authenticated via an external system. + + + + + The number of minutes the user may be idle before the system requires them to re-enter their user name and password. + + + Session Timeout Minutes must be greater than 5 and less than or equal to [max]. The default value is [default]. + + + + + + + + + + + + + + The web browser title will include the user name in parenthesis. + + + + + The user will be presented with an icon to view reports as an RSS feed. + + + + + The user will have the Workbox tab available in the right-side slide-out. + + + + + The local defines the user's language and country which will affect their experience in the Workday system. + + + + + If set, specifies language for user. If not set, language specification taken from Locale_Reference + + + + + If set, specifies the initial search category displayed to the user. + + + + + The user is allowed to view mixed language transactions. + + + + + + True when the user is exempt from Delegated Authentication, False otherwise. Set this element to true if you want the user to be exempt from delegated authentication. + + + + + + + Utilize the following elements to update an existing Workday Account into the Workday system. + + + A valid instance of Workday Account must exist for the given Worker Reference. + No Workday Account found for referenced Worker. + + + Worker Reference or Non Worker Reference must be omitted. + Worker Reference or Non Worker Reference must be omitted. + + + + + + + + A reference to the person (non employee or contingent worker) for whom you are updating the account + + + + + + + + + Reference element representing a unique instance of Company Insider Type. + + + A valid instance of Company Insider Type must exist for the given value of Company Insider Type Name. + The Company Insider Type does not exist. + + + + + + + Unique attribute name/description identifying a valid instance of Company Insider Type. + + + + + + + Utilize the following data element to add a new User Account into the Workday system. + + + Either Password or Generate_Random_Password must have a value when creating a new Workday Account + Either Password or Generate_Random_Password must have a value when creating a new Workday Account + + + A Workday Account cannot already exist for the referenced Worker. + A Workday Account already exists for referenced Worker. + + + Worker Reference or Non Worker Reference must be omitted. + Worker Reference or Non Worker Reference must be omitted. + + + + + + + + A reference to the person (non employee or contingent worker) for whom you are updating the account + + + + + + + + + Element containing all company insider type data. + + + + + Company Insider Type ID. This is the unique identifier for a company insider type. + + + + + Company Insider Type Name. + + + Company Insider Type Name is required. + + + The Company Insider Type Name has already been used. + + + + + + + Company Insider Type description. + + + + + Boolean that indicates if a Company Insider Type is inactive. + + + + + + + Reference element representing a unique instance of Country Region. Note that this is a multipart key of Region name and Country code. + + + The Country Region specified in the Reference does not exist. + Country Region Reference does not exist. + + + + + + + + A name uniquely identifying a Country Region (a geographic or governmental subdivision). + + + + + + + Element containing all Location data. + + + Location Name is required when creating a new Location. + Location Name is required when creating a new Location. + + + Time Profile Reference is required when creating a new Location. + Time Profile Reference is required when creating a new Location. + + + Usage Type is Invalid for this Contactable. + Usage Type is Invalid for this Contactable. + + + Validates that the code provided matches one of the locale codes in the Workday system. + Invalid Locale Code. + + + You must choose a Workday-supported User Language that has been enabled in this tenant. + You must choose a Workday-supported User Language that has been enabled in this tenant. + + + Locations must be uniquely assigned to a location hierarchy. A location can be assigned to one or more location hierarchy organizations, but can only be assigned to one organization in a hierarchy. + Locations must be uniquely assigned to a location hierarchy. A location can be assigned to one or more location hierarchy organizations, but can only be assigned to one organization in a hierarchy. + + + A Work Space Location cannot be a Business Site at the same time. + A Work Space Location cannot be a Business Site at the same time. + + + A Business Site cannot be a subordinate of a Work Space. + A Business Site cannot be a subordinate of a Work Space. + + + Work Space Locations must be a subordinate of Work Space or Business site, it cannot be a top-level Location. + Work Space Locations must be a subordinate of Work Space or Business site, it cannot be a top-level Location. + + + Another location already exists with the same latitude, longitude, and altitude. + Another location already exists with the same latitude, longitude, and altitude. + + + Worksite ID Code must be unique within a US State. Please change the Worksite ID Code. + Worksite ID Code must be unique within a US State. Please change the Worksite ID Code. + + + Worksite ID Code and Trade Name are valid only for Locations based in US. + Worksite ID Code and Trade Name are valid only for Locations based in US. + + + Address is required for a location used as a business site without address defined. + Address is required for a location used as a business site without address defined. + + + This location cannot be inactivated as it is the primary location on at least 1 active supervisory organization. + This location cannot be inactivated as it is the primary location on at least 1 active supervisory organization. + + + An Instructional Site Location cannot be a Campus at the same time. + An Instructional Site Location cannot be a Campus at the same time. + + + Owning organization is required for an instructional location. + Owning organization is required for an instructional location. + + + Address is required for a Par Location. + Address is required for a Par Location. + + + A selected Location Attribute is marked as inactive. + A selected Location Attribute is marked as inactive. + + + The Location Usages of the Location Attributes must match the usages on the Location. + The Location Usages of the Location Attributes must match the usages on the Location. + + + Effective Date cannot be specified when creating a new location. + + + You can't select both Business Site and Job Posting in the Location Usage field. Remove 1 of them. + + + Address is required for a Job Posting Location. + + + + + + + The unique location ID. The organization, position and hire tabs will reference location ID. + + + + + Specifies the Effective Date for updates to these fields only: Location Name, Inactive, and Location Hierarchy Reference. Blank means these field values will be effective as of the beginning of time. Must be blank for new locations. + + + + + The name of the Location. + + + + + Reference to the usage of the Location. (e.g. Business Site, Work Space, etc.) + + + Business Asset is currently in use and cannot be unchecked at this time. + + + Business Site is currently in use in [usage_count] places and cannot be unchecked unless all usages are removed. Places to check where it may be in use include: current and historical assignment to an active position, primary location on a supervisory organization, hiring restriction, bank routing rule, employee contract, payroll usage including result lines, custom report filter, or a condition rule. + + + Work Space is currently in use and cannot be unchecked at this time. Places to check where it may be in use include: assignment to an active position, primary location on a supervisory organization, hiring restriction, custom report filter, or a condition rule. + + + A Location that has a Work Space Location as subordinate must be a Business Site or a Work Space Location. + + + A Work Space Location cannot have a Business Site Location as Subordinate. + + + Inventory is currently in use and cannot be unchecked at this time. + + + You can't remove Job Posting as the Location Usage because it's being used [count] times as the Default Job Posting Location in other Business Site type locations. + + + Payroll Tax location usage may not be removed as payroll tax mappings exist. + + + + + + + The location type associated with the location that ties to the usage that has been setup. If left blank, existing values will be removed. + + + + + The Location Attributes associated with this Location. If left blank, existing values will be removed. + + + + + Superior Location Reference. Reference to another Location that is Superior. If left blank, existing values will be removed. + + + Assigning this superior location would create a circular reference. + + + Both Editing Location and Its superior cannot be Inventory Sites + + + You can't assign a superior location that will result in 2 inventory sites in the same location chain. + + + Unable to assign this superior location because the editing location is an Inventory Site and the superior location is or contain Inventory Site within the location chain hierarchy. + + + Unable to assign the superior location because the editing location has Inventory Transaction and its Inventory Site is different than the Inventory Site of the Superior Location + + + Unable to remove the Superior Location because the editing location contain Inventory Transaction + + + + + + + Boolean attribute indicates if the Location is inactive. + + + Unable to inactivate location when Tax Location Mapping Exists. + + + + + + + The Latitude for a Coordinate. If left blank, existing values will be removed. + + + + + + + + + + + The Longitude for a Coordinate. If left blank, existing values will be removed. + + + + + + + + + + + The Altitude for a Coordinate. If left blank, existing values will be removed. + + + + + + + + + + + The time profile associated with the location. This ties to the time profile description that has been set up. If left blank, existing values will be removed. + + + + + Reference to the Locale used by the Location. If left blank, existing values will be removed. + + + + + Reference to the Default Display Language for the Location. If left blank, existing values will be removed. + + + + + Reference to the Time Zone of the Location. If left blank, existing values will be removed. + + + + + Reference to the Default Currency for the Location. In 'Put_Location', if the specified currency is different from the default currency of the country of the location's primary address then it is populated in this field as an override and displayed in the UI as 'Location Default Currency Override'. In 'Get_Locations', the override currency will be returned if there is one, otherwise the default currency of the country of the location's primary address will be returned. + + + + + An alternate name for the primary location when the job details display on the Recruiting External Career Sites. + + + + + Define the location that's used when posting jobs for this business site location. This can be overridden by entering a different Job Posting Location Override on the Job Requisition. + + + Cannot specify a location as a Default Job Posting Location for itself. + + + Locations used as a Default Job Posting Location must have a Location Usage of Job Posting or Business Site. + + + + + + + The division or subsidiary name of the establishment. If left blank, existing values will be removed. + + + + + + + + + + A unique alpha/numeric identifier that identifies the business at this physical location. If left blank, existing values will be removed. + + + + + + + + + + + + + Reference to a Location Hierarchy the includes this Location. If left blank, location will be removed from all location hierarchies it is included in as of effective date specified. + + + + + + + + This section holds the employee's election and the maximum the employee can elect when the benefit plan uses percentages as elections. + + + + + The employee's election. This is the percent that should be taken as a deduction. + + + + + + + + + + + + The maximum amount the employee can elect. + + + + + + + + + + + + + + Encapsulating element containing all Contract Details data. + + + + + Contract Pay Rate (based on Frequency). + + + + + + + + + + + + Reference element representing a unique instance of Currency Rate Type. + + + + + Reference element representing a unique instance of Frequency. + + + + + Text attribute identifying description of Contract Assignment. + + + + + + + Element encapsulating Company Tax ID data. + + + Tax ID is required + Tax ID is required + + + + + + + Represents a reference to the company. + + + + + Tax ID for the Company. + + + + + + + The reference to the employee for which the photographic image is required + + + + + + + + + The Employee photographic image data for a specified employee reference + + + + + + + + + + Utilize the following elements to add (or update, if already existing) the tax ID for a company. + + + + + Represents the data structure used to load a company's tax ID. + + + + + + + + Utilize the following elements to get the tax ID for a company. + + + + + + + + + Response element containing an instance of Company and its Tax ID. + + + + + + + + + The annual contribution for the spending account election. + + + + + The annual contribution amount for the spending account election. + + + + + + + + + + + + The prior annual contribution amount if any was previously made. + + + + + + + + + + + + The remaining pay periods after the prior contribution amount. + + + + + + + + + + + + + + Parameters that let you filter the data returned in the response. You can filter returned data by dates and page attributes. + + + Page number cannot be zero. + Page Number cannot be zero. + + + + + + + Indicates the date when application data, such as benefits and compensation, are deemed effective in the Workday system. (Also referred to as the "Effective Moment".) If not specified, this date defaults to TODAY. + + + + + Indicates the date and time that data was entered into the system. (This field is also referred to as the "Entry Moment".) If not specified, defaults to the CURRENT DATE/TIME. + + + + + Indicates the page of data to return in the response, and defaults to the first page (Page = 1). For responses that contain more than one page of data, use this parameter to retrieve the additional pages of data. For example, set Page = 2 to retrieve the second page of data. + + Note: If you set the page parameter, you must also specify the "As_Of_Entry_Date" to ensure that the result set remains the same between your requests. + + + + + + + + + + + + Sets the number of objects to return within each response page (Min = 1, Max = 999, Default = 100 if not set). Any values you set must be between 1-999. + + + + + + + + + + + + + + Contains request references and filter for getting Work Shift Data. + + + + + + + + + + Element containing all Work Shift data. + + + + + Work Shift ID. This is the unique identifier for a Work Shift. + + + + + Name for the Work Shift. + + + Work Shift Name is required. + + + + + + + Description of the Work Shift. + + + + + Location Reference. Reference to a Country or Country Region. + + + Location (Country or Country Region) is required. + + + The Location cannot be changed for an existing Work Shift. + + + + + + + Flag indicating whether the Work Shift is inactive. + + + + + + + Contains request reference and filter for getting Job Category data. + + + + + + + + + + Wrapper element that encapsulates the Job Category Data + + + + + A unique identifier for the job category. + + + + + Name of the Job Category. + + + Job Category Name is required. + + + + + + + Free form text describing a job category. + + + + + Boolean which indicates if the Job category is inactive. + + + + + + + Reference element representing a unique instance of Merit Plan. + + + + + Unique attribute name/description identifying a valid instance of Merit Plan. + + + A valid instance of Merit Plan must exist for the given value of Merit Plan Name. + The Merit Plan Name entered does not exist. + + + + + + + + + + Encapsulating element containing all values for Merit Plan Assignment data + + + + + Percent for Compensation Element. + + + + + + + + + + + + Guaranteed Minimum for Compensation Element. + + + + + The actual end date for the plan assignment. + + + Please check the Enable Actual End Date tenant setup - HCM flag before attempting to set the Actual End Date. + + + + + + + + + Encapsulating element containing all Compesation Detail data. + + + + + + + + + + + + + + + + + + + + The "Response_Results" element contains summary information about the data that has been returned from your request including "Total_Results", "Total_Pages", and the current "Page" returned. + + + + + The total number of results that have been returned from your request. + + + + + + + + + + + + The total number of pages that exist for your request. A page of data in WWS contains a maximum of 100 entries. So, if you have exactly 1,000 employees returned in a request, then you will have 10 pages of data that will need to be retrieved to build your complete dataset. + + Each page contains a maximum of 100 entries. + + + + + + + + + + + + Number of Results in current page. + + + + + + + + + + + + The page of data that has been returned for the given request. + + + + + + + + + + + + + + Searches the transaction log for business processes and event lites to find specific events that occurred during a period of time. + + + Subscriber Reference must have an enabled Transaction Log Service configuration. + Subscriber Reference must have an enabled Transaction Log Service configuration. + + + + + + + Encapsulating element containing Effective and Updated DateTime data. + + + + + + If specified, this search criteria will return those Transaction Log Entries which match the Transaction Types specified here. + + + + + If specified, this search criterium will return those Transaction Log Entries that match the Transaction Types defined in the subscription of the subscriber. + + + + + + + + Captures a comment for the Business Process. + + + + + Free form comment regarding the business process. + + + This Business Process has been configured to disable comment. Please remove the comment or change the setting in the Business Process Policy or tenant setup. + + + + + + + Default the Person making the comment to the processing person if not submitted via the web service. + + + + + + + Request element used to find and get workers and their associated data. + + + + + + + + + + + + The Request Criteria element lets you apply additional criteria to identify the specific instance(s) of a Worker. + + + + + Transaction Log Criteria Data + + + + + Unique Identifier for a Supervisory Organization + + + + + Unique Identifier for a Country + + + + + When this boolean value is set to true, indicates to include all subordinate organizations to the Organization Reference in the response. + + + + + Unique identifier for the position of the worker. + + + + + The identifier of an existing Event. + + + + + The unique identifier to a benefits plan, along with a string describing the benefits plan. Identifies the benefit plan or plans that can be used for Benefit Enrollment and Benefit Eligibility. Enrollment is checked when the benefit plan year falls within the effective date. Otherwise, if the benefit plan year falls outside of the effective data, then eligibility is checked. + + + + + + + Excludes from the response terminated employees or contingent workers whose contracts have ended. (See also: Exclude_Employees, Exclude_Contingent_Workers) + + + + + Excludes employees from inclusion in the response. (See also: Exclude_Inactive_Workers, Exclude_Contingent_Workers) + + + + + Excludes contingent workers from inclusion in the response. (See also: Exclude_Inactive_Workers, Exclude_Employees) + + + + + + + + Wrapper element for Get Workers Response. The response element has to match the Operation Name. + + + + + + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Worker and its associated data. + + + + + A reference to the ID of the worker. The ID consists of a type attribute, which should be set to "Employee_ID" or "Contingent_Worker_ID", and a value attribute, such as "04345". + + Employee_ID + + + + + + + + + Container for the processing options for sub-business processes within a business process. If no options are submitted (or the options are submitted as 'false') then the sub-business process is simply initiated as if it where submitted on-line with approvals, reviews, notifications and to-do's in place. If the Initiator is an Integration System User, any validations you configured on the Initiation step are ignored. + + + + + + When set to "true" or "1", the business process is automatically processed. This means that all approvals will be automatically approved in the system, all reviews and to-do's will be automatically by-passed, and all notifications will be automatically suppressed. + + + + + When set to "true" or "1", the business process is automatically skipped (if it is defined as "skippable" within the business process definition). + + + + + + + + + + Use the response group to limit the response to the data you are interested in. If the request does not set any values for the response group, then the response by default returns the following elements: Reference, Personal Data, Employment Data, Compensation Data, Organization Data, and Role Data. + + + + + Indicates if the Reference element for the worker is included in the response. + + + + + Indicates if the Personal Data element is included in the response. + + + + + This flag indicates that data for Additional Jobs and International Assignments should be included in the response. + + + + + Indicates if the Employment Data element is included in the response. + + + + + Indicates if the Compensation Data element is included in the response. + + + + + Indicates if the Organization Data element is included in the response. + + + + + Excludes the supporting role information from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the location hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the cost centers from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the cost center hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the company organizations from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the company hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the matrix organizations from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the pay groups from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the regions from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the region hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the supervisory organizations from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the teams from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the custom organizations from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Indicates if the Role Data element is included in the response. + + + + + Indicates if the Management Chain Data element is included in the response. + + + + + Set to true to return multiple managers in the management chain data section. Default selection is to return a single manager. + + + + + Indicates if the Benefit Enrollment Data element is included in the response. + + + + + Includes Benefit Eligibility Data + + + + + Indicates if the Related Person Data element is included in the response. + + + + + Indicates if the Qualification Data element is included in the response. + + + + + Indicates if the Employee Review Data element is included in the response. + + + + + Indicates that Goal Details will be included in the web service response. + + + + + Indicates that Development Item Details will be included in the web service response. + + + + + Indicates that Skill Details will be included in the web service response. + + + + + Indicates if the Photo Data element is included in the response. + + + + + Indicates if the Worker Document Data element is included in the response. + + + + + Indicates if the Transaction Log Data element is included in the response. + + + + + Include sub-events of corrected events in the response. + + + + + Include sub-events of rescinded event in the response. + + + + + Indicates if the Succession Profile element is included in the response. + + + + + Indicates if the Talent Assessment element is included in the response. + + + + + Indicates if the Employee Contract element is included in the response. + + + + + Include Collective Agreement data. This also requires Include Employment Information to be true. + + + + + Include Probation Period data. This also requires the Inlcude Employment Information to be true + + + + + Indicates that Feedback Received will be included in the web service response. + + + + + Indicates that User Account Data will be included in the web service response. + + + + + Indicates that Career Data will be included in the web service response. + + + + + Indicates that Account Provisioning Data will be included in the web service response. + + + + + Indicates if the Background Check Data element is included in the response. + + + + + Indicates if the Contingent Worker Tax Authority Form Information Data element is included in the response. + + + + + Excludes the Funds from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected + + + + + Excludes the fund hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the Grants from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected + + + + + Excludes the grant hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the Business Units from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected + + + + + Excludes the business unit hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the Programs from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected + + + + + Excludes the program hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + Excludes the Gifts from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected + + + + + Excludes the gift hierarchies from the Organization Data element response. This can only be selected when the Include Organization Data boolean is also selected. + + + + + + + Contains each Worker based on the Request References or Request Criteria. The data returned is the current information as of the dates in the response filter, and does not include all historical information about the worker. + + + + + + + + Encapsulating element containing all Worker Profile data. + + + + + A reference to the ID of the worker. The ID consists of a type attribute, which should be set to "Employee_ID" or "Contingent_Worker_ID", and a value attribute, such as "04345". + + + + + The Worker's Person Name. + + + + + + + + Contains the detailed information about a worker. + + + + + The ID for the employee or contingent worker. + + + + + Text attribute identifying User Name. + + + + + Personal Data + + + + + Contains the worker's employment information, such as their position and job information. + + Security Note: This element is secured to the following domains: Self-Service: Current Staffing Information, Worker Data: Current Staffing Information + + + + + Compensation Data + + + + + Organization Data + + + + + Role Data + + + + + Management Chain Data + + + + + Contains the worker's benefits information. + + Security Note: This element is secured to the following domains: Self Service: Benefit Elections; Worker Data: Benefit Elections + + + + + Contains the worker's benefit eligibility information for all Benefit Plan criteria that is not in the current plan year definition. + + + + + Contains the person's that are related to the worker as a dependent, beneficiary or emergency contact. + + Security Note: This element is secured to the following domains: Self Service: Benefit Elections; Worker Data: Benefit Elections + + + + + Qualification Data + + + + + Contains the employee's latest review for performance, performance improvement plan, development plan, and disciplinary action. This is only valid for a worker than is an employee. + + Security Note: This element is secured to the following domains: Worker Data: Employee Reviews, Self Service: Employee Reviews + + + + + Contains a photo of the worker. + + Security Note: This element is not secured so anyone that can run this web service has access to this element. + + + + + Contains the documents that were added for a worker during staffing events or ad-hoc. + + Security Note: This element is not secured so anyone that can run this web service has access to this element. + + + + + Worker External Field Result Data + + + + + Transaction Log Entry Data + + + + + + Contains a list of positions for which the employee is a succession candidate. This is only valid for a worker than is an employee. + + Security Note: This element is secured to the following domain: Worker Data: Succession. + + + + + Contains the employee's latest talent assessment, such as potential, achievable level, and retention. This is only valid for a worker than is an employee. + + Security Note: This element is secured to the following domain: Worker Data: Talent. + + + + + Contains the employee's goals and is similar to the content that is found in the Employee Goals UI page for an employee. + + Security Note: This element is secured to the following domain: Worker Data: Employee Goals + + + + + Contains the employee's development items and is similar to the content that is found in the Development Items UI page for an employee. + + + + + + Contains the employee's contract information. + + + + + Contains the employee's feedback received + + + + + Contains the worker's user account information (user name, preferred language). + + + + + + Contains the worker's provisioning group assignments + + + + + Contains Background Check Information + + + + + + + + Container for the processing options for a business process. If no options are submitted (or the options are submitted as 'false') then the business process is simply initiated as if it where submitted on-line with approvals, reviews, notifications and to-do's in place. If the Initiator is an Integration System User, any validations you configured on the Initiation step are ignored. + + + + + When set to "true" or "1", the business process is automatically processed. This means that all approvals will be automatically approved in the system, all reviews and to-do's will be automatically by-passed, and all notifications will be automatically suppressed. + + + + + Indicates the transaction should process to completion before the response is generated. + Note: All < v12 operations will process with Run_Now = True for backwards compatibility but please review this setting in your environment for performance conditions. + + + + + + + + This Business Process Type has been configured to not accept Event Attachments. + + + + + + + + + Contains the legal, preferred, and additional names for a person. + + + + + Contains the legal name for a person. A person must name one and only one legal name. + + + + + Contains the preferred name for a person. If no preferred name is returned then the legal name is assumed to be the preferred name. If a preferred name is not provided in a request then the legal name is assumed to be the preferred name. + + + + + Contains the additional names for a person, other than their legal and preferred names. Additional names are not valid for applicants. + + + + + + + Contains the legal name for a person. A person must name one and only one legal name. + + + + + Contains the components of a name, such as the First Name and Last Name. + + + + + + + Contains the components of a name, such as the First Name and Last Name. + + + + + The country that the name is for. + + + If one local script is submitted, all required local script name fields must be submitted. + + + If one western script is submitted, all required western script name fields must be submitted. + + + Local name is not enabled for this country. + + + + + + + Contains the prefixes for a name. + + + + + The first name (given name) for a person. + + + First Name is not setup for this country. + + + First Name (or Local First Name if configured) is required for this country. + + + + + + + The middle name for a person. + + + Middle Name is not setup for this country. + + + Middle Name (or Local Middle Name if configured) is required for this country. + + + + + + + The last name (family name) for a person. + + + Last Name is not set up for this country. + + + Last Name (or Local Last Name if configured) is required for this country. + + + + + + + The secondary last name (family name) for a person. + + + Secondary Last Name (or Local Secondary Last Name) is required for this country. + + + Last Name - Secondary is not set up for this country. + + + + + + + Contains the name components in local script for supporting countries. + + + + + Contains the suffixes for a name. + + + + + Full Person Name is used by Malaysia and Singapore. It is designed for workers in these countries to enter their full legal name. It is an attribute of Global Person Name class and is not a concatenation of First and Last names. + + + Full Name is not set up for this country. + + + + + + + + Contains, in one string, a fully formatted name with all of its pieces in their proper place. This name is only used in a response and is not used for requests. + + + + + Contains, in one string, a fully formatted name for reporting with all of its pieces in their proper place. This name is only used in a response and is not used for requests. + + + + + + Contains the prefixes for a name. + + + + + A reference to the title for a person. + + + Title is required for this country. + + + Title is not setup for this country. + + + [title] is not a valid title value for [country]. + + + + + + + A reference to the title for a person. + + + + + A reference to the form of address for a person. This is only valid for the country of Germany. + + + Salutation is required for this country. + + + Salutation is not setup for this country. + + + [salutation] is not a valid salutation value for [country]. + + + + + + + + + Contains the suffixes for a name. + + + + + A reference to the social suffix for a person. + + + Social Suffix is required for this country. + + + Social Suffix is not setup for this country. + + + [social suffix] is not a valid social suffix value for [country]. + + + + + + + A reference to the social suffix for a person. + + + + + A reference to the academic suffix for a person. This is only valid for the country of Australia. + + + Academic Suffix is required for this country. + + + Academic Suffix is not setup for this country. + + + [academic suffix] is not a valid academic suffix value for [country]. + + + + + + + A reference to the hereditary suffix for a person. This is only valid for the country of Australia. + + + Hereditary Suffix is required for this country. + + + Hereditary Suffix is not setup for this country. + + + [hereditary suffix] is not a valid hereditary suffix value for [country]. + + + + + + + A reference to the honorary suffix for a person. This is only valid for the country of Australia. + + + Honorary Suffix is required for this country. + + + Honorary Suffix is not setup for this country. + + + [honorary suffix] is not a valid honorary suffix value for [country]. + + + + + + + A reference to the professional suffix for a person. This is only valid for the country of Australia. + + + Professional Suffix is required for this country. + + + Professional Suffix is not setup for this country. + + + [professional suffix] is not a valid professional suffix value for [country]. + + + + + + + A reference to the religious suffix for a person. This is only valid for the country of Australia. + + + Religious Suffix is required for this country. + + + Religious Suffix is not setup for this country. + + + [religious suffix] is not a valid religious suffix value for [country]. + + + + + + + A reference to the royal suffix for a person. This is only valid for the country of Australia. + + + Royal Suffix is required for this country. + + + Royal Suffix is not setup for this country. + + + [royal suffix] is not a valid royal suffix value for [country]. + + + + + + + + + Contains the preferred name for a person. If no preferred name is returned then the legal name is assumed to be the preferred name. If a preferred name is not provided in a request then the legal name is assumed to be the preferred name. + + + + + Contains the components of a name, such as the First Name and Last Name. + + + + + + + Contains the additional names for a person, other than their legal and preferred names. Additional names are not valid for applicants. + + + + + Contains the components of a name, such as the First Name and Last Name. + + + + + The type of additional name that the name is. + + + + + + + Wrapper element for Personal Data. + + + The country of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + The country of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + The ethnicity does not exist in the specified Location Context. The Location Context is derived from the Country of the Location of the Position + The ethnicity does not exist in the specified Location Context. The Location Context is derived from the Country of the Location of the Position + + + The religion is not valid for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The religion is not valid for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The marital status does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. + The marital status does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. + + + Usage Type is Invalid for this Contactable. + Usage Type is Invalid for this Contactable. + + + The country region of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + The country region of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + Native Region is only tracked in China. + Native Region is only tracked in China. + + + Hukou Type is only tracked in China. + Hukou Type is only tracked in China. + + + Hukou Locality is only tracked for China. + Hukou Locality is only tracked for China. + + + Hukou Region is only tracked for China. + Hukou Region is only tracked for China. + + + Hukou Subregion is only tracked in China. + Hukou Subregion is only tracked in China. + + + The Citizenship Status is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The Citizenship Status is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + You may only specify one ethnicity for this worker or pre-hire. This is defined by your system administrator and based on the country of the worker or pre-hire. + + + Hukou Postal Code is only tracked for China. + Hukou Postal Code is only tracked for China. + + + Medical exam history is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + Medical exam history is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + Last Medical Exam Valid To Date must be after Last Medical Exam Date + Last Medical Exam Valid To Date must be after Last Medical Exam Date + + + Last Medical Exam Date cannot be in the future + Last Medical Exam Date cannot be in the future + + + The field Marital Status is required and must have a value if a Marital Status Date is entered. + The field Marital Status is required and must have a value if a Marital Status Date is entered. + + + The political affiliation does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Political Affiliation values are ignored for Puts involving applicants since a Political Affiliation value is associated with workers and not applicants. + The political affiliation does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Political Affiliation values are ignored for Puts involving applicants since a Political Affiliation value is associated with workers and not applicants. + + + The social benefits locality data has not been activated for this location via the Maintain Localization Settings task. + The social benefits locality data has not been activated for this location via the Maintain Localization Settings task. + + + The social benefits locality does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Social Benefits Locality values are ignored for Puts involving applicants since a Social Benefits Locality value is associated with workers and not applicants. + The social benefits locality does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Social Benefits Locality values are ignored for Puts involving applicants since a Social Benefits Locality value is associated with workers and not applicants. + + + The Additional Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The Additional Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + + + + + Contains the legal, preferred, and additional names for a person. + + + + + Describes the sex of the person based on representation of human sexes. + + Security Note: This element is secured according to the security policy for the "Gender/Age/Marital Status for Worker" domain. + + + + + A person's birth date. + + Security Note: This element is secured according to the security policy for the "Gender/Age/Marital Status for Worker" domain. + + + + + The date of a person's death. The date of death element is not valid for the following web services and will be ignored: Hire Employee, Contract Contingent Worker, and Put Applicant. + + Security Note: This element is secured according to the security policy for the "Gender/Age/Marital Status for Worker" domain. + + + + + The country the person was born in. + + Security Note: This element is secured according to the security policy for the "Ethnicity/Disability/Religion/Country of Birth for Worker" domain. + + + + + The country region the person was born in. + + Security Note: This element is secured according to the security policy for the "Ethnicity/Disability/Religion/Country of Birth for Worker" domain. + + + + + The country region the person was born in. + + Security Note: This element is secured according to the security policy for the "Ethnicity/Disability/Religion/Country of Birth for Worker" domain. + + + + + The city the person was born in. + + Security Note: This element is secured according to the security policy for the "Ethnicity/Disability/Religion/Country of Birth for Worker" domain. + + + + + Indicates the marital status that a person has. + + Security Note: This element is secured according to the security policy for the "Worker Data: Gender/Age/Marital Status" domain. + + + + + The person's marital status date. + + + The Marital Status Date cannot be before the Date of Birth + The Marital Status Date cannot be before the Date of Birth + + + + + + + Indicates the religions that a person has. + + Security Note: This element is secured according to the security policy for the "Ethnicity/Disability/Religion/Country of Birth for Worker" domain. + + + + + Disability Status Data for a Person + + Security Note: This element is secured according to the security policy for the Worker Data: Disabilities domain. + + + + + Indicates the ethnicities that a person has. + + Security Note: This element is secured according to the security policy for the "Ethnicity/Disability/Religion/Country of Birth for Worker" domain. + + + + + Returns a true if the person's ethnicity is Hispanic or Latino. + + Security Note: This element is secured according to the security policy for the "Ethnicity/Disability/Religion/Country of Birth for Worker" domain. + + + + + Specifies the status of a person's legal citizenship. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship for Worker" domain. + + + + + Specifies the person's Country of Nationality. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship for Worker" domain. + + + + + List of additional nationalities for the person. The list is a list of Countries. + + + Please select a primary nationality or remove the additional nationality. + Please select a primary nationality or remove the additional nationality. + + + Please select different primary and additional nationalities. + Please select different primary and additional nationalities. + + + + + + + The hukou region for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The hukou subregion for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The hukou locality for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The hukou postal code for the person. + + Security Note: This element is secured according to the security + + + + + The hukou type for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + Whether the hukou subregion of the person is local to the location of the primary job. This field is only used in a response and is not used for requests. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The native region for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + The native region for the person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship" domain. + + + + + Personnel File Agency is used in China to indicate where workers have their personnel file stored. + + + + + This field tracks the date of the worker's most recent medical exam + + + + + This field tracks the expiration date of the worker's most recent medical exam + + + + + This field tracks any comments regarding the worker's most recent medical exam + + + + + Returns the military status for a person. + + Security Note: This element is secured according to the security policy for the "Military/Citizenship for Worker" domain. + + + + + The id information for the person (national ids, government ids, passport ids, visa ids, license ids, custom ids). + + Security Note: This is secured to the following domains: My ID Information, Worker ID Information, Applicant Personal Data: ID Information + + + + + All of the person's contact data (address, phone, email, instant messenger, web address). + + Security Note: The response for Contact information is secured to the My Contact Information and Worker Private Contact Information domains for Get Workers and Get Payees and secured to the Applicant Data: Contact Information domain for Get Applicants web service. + + + + + Returns a true if the person uses tobacco products. + + + + + This field tracks the political affiliation of the person. + + + + + The person's Social Benefits Locality. Social Benefits Locality values are ignored for Puts involving applicants since a Social Benefits Locality value is associated with workers and not applicants. + + + + + + + + Wrapper element for the military service information for the person. + + + The Military Rank specified is not valid for Military Service Type or Country from Military Status. + The Military Rank specified is not valid for Military Service Type or Country from Military Status. + + + The Military Service Type specified is not valid for Country from Military Status. + The Military Service Type specified is not valid for Country from Military Status. + + + You can't assign a Military Status to a worker when their Hire Date is before the Effective Date of the Location + You can't assign a Military Status to a worker when their Hire Date is before the Effective Date of the Location + + + + + + + The person's military status. + + + Inactive military statuses are not allowed in this request. + Inactive military statuses are not allowed in this request. + + + + + + + The date the person was discharged from the military. + + + + + Begin Date for military service status + + + + + Service type for military service + + + + + Military rank for military service type + + + + + Notes for military service + + + + + Reference ID for the Military Service + + + + + + + Wrapper for Person Identification Data. Includes National Identifiers, Government Identifiers, Visa Identifiers, Passport Identifiers, License Identifiers and Custom Identifiers. + + + + + Wrapper element for all National Identifier Data. + + + + + Wrapper element for all Government Identifier Data. + + + + + Wrapper element for all Visa Identifier Data. + + + + + Wrapper element for all Passport Identifier Data. + + + + + Wrapper element for all License Identifier Data. + + + + + Wrapper element for all Custom Identifier Data. + + + + + + + Contains the worker's employment information, such as their position and job information. + + Security Note: This element is secured to the following domains: Self-Service: Current Staffing Information, Worker Data: Current Staffing Information + + + + + + Encapsulating element containing all Status data for a Worker. + + + + + Encapsulating element containing all Contract data for a Worker. + + + + + + + + Contains the worker's benefits information. + + Security Note: This element is secured to the following domains: Self Service: Benefit Elections; Worker Data: Benefit Elections + + + + + Contains the health care data for an employee. + + + + + Contains the health savings account information for an employee. + + + + + Contains the spending account information for an employee. + + + + + + + Contains the additional benefits data for an employee. + + + + + Contains COBRA Eligibility detail for a participant. If this element is not populated then the participant is assumed to not be COBRA eligible. + + + + + + + Contains the latest completed performance review for the employee. + + + + + Contains the latest completed performance review for the employee. + + + + + Contains the latest completed performance improvement plan for the employee. + + + + + Contains the latest completed development plan for the employee. + + + + + Contains the latest completed disciplinary action for the employee. + + + + + + + Contains the worker's compensation information. + + Security Note: This element is secured to the following domains: Self Service: Compensation; Worker Data: Compensation by Organization + + + + + Effective Date of Compensation. + + + + + Reason for most recent Compensation event. + + + + + Compensation Guidelines Data + + + + + Salary and Hourly Data + + + + + Unit Salary Plan Data + + + + + Allowance Plan Data + + + + + Unit Allowance Plan Data + + + + + Bonus Plan Data + + + + + Merit Plan Data + + + + + Commission Plan Data + + + + + Stock Plan Data + + + + + + Period Salary Plan Data + + + + + Employee Compensation Summary Data + + + + + + + Contains the worker's organizations that they are a member of. + + + + + + + + Contains the roles that a worker holds. + + + + + + + + Contains the worker's skills and experience. + + Security Note: This element is secured to the following domains: Self Service: Skills and Experience; Worker: Skills and Experience + + + + + Wrapper element for Accomplishments + + + + + Wrapper element for job history. + + + + + Wrapper element for Competency information. + + + + + Wrapper element for Certification information. + + + + + Wrapper element for Training information. + + + + + Wrapper element for Award information. + + + + + Wrapper element for Organization Membership information. + + + + + Wrapper element for Education information. + + + + + Wrapper element for work experience. + + + + + Wrapper element for Language information. + + + + + Wrapper element for Internal Project Experience information. + + + + + + + All of the person's contact data (address, phone, email, instant messenger, web address). + + + One and only one work email address must be marked as primary. + One and only one work email address must be marked as primary. + + + One and only one business email address must be marked as primary. + One and only one business email address must be marked as primary. + + + One and only one home email address must be marked as primary. + One and only one home email address must be marked as primary. + + + One and only one work phone must be marked as primary. + One and only one work phone must be marked as primary. + + + One and only one home phone must be marked as primary. + One and only one home phone must be marked as primary. + + + One and only one business phone must be marked as primary. + One and only one business phone must be marked as primary. + + + One and only one work web address must be marked as primary. + One and only one work web address must be marked as primary. + + + One and only one home web address must be marked as primary. + One and only one home web address must be marked as primary. + + + One and only one business web address must be marked as primary. + One and only one business web address must be marked as primary. + + + One and only one work instant messenger address must be marked as primary. + One and only one work instant messenger address must be marked as primary. + + + One and only one home instant messenger address must be marked as primary. + One and only one home instant messenger address must be marked as primary. + + + One and only one business instant messenger address must be marked as primary. + One and only one business instant messenger address must be marked as primary. + + + One and only one work address must be marked as primary. + One and only one work address must be marked as primary. + + + One and only one home address must be marked as primary. + One and only one home address must be marked as primary. + + + One and only one lockbox address must be marked as primary. + One and only one lockbox address must be marked as primary. + + + Subject worker must have exactly one primary home web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work web address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary home email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business email address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary home address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary lockbox address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary lockbox address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary home instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business instant messenger address in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary home phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary home phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary work phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary work phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Subject worker must have exactly one primary business phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + Subject worker must have exactly one primary business phone number in order to submit non-primary entries. The primary contact information may be either previously entered or included within this request + + + Only one Primary Address change is allowed per request. However, the one Primary Address can share both home and work usage types. + Only one Primary Address change is allowed per request. However, the one Primary Address can share both home and work usage types. + + + One and only one business address must be marked as primary. + One and only one business address must be marked as primary. + + + One and only one Institutional email address must be marked as primary. + One and only one Institutional email address must be marked as primary. + + + One and only one Institutional phone must be marked as primary. + One and only one Institutional phone must be marked as primary. + + + One and only one Institutional address must be marked as primary. + One and only one Institutional address must be marked as primary. + + + One and only one Institutional instant messenger address must be marked as primary. + One and only one Institutional instant messenger address must be marked as primary. + + + One and only one Institutional web address must be marked as primary. + One and only one Institutional web address must be marked as primary. + + + + + + + Address information + + + + + Phone Information + + + + + Email Address Information + + + + + Instant Messenger Information + + + + + Web Address Information + + + + + + + Address information + + + Postal Code is not a valid address component for certain countries. + Postal Code is not a valid address component for certain countries. + + + Municipality is not a valid address component for certain countries . + Municipality is not a valid address component for certain countries . + + + Postal Code is required for certain countries. + Postal Code is required for certain countries. + + + Municipality is required for certain countries. + Municipality is required for certain countries. + + + Region Name must be valid for the specified Country. + Region Name must be valid for the specified Country. + + + Usage Type and Use For combination must be valid for Address. + Usage Type and Use For combination must be valid for Address. + + + Second Address Line is required for certain countries. + Second Address Line is required for certain countries. + + + Third Address Line is required for certain countries. + Third Address Line is required for certain countries. + + + Fourth Address Line is required for certain countries. + Fourth Address Line is required for certain countries. + + + Subregion is required for certain countries. + Subregion is required for certain countries. + + + Second Subregion is required for certain countries. + Second Subregion is required for certain countries. + + + Submunicipality (or City Subdivision - Local if configured on Tenant Setup Global) is required for certain countries. + Submunicipality (or City Subdivision - Local if configured on Tenant Setup Global) is required for certain countries. + + + Second Submunicipality is required for certain countries. + Second Submunicipality is required for certain countries. + + + Second Address Line is not a valid address component for certain countries. + Second Address Line is not a valid address component for certain countries. + + + Third Address Line is not a valid address component for certain countries. + Third Address Line is not a valid address component for certain countries. + + + Fourth Address Line is not a valid address component for certain countries. + Fourth Address Line is not a valid address component for certain countries. + + + Subregion is not a valid address component for certain countries. + Subregion is not a valid address component for certain countries. + + + Second Subregion is not a valid address component for certain countries. + Second Subregion is not a valid address component for certain countries. + + + Submunicipality is not a valid address component for certain countries. + Submunicipality is not a valid address component for certain countries. + + + Second Submunicipality is not a valid address component for certain countries. + Second Submunicipality is not a valid address component for certain countries. + + + A maximum of four Submunicipalities are allowed in an address. + A maximum of four Submunicipalities are allowed in an address. + + + A maximum of four Subregions are allowed in an address. + A maximum of four Subregions are allowed in an address. + + + A maximum of four Address Lines are allowed in an address. + A maximum of four Address Lines are allowed in an address. + + + Region is required for certain countries. + Region is required for certain countries. + + + Address Line is required for certain countries. + Address Line is required for certain countries. + + + Home addresses which are not additionally used as work addresses cannot be marked as public. + Home addresses which are not additionally used as work addresses cannot be marked as public. + + + Postal Code must be valid for the Region. + [postal code] is not a valid postal code for [region] + + + Address Line 1 (or Address Line 1 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 1 (or Address Line 1 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 1 is not valid for this Country. + Address Line 1 is not valid for this Country. + + + Address Line 2 (or Address Line 2 - Local if configured on Tenant Setup Global) is Required in this Country. + Address Line 2 (or Address Line 2 - Local if configured on Tenant Setup Global) is Required in this Country. + + + Address Line 2 not Valid for this Country. + Address Line 2 not Valid for this Country. + + + Address Line 3 (or Address Line 3 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 3 (or Address Line 3 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 3 is not Valid for this Country. + Address Line 3 is not Valid for this Country. + + + Address Line 4 (or Address Line 4 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 4 (or Address Line 4 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 4 is not Valid for this Country. + Address Line 4 is not Valid for this Country. + + + Address Line 5 (or Address Line 5 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 5 (or Address Line 5 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 5 is not Valid for this Country. + Address Line 5 is not Valid for this Country. + + + Address Line 6 (or Address Line 6 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 6 (or Address Line 6 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 6 is not Valid for this Country. + Address Line 6 is not Valid for this Country. + + + Address Line 7 (or Address Line 7 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 7 (or Address Line 7 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 7 is not Valid for this Country. + Address Line 7 is not Valid for this Country. + + + Address Line 8 (or Address Line 8 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 8 (or Address Line 8 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 8 is not Valid for this Country. + Address Line 8 is not Valid for this Country. + + + Address Line 9 (or Address Line 9 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 9 (or Address Line 9 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 9 is not Valid for this Country. + Address Line 9 is not Valid for this Country. + + + You cannot specify the same usage type more than once for an address. + You cannot specify the same usage type more than once for an address. + + + Address Line 1 - Local is not valid for this Country. + Address Line 1 - Local is not valid for this Country. + + + Municipality - Local is not a valid address component for certain countries . + Municipality - Local is not a valid address component for certain countries . + + + Address Line 2 - Local is not valid for this Country. + Address Line 2 - Local is not valid for this Country. + + + Address Line 3 - Local is not Valid for this Country. + Address Line 3 - Local is not Valid for this Country. + + + Address Line 9 - Local is not Valid for this Country. + Address Line 9 - Local is not Valid for this Country. + + + Address Line 8 - Local is not Valid for this Country. + Address Line 8 - Local is not Valid for this Country. + + + Address Line 7 - Local is not Valid for this Country. + Address Line 7 - Local is not Valid for this Country. + + + Address Line 6 is not Valid for this Country. + Address Line 6 is not Valid for this Country. + + + Address Line 5 - Local is not Valid for this Country. + Address Line 5 - Local is not Valid for this Country. + + + Address Line 4 - Local is not Valid for this Country. + Address Line 4 - Local is not Valid for this Country. + + + City Subdivision 1 - Local is not a valid address component for certain countries. + City Subdivision 1 - Local is not a valid address component for certain countries. + + + City Subdivision 2 - Local is not a valid address component for certain countries. + City Subdivision 2 - Local is not a valid address component for certain countries. + + + Region Subdivision 1 - Local is not a valid address component for certain countries. + Region Subdivision 1 - Local is not a valid address component for certain countries. + + + Region Subdivision 2 - Local is not a valid address component for certain countries. + Region Subdivision 2 - Local is not a valid address component for certain countries. + + + Region Subdivision 2 is not a valid address component for certain countries. + Region Subdivision 2 is not a valid address component for certain countries. + + + City Subdivision 2 is not a valid address component for certain countries. + City Subdivision 2 is not a valid address component for certain countries. + + + Submunicipality ("City Subdivision 1", or "City Subdivision 1 - Local" if Local Script configured on tenant setup global) is required in this country. + Submunicipality ("City Subdivision 1", or "City Subdivision 1 - Local" if Local Script configured on tenant setup global) is required in this country. + + + Submunicipality (City Subdivision 2 or City Subdivision 2 - Local if Local Scripts configured on Tenant Setup - Global) are required for this Country. + Submunicipality (City Subdivision 2 or City Subdivision 2 - Local if Local Scripts configured on Tenant Setup - Global) are required for this Country. + + + Subregion 1 (or Subregion 1 - Local if Local Scripts configured on Tenant Setup - Global) is required for this country. + Subregion 1 (or Subregion 1 - Local if Local Scripts configured on Tenant Setup - Global) is required for this country. + + + Subregion 2 (or Subregion 2 - Local if Local Scripts configured on Tenant Setup - Global) is required for this country. + Subregion 2 (or Subregion 2 - Local if Local Scripts configured on Tenant Setup - Global) is required for this country. + + + If one local script address field is submitted, all required local script address fields must be submitted. + If one local script address field is submitted, all required local script address fields must be submitted. + + + Address Reference is required when deleting an address + Address Reference is required when deleting an address + + + Usage Data is required unless address is being deleted + Usage Data is required unless address is being deleted + + + Country Reference is required unless address is being deleted + Country Reference is required unless address is being deleted + + + Address deletion is not supported in this web service request + Address deletion is not supported in this web service request + + + If one western script field is submitted, all required western script address fields must be submitted. + If one western script field is submitted, all required western script address fields must be submitted. + + + Address Reference must match an existing (and not deleted) address in use by the worker subject of this request + Address Reference must match an existing (and not deleted) address in use by the worker subject of this request + + + The Address ID field is for updating the value of the Address Reference. It cannot be the same as another existing address. + Address "[ID]" is already in use by another address (possibly on another contactable). Please choose a different Address ID. + + + The Address ID field is for updating the value of the Address Reference. It cannot be the same as another existing address. + Use a unique Address Reference ID for each address. [ID] is already used on another address. + + + You can only update addresses that belong to this customer. + + + You can't use an existing address for a new customer. + + + Existing addresses can't be future dated. Select an effective date that is on or before today, or create a new address with a future date. + + + The Address ID must match the Address Reference. + + + You can't use an existing address for a new customer request. + + + You can't use an existing address for a new prospect. + + + You can only update addresses that belong to this customer request. + + + You can only update addresses that belong to this prospect. + + + Enter a postal code in the valid format: [PostalCodeValidationMessage]. + + + Postal Code is required for [countryWithMustHavePostalCode] + + + One or more addresses are missing a Country City reference. This field is required because the City Prompt localization is active for: [countryref]. + + + You entered this Country City reference: [countrycityref]. To use this Country City reference, you must activate the City Prompt localization for: [countryref]. + Perform either one of these actions: + Activate the City Prompt localization. + Enter a municipality instead of a Country City reference. + + + Enter a Country City reference that is valid for: [countryref]. You entered this Country City reference: [countrycityref]. + + + You must enter a Country City reference instead of a text element because the City Prompt localization is active for: [countryref]. You entered this text element: [cityattrib] [citylocalattrib]. + + + Only Address reference belonging to the Customer tied to the Customer Contact can be shared by the Customer Contact + + + + + + + Country for the address. + + + + + The moment when the address was last modified. + + + + + + City part of the address. + + + + + Country City for the address + + + + + + The region part of the address. Typically this contains the state/province information. + + + + + The region part of the address. Typically this contains the state/province information. + + + + + + The Postal Code part of the address. + + + + + Encapsulating element for all Communication Method Usage data. + + + + + City in local script part of the address. + + + + + The Address Reference ID. + + + + + New ID value used in address updates. The ID cannot already be in use by another address. + + + + + + Returns the formatted address in the format specified for the country. This data is not used for inbound requests and any data provided in this element will be ignored. + + + + + The format type of the address. + + + + + Set to 1 if the address is a defaulted location address. If this value is 1, this address will not be processed for inbound web services. + + + + + Set this flag to true in order to delete the referenced address. If this flag is set, the Reference ID field becomes required, and all other address fields that would otherwise be required will be optional and meaningless. + + + The referenced address is in use as a primary home address and cannot be deleted. + The referenced address is in use as a primary home address and cannot be deleted. + + + + + + + This flag controls whether or not existing non-primary address data will be replaced. A value of true means only the referenced address will be updated, or created if it does not exist or no reference was provided. This behavior is used if the flag is set to true for ANY address in the request. + + + + + Effective Date of Address. + + + + + + Phone Information + + + Invalid Usage Type and Use For combination for Phone. + Invalid Usage Type and Use For combination for Phone. + + + [country code] is not a valid country code for [country iso code] + + + [country iso code] is not a valid country code + + + You cannot specify the same usage type more than once for an address. + + + Element Content 'Phone Number' is required, on internal element 'Phone Information Data' + Element Content 'Phone Number' is required, on internal element 'Phone Information Data' + + + Element Content 'Phone Device Type Reference' is required, on internal element 'Phone Information Data' + Element Content 'Phone Device Type Reference' is required, on internal element 'Phone Information Data' + + + Either 'Country ISO Code' or 'International Phone Code' must be included on internal element 'Phone Information Data' + Either 'Country ISO Code' or 'International Phone Code' must be included on internal element 'Phone Information Data' + + + + + + + Country ISO code. If the Country ISO code is specified, then this ISO code will be used to determine the Country Phone Code f or the phone. Pass this ISO code to distinguish between multiple countries sharing the same Country Phone Code. (For example, Country Phone Code '1' is shared by USA, Canada, Dominican Republic, Bermuda, Jamaica and Puerto Rico) + + + + + + + + + + International Phone Code Number + + + + + Area Code Number + + + Enter an area code in the valid format: [AreaCodeValidationMessage] + + + + + + + Phone Number + + + Enter a phone number in the valid format: [PhoneValidationMessage]. + + + + + + + Phone Extension + + + + + Reference ID for Phone Device Type. + + + + + Encapsulating element for all Communication Method Usage data. + + + + + + The formatted Phone number. This data is not used in inbound requests. Any data provided for this attribute will be ignored. + + + + + + Email Address Information + + + Invalid Usage Type and Use For combination for Email Address. + Invalid Usage Type and Use For combination for Email Address. + + + You cannot specify the same usage type more than once for an address. + + + + + + + Email Address Information + + + Email addresses must be in the format of 'xxx@yy.com'. Valid examples: john.doe@aol.com, jane@aol.com. + + + + + + + Email Comments. + + + + + Encapsulating element for all Communication Method Usage data. + + + + + + + Instant Messenger Address. + + + Invalid Usage Type and Use For combination for Instant Messenger Address. + Invalid Usage Type and Use For combination for Instant Messenger Address. + + + You cannot specify the same usage type more than once for an address. + + + + + + + Instant Messenger Address. + + + + + Reference ID for the Instant Messenger Type. + + + You must provide an Instant Messenger Type. + + + + + + + Instant Messenger Comment. + + + + + Encapsulating element for all Communication Method Usage data. + + + + + + + Web Address Information + + + Invalid Usage Type and Use For combination for Web Address. + Invalid Usage Type and Use For combination for Web Address. + + + Invalid HTTP address entered. HTTP addresses must be in one of the following formats: + - http://... + - https://... + + + You cannot specify the same usage type more than once for an address. + + + + + + + Web Address (e.g. URL). + + + + + Web Address Comment. + + + + + Encapsulating element for all Communication Method Usage data. + + + + + + + The address line for the address. This typically contains Street name, street number, apartment, suite number. + + + A value is required on internal element 'Address Line Data'. If you do not want to set a value for a non-required type such as ADDRESS_LINE_2, remove it completely from the web service request. + A value is required on internal element 'Address Line Data'. If you do not want to set a value for a non-required type such as ADDRESS_LINE_2, remove it completely from the web service request. + + + + + + + + The Descriptor is an optional serialized attribute that shows the text Override Label (such as Apartment Number or Building Number) that helps describe the usage of the Type (such as ADDRESS_LINE_5 and ADDRESS_LINE_6) for each Country. + + + + + Enter the Address Line Type, such as ADDRESS_LINE_1, or ADDRESS_LINE_2. + + + + + + + + The submunicipality of the address. + + + + + + The Descriptor is an optional serialized attribute that shows the text Override Label (such as Municipality or District) that helps describe the usage of the Type (such as CITY_SUBDIVISION_1 or CITY_SUBDIVISION_2) for each Country. + + + + + The city subdivision part of the address. + + + + + + + + The subregion part of the address. + + + + + + The Descriptor is an optional serialized attribute that shows the text Override Label (such as Municipality or District) that helps describe the usage of the Type (such as REGION_SUBDIVISION_1 or REGION_SUBDIVISION_2) for each Country. + + + + + Enter the Region Subdivision Type, such as REGION_SUBDIVISION_1, or REGION_SUBDIVISION_2. + + + + + + + + Encapsulating element for all Communication Method Usage data. + + + + + Encapsulation element for the Communication Usage Type. + + + + + Reference ID for Communication Usage Behavior. + + + Please provide usages that are Workday Owned or Tenanted - not both. + + + + + + + Reference ID for Communication Usage Behavior Tenanted. + + + Please provide usages that are Workday Owned or Tenanted - not both. + + + + + + + Description of the address, phone, email, instant messenger or web address + + + + + + Indicates if the address is public. + + + + + + Encapsulation element for the Communication Usage Type. + + + + + Reference ID for the Communication Usage Type. + + + + + + Indicates if the communication method is Primary. + + + + + + Wrapper element for all National Identifier Data. + + + National Identifier [identifier] with workday id [workday id] is not a valid national identifier for the person. + + + The National ID referenced by [national identifier reference] does not belong to [worker]. + + + If the ID is marked for deletion, a National Identifier Shared Reference ID or National Identifier WID should be included. + + + The National Identifier Shared Reference should be used with the Change Government IDs web service. + + + The National Identifier Shared Reference should be used with the Change Government IDs web service. + + + National Identifier with reference [nir] is marked for deletion. National ID Data should not be included. + + + If the ID is not marked for deletion, ID data should be included. + + + + + + + The Reference ID for the National Identifier. + + + + + Wrapper element for the National Identifier Data + + + + + Shared reference ID for National Identifiers. + + + + + + If Delete is set to True and Replay All has been set to False, the ID will be deleted once the web service is submitted. + + + + + + Encapsulating element for all Government Identifier data. + + + Government Identifier [identifier] with workday id [workday id] is not a valid government identifier for the person. + + + The Government ID referenced by [government identifier reference] does not belong to [worker]. + + + The Government Identifier Shared Reference should be used with the Change Government IDs web service. + + + The Government Identifier Shared Reference should be used with the Change Government IDs web service. + + + Government Identifier with reference [gir] is marked for deletion. Government ID Data should not be included. + + + If the ID is not marked for deletion, ID data should be included. + + + If the ID is marked for deletion, a Government Identifier Shared Reference ID or Government Identifier WID should be included + + + + + + + The Reference Id for the Government Identifier + + + + + Wrapper element for Government Identifier Data + + + + + Shared reference ID for Government Identifiers. + + + + + + If Delete is set to True and Replay All has been set to False, the ID will be deleted once the web service is submitted. + + + + + + Encapsulating element for all Visa Identifier data. + + + Visa Identifier [identifier] with workday id [workday id] is not a valid visa identifier for the person. + + + The Visa Identifier Reference should be used with the Change Passports and Visas web service. + + + The Visa Identifier Reference should be used with the Change Passports and Visas web service. + + + The Visa ID referenced by [visa identifier reference] does not belong to [worker]. + + + If the ID is marked for deletion, a Visa Identifier Shared Reference ID should be included. + + + Visa Identifier with reference [vir] is marked for deletion. Visa ID Data should not be included. + + + If the ID is not marked for deletion, ID data should be included. + + + + + + + Reference Id for the Visa Identifier. + + + + + Wrapper element for the Visa Identifier Data + + + + + Shared reference ID for Visa Identifiers. + + + + + + If Delete is set to True and Replay All has been set to False, the ID will be deleted once the web service is submitted. + + + + + + Encapsulating element for all Passport Identifier data. + + + Passport Identifier [identifier] with workday id [workday id] is not a valid passport identifier for the person. + + + The Passport Identifier Shared Reference should be used with the Change Passports and Visas web service. + + + The Passport Identifier Shared Reference should be used with the Change Passports and Visas web service. + + + The Passport ID referenced by [passport identifier reference] does not belong to [worker]. + + + If the ID is marked for deletion, a Passport Identifier Shared Reference ID should be included. + + + Passport Identifier with reference [pir] is marked for deletion. Passport ID Data should not be included. + + + If the ID is not marked for deletion, ID data should be included. + + + + + + + Reference ID for the Passport Identifier. + + + + + Wrapper element for the Passport Identifier Data. + + + + + Shared reference ID for Passport Identifiers. + + + + + + If Delete is set to True and Replay All has been set to False, the ID will be deleted once the web service is submitted. + + + + + + Encapsulating element for all License Identifier data. + + + License Identifier [identifier] with workday id [workday id] is not a valid license identifier for the person. + + + The License Identifier Shared Reference should be used with the Change License web service. + + + The License Identifier Shared Reference should be used with the Change License web service. + + + If the ID is marked for deletion, a License Identifier Shared Reference ID should be included. + + + The License referenced by [license identifier reference] does not belong to [worker]. + + + License Identifier with reference [lir] is marked for deletion. License ID Data should not be included. + + + If the ID is not marked for deletion, ID data should be included. + + + + + + + Reference ID for the License Identifier. + + + + + Wrapper element for the License Identifier data. + + + + + Shared reference ID for License Identifiers. + + + + + + If Delete is set to True and Replay All has been set to False, the ID will be deleted once the web service is submitted. + + + + + + Encapsulating element for all Custom Identifier data. + + + Custom Identifier [identifier] with workday id [workday id] is not a valid custom identifier for the person. + + + The Custom ID referenced by [custom identifier reference] does not belong to [worker]. + + + The Custom Identifier Shared Reference should be used with the Change Other IDs web service. + + + The Custom Identifier Shared Reference should be used with the Change Other IDs web service. + + + Custom Identifier with reference [cir] is marked for deletion. Custom ID Data should not be included. + + + If the ID is not marked for deletion, ID data should be included. + + + + + + + Reference ID for Custom Identifier + + + + + Wrapper element for Custom Identifier data. + + + + + Shared reference ID for Custom Identifiers. + + + + + + If Delete is set to True and Replay All has been set to False, the ID will be deleted once the web service is submitted. + + + + + + Wrapper for National Identifier Data. + + + If the Identifier ID is for a National ID Type, then formatting characters must not be included. + The Identifier ID does not match the format required for the National ID Type. The Identifier ID should not contain any formatting characters. + + + National Id Type is not valid for the Country specified. + National Id Type is not valid for the Country specified. + + + If the National ID Type specified by the ID Type tracks Series, then Series is required. + The ID Type ([IDType]) requires Series to also be specified. + + + + + + + National Identifier ID + + + Identifier ID is Required + + + + + + + National Identifier Type + + + National ID Type required. + + + + + + + Country issuing national Identifier + + + Country is required. + + + + + + + Date the national identifier was issued + + + Enter an Issue date that is on or before the expiration date: [exp date]. + + + + + + + Expiration date of the national identifier + + + + + Date the national identifier was verified + + + + + Series is used in a select group of countries + + + The ID Type ([IDType]) does not allow Series to be specified. + + + + + + + Issuing Agency is used in a select group of countries + + + The ID Type ([IDType]) does not allow Issuing Agency to be specified. + + + + + + + Worker who verified the ID + + + Select a different worker in the Verified By field. The worker you entered was terminated before the Verification Date: [date]. + + + + + + + + + Wrapper element for Visa identifier data. + + + + + Visa Identifier. + + + Identifier ID is Required + + + + + + + Visa Identifier Type. + + + Visa ID Type required. + + + [vit] does not match the specified country, [country] + + + + + + + Country issuing the visa identifier. + + + Country is required. + + + + + + + Date the visa identifier was issued. + + + Enter an Issue date that is on or before the expiration date: [exp date]. + + + + + + + Expiration date of the visa identifier. + + + + + Verification date of the visa identifier. + + + + + Worker who verified the ID + + + Select a different worker in the Verified By field. The worker you entered was terminated before the Verification Date: [date]. + + + + + + + + + Wrapper for the Government Identifier Data. + + + + + Government ID + + + Identifier ID is Required + + + + + + + Government ID Type. + + + Government ID Type required. + + + [git] does not match the specified country, [country] + + + + + + + Country issuing the government Identifier. + + + Country is required. + + + + + + + Date the government identifier was issued. + + + Enter an Issue date that is on or before the expiration date: [exp date]. + + + + + + + Expiration date of the government identifier. + + + + + Date the government identifier was verified. + + + + + Worker who verified the ID + + + Select a different worker in the Verified By field. The worker you entered was terminated before the Verification Date: [date]. + + + + + + + + + Wrapper for Passport Identifier data. + + + + + Passport Identifier. + + + Identifier ID is Required + + + + + + + Passport Identifier Type. + + + Passport ID Type required. + + + [pit] does not match the specified country, [country] + + + + + + + Country issuing the passport identifier. + + + Country is required. + + + + + + + Date the passport identifier was issued. + + + Enter an Issue date that is on or before the expiration date: [exp date]. + + + + + + + Expiration date of the passport identifier. + + + + + Veritification date of the passport identifier. + + + + + Worker who verified the ID + + + Select a different worker in the Verified By field. The worker you entered was terminated before the Verification Date: [date]. + + + + + + + + + Wrapper for License Identifier Data. + + + In order to specify an issuing body for the license, only one of Country Reference, Country Region Reference, or Authority Reference is allowed. + Only one of Country Reference, Country Region Reference, or Authority Reference is allowed. + + + + + + + License Identifier. + + + Identifier ID is Required + + + + + + + License Identifier Type. + + + License ID Type required. + + + + + + + Country issuing the license identifier. No more than one of of Country Reference, Country Region Reference, or Authority Reference can be specified. + + + + + Country Region issuing the license identifier. No more than one of of Country Reference, Country Region Reference, or Authority Reference can be specified. + + + + + Country Region issuing the license identifier. No more than one of of Country Reference, Country Region Reference, or Authority Reference can be specified. + + + + + Authority issuing the license identifier. No more than one of of Country Reference, Country Region Reference, or Authority Reference can be specified. + + + + + License Class + + + + + Date the license identifier was issued. + + + Enter an Issue date that is on or before the expiration date: [exp date]. + + + + + + + Expiration date of the license identifier. + + + + + Verification date of the license identifier. + + + + + Worker who verified the ID + + + Select a different worker in the Verified By field. The worker you entered was terminated before the Verification Date: [date]. + + + + + + + + + Wrapper for Custom Identifier Data. + + + + + Custom Identifier. + + + Identifier ID required. Custom ID Type specified does not have a sequence generator. + + + + + + + Custom identifier Type. + + + Custom ID Type is required. + + + + + + + Date the custom identifier was issued. + + + Enter an Issue date that is on or before the expiration date: [exp date]. + + + + + + + Expiration date of the custom identifier. + + + + + Organization issuing the custom Identifier. + + Organization_Reference_ID + + + + + + Description of the custom identifier. + + + + + + + Wrapper element for the Accomplishment data. + + + That Skill is already in use by another person. Select another one or leave it blank. + + + + + + + Reference ID for the Accomplishment Profile. + + + + + Wrapper element for the Accomplishment data. + + + + + + + Wrapper element for Job History information. + + + + + Reference to the Job History profile. + + + + + Wrapper element for Job History Data. + + + + + + + Wrapper element for Certification information. + + + + + The reference to the certification profile. + + + + + Wrapper element for Certification data. + + + + + + + Wrapper element for Training information. + + + + + Reference to the Training information. + + + + + Wrapper element for Training information. + + + + + + + Wrapper element for Award information. + + + That Award is already in use by a different person. Use a different one or leave the field blank. + + + + + + + Reference to the Award Profile. + + + + + Wrapper element for Award information. + + + + + + + Wrapper element for the Organization Professional Affiliation information. + + + + + Reference to the membership profile. + + + + + Wrapper element for the Organization Professional Affiliation information. + + + + + + + Wrapper element for the Accomplishment data. + + + Only one change can be in progress (the event in progress and not complete or canceled) for an accomplishment for a particular worker. + There is an in progress event for this worker for the accomplishment: [accomplishment]. Only one in progress event is allowed. + + + + + + + Accomplishment ID. If no value is provided, a new accomplishment will be created. If a value is passed in an a corresponding accomplishment is not found, a new accomplishment will be created with the provided id. + + + + + Used for inbound operations to indicate that the accomplishment should be removed for the person. Will always return false for outbound operations. + + + Accomplishment Removed is true without an Accomplishment or valid Accomplishment ID. An Accomplishment or valid Accomplishment ID must be specified in order to remove the Accomplishment. + + + + + + + Details about the accomplishment. Required unless the accomplishment is being removed. + + + Accomplishment Description must be specified unless the accomplishment is being removed. + + + + + + + Start date of the accomplishment. Required unless the accomplishment is being removed. + + + Start Date must be specified unless the accomplishment is being removed. + + + + + + + Completion date of the accomplishment. + + + + + Reference ID of the position when the accomplishment was achieved. + + + Position is not valid for this Worker as of the effective date. + Worker: [worker] + Position: [position] + Date: [date] + + + Position submitted is not filled as of the effective date. + + + + + + + + + Wrapper element for the job history information. + + + Only one change can be in progress (the event in progress and not complete or canceled) for a job history for a particular worker. + There is an in progress event for this worker for the Job History: [job]. Only one in progress event is allowed. + + + Either the Company or a Job History Company Reference must be specified, unless the Job History is being removed. + + + Either a Company name or Job History Company reference must be specified, but not both. + + + + + + + External Employment ID. If no value is provided, a new external employment will be created. If a value is passed in an a corresponding external employment is not found, a new external employment will be created with the provided id. + + + + + Used for inbound operations to indicate that the Job History should be removed for the person. Will always return false for outbound operations. + + + Remove Job History is true without a Job History or valid External Employment ID. A Job History or valid External Employment ID must be specified in order to remove the Job History. + + + + + + + The Business Title for the job. Required unless the Job History is being removed. + + + Job Title must be specified unless the Job History is being removed. + + + + + + + The name of the company. Either this field or Job History Company Reference is required unless the Job History is being removed. + + + + + A reference to an existing Job History Company. Either this field or Company is required unless the Job History is being removed. + + + + + The start date of employment. Required unless the Job History is being removed. + + + Start Date must be specified unless the Job History is being removed. + + + + + + + The end date of employment. + + + + + Description of responsibilities and achievements during the tenure of the job. + + + + + The location of the job. + + + + + References from colleagues, subordinates,managers, associates during the job tenure. + + + + + Contact information for the job. + + + + + + + Wrapper element for Competency Data. + + + + + Statement about the Competency. + + + + + Statement about the Competency. + + + + + Comments about the competency assessment. + + + + + Date the competency assessment was carried out. + + + + + Worker carrying out the competency assessment. + + + + + Worker carrying out the competency assessment. + + + + + Reference for the Competency. + + + + + Reference for the Competency. + + + + + + + Wrapper element for Certification information. + + + As of v13, certification name and issuer are no longer required. You may submit a certification reference or a name and issuer. + You must either submit a Certification Reference or a Certification Name and Issuer. + + + Only one change can be in progress (the event in progress and not complete or canceled) for a certification for a particular worker. + There is an in progress event for this worker for the certification: [cert]. Only one in progress event is allowed. + + + Exam Date must be less than or equal to Issued Date. + Exam Date must be less than or equal to Issued Date. + + + Expiration Date may not be prior to Issued Date. + Expiration Date may not be prior to Issued Date. + + + Issued Date must be less than or equal to today's date. + Issued Date must be less than or equal to today's date. + + + Exam Date must be less than Expiration Date. + Exam Date must be less than Expiration Date. + + + You must first select Enable Specialties for Certifications on the Maintain Skills and Experience Setup task. + + + Checks that there are either no duplicates, or the only duplicate returned is this instance (an edit is happening) + This certification is already in use. + + + + + + + Certification ID. If no value is provided, a new certification will be created. If a value is passed in and a corresponding certification is not found, a new certification will be created with the provided id. + + + + + Used for inbound operations to indicate that the certification should be removed for the person. Will always return false for outbound operations. + + + Remove Certification is true without a Certification Skill or valid Certification ID. A Certification or valid Certification ID must be specified in order to remove the Certification. + + + + + + + Wrapper element for the Certification Reference, i.e. from the list of pre-defined certifications. + + + + + The country in which the certification is used. + + + + + The name of the Certification. + + + + + The authority issuing the certification. + + + + + Certification Number for the Certification. + + + + + The date the certification was issued. + + + + + The date of expiration of the certification. + + + + + The person's score on the certification examination. + + + + + The date the certification examination was taken. + + + + + This data contains information about any specialties and subspecialties associated with the certification achievement. + + + + + Worker Document Data is only used for worker certifications. Do not use this for applicants. + + + + + + + Wrapper element for Training information. + + + Only one change can be in progress (the event in progress and not complete or canceled) for a training for a particular worker. + There is an in progress event for this worker for the training: [training]. Only one in progress event is allowed. + + + Training Type is required and must have a value. + + + + + + + Training ID. If no value is provided, a new training will be created. If a value is passed in and a corresponding training is not found, a new training will be created with the provided id. + + + + + Used for inbound operations to indicate that the training should be removed for the person. Will always return false for outbound operations. + + + Remove Training is true without an Training or valid Training ID. An Training or valid Training ID must be specified in order to remove the Training. + + + + + + + The Name of the Training. Required unless the training is being removed. + + + Training must be specified unless the training is being removed. + + + + + + + Description of the training. + + + + + Reference to the Training Type (Example: Instructor-led, Online) + + + + + The date of completion of the training. + + + + + The length of the course in days. + + + + + + + Wrapper element for Award information. + + + Only one change can be in progress (the event in progress and not complete or canceled) for an award for a particular worker. + There is an in progress event for this worker for the award: [award]. Only one in progress event is allowed. + + + + + + + Award ID. If no value is provided, a new award will be created. If a value is passed in and a corresponding award is not found, a new award will be created with the provided id. + + + + + Used for inbound operations to indicate that the award should be removed for the person. Will always return false for outbound operations. + + + Remove Award is true without an Award or valid Award ID. An Award or valid Award ID must be specified in order to remove the Award. + + + + + + + The name of the award. Required unless the award is being removed. + + + Award Name must be specified unless the award is being removed. + + + + + + + The authority granting the award. Required unless the award is being removed. + + + Awarding Body must be specified unless the award is being removed. + + + + + + + The description of the award. + + + + + The date the award was received. Required unless the award is being removed. + + + Date Received is required unless the award is being removed. + + + + + + + + + Wrapper element for the Organization Professional Affiliation information. + + + Only one change can be in progress (the event in progress and not complete or canceled) for a membership for a particular worker. + There is an in progress event for this worker for the membership: [membership]. Only one in progress event is allowed. + + + End Date must be greater than Start Date + + + XORs Relationship Type Reference and Affiliation because exactly one of the two must be specified. + Specify either the Professional Affiliation Relationship Type Reference or the Affiliation. + + + XORs Affiliation Reference and Membership Org because exactly one of the two must be specified. + Specify either the Professional Affiliation Reference or the Professional Affiliation. + + + Not XORs Membership Org text field and Professional Affiliation Type Reference. Ensures that If text is specified, an ad hoc Professional Affiliation is being specified. + Remove the Professional Affiliation Type for this Professional Affiliation Reference. + + + You can't load inactive professional affiliations. + + + You can't select Company or School as the Professional Affiliation Type for ad hoc professional affiliations. + + + + + + + Membership ID. If no value is provided, a new membership will be created. If a value is passed in an a corresponding membership is not found, a new membership will be created with the provided id. + + + + + Used for inbound operations to indicate that the membership should be removed for the person. Will always return false for outbound operations. + + + Remove Membership is true without an Membership or valid Membership ID. An Membership or valid Membership ID must be specified in order to remove the Membership. + + + + + + + The Professional Affiliation that this achievement is representing a relationship with. + + + + + The name of the organization the person is member of. Required unless the membership is being removed. + + + Membership must be specified unless the membership is being removed. + + + + + + + The type of Professional Affiliation. + + + + + Any organization that the membership is affiliated to. + + + + + The Relationship that this Person has to this Organization. + + + + + The date when the membership was started. + + + + + The date when the membership was ended. + + + + + + + Wrapper element for the work experience. + + + + + The reference to the work experience. + + + There is an in progress event for this worker for the work experience: [experience]. Only one in progress event is allowed. + + + + + + + Used for inbound operations to indicate that the work experience should be removed for the person. Will always return false for outbound operations. + + + + + The reference to the work experience rating. + + + + + Comments about the work experience. + + + + + + + Data element containing the compensation guidelines for a compensation change. + + + Compensation grade profile is not valid for the compensation grade. + Compensation grade profile is not valid for the compensation grade. + + + Compensation step is not valid for the compensation grade profile. + Compensation step is not valid for the compensation grade profile. + + + Compensation Grade is required. + Compensation Grade is required. + + + Compensation step is not valid for the compensation grade. + Compensation step is not valid for the compensation grade. + + + Compensation package is required. + Compensation package is required. + + + + + + + Reference element representing a unique instance of Compensation Package. + + + + + Reference element representing a unique instance of Compensation Grade. + + + + + Reference element representing a unique instance of Compensation Grade Profile. + + + + + Reference element representing a unique instance of Compensation Step. + + + + + Start date for the Compensation Step. + + + + + + + Contains the latest completed performance review for the employee. + + + + + Contains a reference to latest completed performance review for the employee. + + + + + Contains the information about the performance review for the employee. + + + + + + + Contains the information about the review for the employee. + + + + + The manager for this review. + + + + + Manager(s) for this review. + + + + + The type of review. + + + + + The review template that was used as a basis for the review. + + + + + The date the review was started (i.e. first created). + + + + + The date the review period began. + + + + + The date the review period ended. + + + + + Contains the evaluation information that was filled out by the employee. + + + + + Contains the evaluation information that was filled out by the manager. + + + + + + + Contains the evaluation information that was filled out by the employee. + + + + + The overall section evaluation information (rating, comments) from the employee. + + + + + + + The overall section evaluation information (rating, comments) for the evaluator. + + + + + The overall rating assigned to the review. + + + + + The overall comment assigned to the review. + + + + + + + Contains the evaluation information that was filled out by the manager. + + + + + The overall section evaluation information (rating, comments) from the manager. + + + + + + + Container for military service data for the Change Personal Information business process. + + + The Military Rank specified is not valid for Military Service Type or Country from Military Status. + The Military Rank specified is not valid for Military Service Type or Country from Military Status. + + + The Military Service Type specified is not valid for Country from Military Status. + The Military Service Type specified is not valid for Country from Military Status. + + + You can't assign a Military Status to a worker when their Hire Date is before the Effective Date of the Location + You can't assign a Military Status to a worker when their Hire Date is before the Effective Date of the Location + + + + + + + Reference for the person's military status. + + + Inactive military statuses are not allowed in this request. + Inactive military statuses are not allowed in this request. + + + + + + + Date the person was discharged from the military. + + + Military Discharge Date must be greater than Date of Birth. + Military Discharge Date must be greater than Date of Birth. + + + + + + + Begin Date for military service status + + + Military Status Begin Date must be after Date of Birth. + Military Status Begin Date must be after Date of Birth. + + + + + + + Service type for military service + + + + + Military rank for military service type + + + + + Notes for military service + + + + + + + Container for the data changed in the Change Personal Information business process. + + + The country of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + The country of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + The ethnicity does not exist in the specified Location Context. The Location Context is derived from the Country of the Location of the Position + The ethnicity does not exist in the specified Location Context. The Location Context is derived from the Country of the Location of the Position + + + The religion is not valid for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The religion is not valid for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The marital status does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. + The marital status does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. + + + The country region of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The country region of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The hukou region is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The hukou region is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The hukou subregion is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The hukou subregion is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The hukou locality is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The hukou locality is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The hukou type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The hukou type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The native region is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The native region is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The Personnel File Agency is not tracked for the specified Location Context. + The Personnel File Agency is not tracked for the specified Location Context. + + + The Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The Citizenship Status is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The Citizenship Status is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The hukou postal code is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The hukou postal code is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The political affiliation does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Political Affiliation values are ignored for Puts involving applicants since a Political Affiliation value is associated with workers and not applicants. + The political affiliation does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Political Affiliation values are ignored for Puts involving applicants since a Political Affiliation value is associated with workers and not applicants. + + + Invalid Date of Death. It must be between today's date and the worker's hire date. + Invalid Date of Death. It must be between today's date and the worker's hire date. + + + Medical exam history is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + Medical exam history is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + The city of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + The city of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + Last Medical Exam Valid To Date must be after Last Medical Exam Date + Last Medical Exam Valid To Date must be after Last Medical Exam Date + + + The field Marital Status is required and must have a value if a Marital Status Date is entered. + The field Marital Status is required and must have a value if a Marital Status Date is entered. + + + Hispanic or Latino is only tracked in the USA and must be enabled in tenant setup by your administrator. + Hispanic or Latino is only tracked in the USA and must be enabled in tenant setup by your administrator. + + + Multiple Ethnicities are not allowed for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + Multiple Ethnicities are not allowed for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + At least one citizenship status in this request is inactive. Only active statuses are allowed. + At least one citizenship status in this request is inactive. Only active statuses are allowed. + + + At least one ethnicity in this request is inactive. Only active ethnicities are allowed. + At least one ethnicity in this request is inactive. Only active ethnicities are allowed. + + + Inactive marital statuses are not allowed in this request. + Inactive marital statuses are not allowed in this request. + + + Date of death is only allowed for terminated workers. + Date of death is only allowed for terminated workers. + + + Hukou can only be entered for citizens of China. + Hukou can only be entered for citizens of China. + + + The Hukou Subregion specified is not valid for the Location Context. The Location Context is derived from the Country of the Location for the Position. + The Hukou Subregion specified is not valid for the Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The social benefits locality data has not been activated for this location via the Maintain Localization Settings task. + The social benefits locality data has not been activated for this location via the Maintain Localization Settings task. + + + The social benefits locality does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Social Benefits Locality values are ignored for Puts involving applicants since a Social Benefits Locality value is associated with workers and not applicants. + The social benefits locality does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Social Benefits Locality values are ignored for Puts involving applicants since a Social Benefits Locality value is associated with workers and not applicants. + + + LGBT Identification is not valid for this country + LGBT Identification is not valid for this country + + + A Worker cannot have a Birth Region without a corresponding Birth Country. + A Worker cannot have a Birth Region without a corresponding Birth Country. + + + The Hukou Subregion does not exist within the specified Hukou Region or is inactive. + The Hukou Subregion does not exist within the specified Hukou Region or is inactive. + + + The Additional Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The Additional Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + The visual ethnicity does not exist in the specified Location Context. The Location Context is derived from the Country of the Location of the Position + The visual ethnicity does not exist in the specified Location Context. The Location Context is derived from the Country of the Location of the Position + + + Multiple Visual Ethnicities are not allowed for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + Multiple Visual Ethnicities are not allowed for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + At least one visual ethnicity in this request is inactive. Only active ethnicities are allowed. + At least one visual ethnicity in this request is inactive. Only active ethnicities are allowed. + + + Hispanic or Latino for Visual Survey is only tracked in the USA and must be enabled in tenant setup by your administrator. + Hispanic or Latino for Visual Survey is only tracked in the USA and must be enabled in tenant setup by your administrator. + + + You can't enter a value for Contingent Workers for the Visual Survey Ethnicity Reference or the Hispanic or Latino for Visual Survey element. + You can't enter a value for Contingent Workers for the Visual Survey Ethnicity Reference or the Hispanic or Latino for Visual Survey element. + + + + + + + Person's date of birth. + + + Date of birth must precede marital status date, medical exam dates and date of death. This applies to the data in this request as well any existing data on the worker that is not being modified. + Date of birth must precede marital status date, medical exam dates and date of death. This applies to the data in this request as well any existing data on the worker that is not being modified. + + + Date of birth must precede all military discharge dates currently on the worker unless all military service data is being replaced. + Date of birth must precede all military discharge dates currently on the worker unless all military service data is being replaced. + + + Date of birth must precede all disability status dates currently on the worker unless all disability data is being replaced. + Date of birth must precede all disability status dates currently on the worker unless all disability data is being replaced. + + + + + + + Country where the person was born. + + + + + Country region where the person was born. + + + The Region of Birth entered is not valid for the corresponding Country of Birth. + The Region of Birth entered is not valid for the corresponding Country of Birth. + + + + + + + Reference to the Gender of the person. + + + + + + Reference for the person's marital status. + + + + + Reference for the person's citizenship status. + + + + + Reference for the person's Country of Nationality + + + + + List of additional nationalities for the person. The list is a list of Countries. + + + Please select a primary nationality or remove the additional nationality. + Please select a primary nationality or remove the additional nationality. + + + Please select different primary and additional nationalities. + Please select different primary and additional nationalities. + + + + + + + Reference for the person's ethnicities. + + + + + Boolean to indicate if a person is hispanic or latino. + + + + + Reference to Person's Visual Survey Ethnicities + + + + + Boolean Reference to Person's Visual Survey for Hispanic or Latino + + + + + Reference for a person's religions. + + + + + Country Region on the Hukou of the person. + + + Hukou Region must be in China. + Hukou Region must be in China. + + + + + + + Country Subregion on the Hukou of the person. + + + + + Locality on the Hukou of the person. + + + + + Hukou Postal Code for the Person + + + + + Hukou Type on the Hukou of the person. + + + + + Native Region on the Hukou of the person. + + + + + Personnel File Agency is used in China to indicate where workers have their personnel file stored. + + + + + + Person's political affiliation. + + + + + Person's date of death. + + + + + Person's city of birth. + + + + + Person's marital status date. + + + + + Date of person's most recent medical examination. + + + Last Medical Exam Date cannot be in the future + Last Medical Exam Date cannot be in the future + + + + + + + Expiration date of person's most recent medical examination. + + + + + Notes for the person's most recent medical examination. + + + + + Person's tobacco usage. Note that starting from W22 this field will no longer be used for update. To update a person's tobacco use, use the Put Worker Wellness Data web service. + + + + + Person's Social Benefits Locality. + + + + + Person's LGBT Identification + + + + + + + + Wrapper element for documents associated with a worker. + + + + + The reference to the worker document. + + + + + The information about the worker document, such as the category and file. + + + + + + + Wrapper element for the details of a worker document. + + + + + The category that the worker document is for. + + + + + The name of the worker document file. + + + + + + + + + + A comment about the worker document. + + + + + The document that was attached for the worker. + + + + + + + Contains the latest completed performance improvement plan for the employee. + + + + + Contains a reference to latest completed performance improvement plan for the employee. + + + + + Contains the information about the performance improvement plan for the employee. + + + + + + + Contains the latest completed disciplinary action for the employee. + + + + + Contains a reference to latest completed disciplinary action for the employee. + + + + + The reason why the disciplinary action was taken. + + + + + The prior disciplinary action(s) that this is related to. + + + + + Contains the information about the disciplinary action for the employee. + + + + + + + Contains the latest completed development plan for the employee. + + + + + Contains a reference to latest completed development plan for the employee. + + + + + Contains the information about the development plan for the employee. + + + + + + + Encapsulating element containg all Payroll Interface Processing data. + + + + + Reference to the position. + + + + + An unique identifier for the Headcount Group that the Position belongs to. This will return a value only if the Position belongs to a headcount. Any value put in this field for inbound web services will be ignored. + + + + + Text attribute identifying Position ID. + + + + + Text attribute identifying Position Title. + + + + + Business title for the position. + + + + + Date the Worker first started work in this Position. Will be the same value as the Hire Date in the Worker Status Section for the Primary Position. + + + + + Expected end of employment for this position. Will be the same value as the End Employment Date in the Worker Status Section for the Primary Position. + + + + + Termination/End Additional Job Reason + + + + + The worker type for the position. + + + + + Reference to the position time type. + + + + + Boolean attribute identifying whether Position is Exempt. + + + + + Scheduled Weekly Hours for Position. + + + + + + + + + + + Standard Weekly Hours for Position. + + + + + + + + + + + + Working Time Frequency values are set in the Maintain Frequencies Task + + + + + Working Time Unit can either be hours or days + + + + + Working Time Value is the numeric value for working time + + + + + + + + + + + + Full Time Equivalent Percentage for Position. + + + + + + + + + + + + If this flag is marked yes, the position will be excluded from headcount reporting. + + + + + Reference to the pay rate type for the position. + + + + + + Reference to a company insider type. + + + + + Reference to the work shift for the position. + + + + + The work hour profile(s) for the position. + + + + + The employee's company Federal Employer Identification Number. + + + + + The worker's compensation code for this position - based on the location and job profile. + + + + + + Contains the job profile for the position. + + + + + Encapsulating element containing a brief summary of Location data. + + + + + Encapsulating element containg all Payroll Interface Processing data. + + + + + Numeric value for number of equivalent regular paid hours for the work hours profile. + + + + + + + + + + + + The Worker Hours Profile Classification. + + + + + + + + + + + The work space (worker's physical location) for the position. + + + + + Wrapper element that contains position's academic pay setup information if it is configured. + + + + + The effective date of the end employment business process + + + + + The pay through date for the end of employment + + + + + Encapsulating element containing all Collective Agreement data. Including Corrected data. + + + + + Encapsulating element containing all Probation Period data. + + + + + Return the worker's new manager(s) during the most recent manager change event detected by manager compare background process. The background process may detect manager changes at a later time then when the manager change actually occurred. This field only applies for the primary job of the worker. + + + + + + Effective Date for Position. + + + + + + Encapsulating element containing a brief summary of Location data. + + + + + A reference to a location. + + + + + The name of the location. + + + + + The type(s) of a location. + + + + + The locale for the location. + + + + + The default user language for this location. + + + + + The time profile for the location. + + + + + The scheduled weekly hours from the location's time profile. + + + + + + + + + + + Address information + + + + + + + Encapsulating element containg all Payroll Interface Processing data. + + + + + Effective Date for Payroll Interface Processing. + + + + + Reference to the pay rate type for the position. + + + + + Reference to a Frequency. + + + + + The external pay group for the position. + + + + + The external payroll entity for the position. + + + + + A unique identifier for the external employee type. + + + + + The external payroll file number for the position. + + + + + + + Encapsulating element containing all Status data for a Worker. + + + + + Boolean attribute identifying whether the Worker is Active. + + + + + The most recent date the employee's status was changed. + + + + + The most recent hire date for the employee or contract start date for the contingent worker. + + + + + Earliest Hire Date for the Worker. + + + + + Reason for Hire from the most recent Hire event. + + + + + Employment End Date for the Worker. + + + + + Continuous Service Date for the Worker. + + + + + First Day of Work only applies to the Payroll web service. + + + + + Expected retirement date for the worker. + + + + + Retirement Eligibility Date for the Worker. + + + + + Boolean attribute identifying whether the Worker is currently retired. + + + + + Most recent Retirement Date. + + + + + Seniority date for the worker. Defaults to hire date. + + + + + Severance date for the worker. + + + + + The Benefits Service Date for an employee. + + + + + The Company Service Date for an employee. + + + + + The Time Off Service Date for an employee. + + + + + The Vesting Date for an employee. + + + + + Date the employee first entered the workforce (for any employer). + + + + + Number of days the worker was unemployed between the time they first entered the workforce and the date they were hired by the current employer. + + + + + + + + + + + + Number of months that the employee worked continuously prior to being hired by the current employer. + + + + + + + + + + + + Boolean attribute identifying whether the Worker is currently Terminated. + + + + + Most recent Termination Date. + + + + + The payroll pay through date from the worker's most recent termination. + + + + + The primary reason for the worker's most recent termination. + + + + + Reference to primary termination reason category. + + + + + Indicates if the termination was involuntary. + + + + + Secondary Termination Reasons Data + + + + + The local reason for the worker's most recent termination. + + + + + This boolean specifies a Worker's overall hire eligibility, which is computed using a formula: + + eligible = (recent termination event reviewer says eligible AND recent exit interviewer says eligible AND recent pre-hire manager hasn't said anything) OR (whatever recent pre-hire manager says) + + In English: + - If the hire eligibility has not been explicitly reviewed by a pre-hire manager after the most recent termination, a pre-hire is eligible if both the termination event reviewer and exit interviewer agree that they are eligible. + - Otherwise, always return the eligibility status that was explicitly reviewed by the pre-hire manager. + + + + + Boolean attribute identifying whether the termination was regrettable. + + + + + Boolean attribute identifying if the worker was specified as not eligible for rehire on his or her recent termination. + + + + + Last day worked for the worker's termination event. + + + + + Date the employee submitted their resignation. + + + + + The last date for which the Canadian worker is paid as specified on the most recent termination transaction for the worker. This field is specific to Canadian employment. + + + + + The date the Canadian worker is expected to return as specified on the most recent termination transaction for the worker. This field is specific to Canadian employment. + + + + + Returns "Yes" if the Canadian worker is not expected to return as specified on the most recent termination transaction. This field is specific to Canadian employment. + + + + + Returns "Yes" if it is unknown if the Canadian worker is expected to return as specified on the most recent termination transaction. This field is specific to Canadian employment. + + + + + Primary Position Probation Start Date + + + + + Primary Position Probation End Date + + + + + Encapsulating element containg all Leave Status data. + + + + + Encapsulating element containing leave requests that have been corrected. + + + + + Date the worker received tenure. + + + + + Returns "Yes" if the worker is a rehire based on the most recent hire event. + + + + + + + Encapsulating element containg all Leave Status data. + + + + + Worker Leave Event + + + + + The description of Leave Request Event. + + + + + The leave request return event. Contains information to the reference of leave return only when the leave has been returned. + + + + + Boolean attribute identifying whether the Worker is On Leave (as of As Of Date). + + + + + Current leave event Start Date. + + + + + Current leave event Estimated End Date. + + + + + Most recent leave event Actual End Date. + + + + + First Day of Work. + + + + + Last day of work for the worker's leave event. + + + + + The type of leave. + + + + + Boolean attribute identifying whether the leave event has a Benefits Effect. + + + + + Boolean attribute identifying whether the leave event has a Payroll Effect. + + + + + Boolean attribute identifying whether the leave event has a Absence Accrual Effect. + + + + + Boolean attribute identifying whether the leave event has a Continuous Service Accrual Effect. + + + + + Boolean attribute identifying whether the leave event has a Stock Vesting Effect. + + + + + Leave Type Reason + + + + + Element to capture all the leave request additional fields + + + + + + + Encapsulating element containing the transaction log entry. + + + + + A reference to a transaction log entry. + + + + + + + + Encapsulating element containing the data of the transaction log entry. + + + + + The Description of the Transaction Log + + + + + Date attribute identifying the effective moment of the transaction. + + + + + Date attribute identifying the entry moment of the transaction. + + + + + References to the transaction log types of the transaction. + + + + + References to the transaction targets of the transaction. + + + + + This transaction log is either an event that has been rescinded or is a rescind event that rescinds another event. + + + + + This transaction log is either an event that has been corrected or is a correction event that corrects another event. + + + + + + + This section holds the employer contribution if the plan includes employer contributions and the contributions are stated in percentages. + + + + + The employer's contribution. + + + + + + + + + + + + + + Wrapper element containing Transaction Types. + + + + + If specified, this search criterium will return those Transaction Log Entries with Transaction Types that match the search criterium. + + + + + + + Encapsulating element containing all transaction log entries. + + + + + + + + Wrapper to hold the business process configuration and user account details. + + + The Create Workday Account Data element is required if Automatically Complete is True. + + + + + + + Wrapper element for web services sub business process parameters. + + + + + Wrapper element for workday account data + + + + + + + Contains the health care data for an employee. + + + + + Contains the health care period data for an employee based on the benefit plan year. + + + + + + + Contains the health care period data for an employee based on the benefit plan year. + + + + + Contains the benefit plan year information. + + + + + Contains the health care coverage information (elections) for an employee. + + + + + + + Contains the health care coverage information (elections) for an employee. + + + + + A reference to the level of coverage elected. + + + + + The first date that coverage began for this type of coverage level. + + + + + The Provider ID of the Primary Care Physician for the employee. + + + + + The election information for the coverage. + + + + + Contains the dependents covered for the election. + + + + + + + The election information for the coverage. + + + + + The date that the coverage began for the coverage level, dependents, and beneficiaries (if applicable). + + + + + The date that coverage ended for this election. + + + + + The date that coverage began for this election. + + + + + The first date that coverage began for this election. This is used to track when an employee first elected a coverage. + + + + + The first date that coverage began for this type of coverage. + + + + + The date that the deduction began for this plan. + + + + + The date that the deduction ended for plan. + + + + + The status of the coverage: Current, Prior, or Future + + + + + Indicates the date on file for the enrollment signature. + + + + + Indicates the date on file for the enrollment signature. + + + + + Indicates the date on file for the enrollment signature. + + + + + First time an individual enrolled in the plan of this benefit election, ignoring gaps in coverage. + + + + + First time an individual enrolled in any plan associated with this provider for this election, ignoring gaps in coverage. + + + + + + Indicates whether the Benefit Election is part of an event that has been corrected or rescinded. + + + + + + Contains the summary information about the benefit provider of the benefit plan. + + + + + A reference for the benefit plan. + + + + + The name of the benefit plan. + + + + + The group identifier of the benefit plan. + + + + + The type of coverage that the benefit plan is for. + + + + + The default currency of the benefit plan. + + + + + The default currency of the benefit plan. + + + + + The classification of the health care plan. + + + + + The insurance coverage target for the insurance plan. + + + + + Contains the summary information about the benefit provider of the benefit plan. + + + + + + Pay Component Reference for the Benefit Plan + + + + + + + Contains the summary information about the benefit provider of the benefit plan. + + + + + A reference to the benefit provider. + + + + + The name of the benefit provider. + + + + + The name of the benefit provider. + + + + + + + Contains the dependents covered for the election. + + + + + A reference to the dependent. + + + + + The date that coverage began for this election. + + + + + The date that coverage ended for this election. + + + + + The date that coverage for the Dependent began on the Benefit Coverage Type. + + + + + The very first date that the Dependent was covered by the Benefit Plan. Any gaps in coverage are ignored. + + + + + The very first date that the Dependent was covered by the Benefit provider. Any gaps in coverage are ignored. + + + + + The Provider ID of the Primary Care Physician for the dependent. + + + + + Contains COBRA Eligibility detail for a participant. If this element is not populated then the participant is assumed to not be COBRA eligible. + + + + + + + Contains COBRA Eligibility detail for a participant. If this element is not populated then the participant is assumed to not be COBRA eligible. + + + + + The reason why the participant is eligible for COBRA. The reason is required if the participant is eligible for COBRA.. + + + + + The COBRA Eligible Date is the day the worker is eligible for COBRA coverage. It represents the worker's Last day of Coverage + 1 day. For example, if an employee terminated on June 28th and was covered to the end of the month (June 30th), you would enter the COBRA Eligible Date as July 1st. + + + + + The Qualifying Event Date is the date of the event that caused the worker to be eligible for COBRA. For example, in the case of a dependent that is now over age, you would enter the birth date. If an employee has a reduction in hours and is now eligible for COBRA, you would enter the date they went from full-time to part-time. + + + + + The date COBRA coverage ends for an employee or dependent. This is only required when the COBRA coverage ends on a different date than the COBRA provider would normally determine. + + + + + The Benefit Plan whose coverage was lost. + + + + + + + Contains the spending account information for an employee. + + + + + Contains the spending account period data for an employee based on the benefit plan year. + + + + + + + Contains the spending account period data for an employee based on the benefit plan year. + + + + + + Contains the spending account coverage information (elections) for an employee. + + + + + + + Contains the spending account coverage information (elections) for an employee. + + + + + + + + + + Contains the spending account election information including the contribution, payroll interface contribution, goal, and annual contribution information. + + + + + + + + + A unique identifier for the currency. + + + + + + + Contains the contribtion information for the spending account election. + + + + + The amount of the contribution. + + + + + + + + + + + + A unique identifier for the frequency. + + + + + + + Contains the payroll interface contribution information for the spending account election. + + + + + The amount of the contribution. + + + + + + + + + + + + A unique identifier for the frequency. + + + + + + + Contains the target contribution amount for the spending account election. + + + + + The amount of the contribution. + + + + + + + + + + + + A unique identifier for the frequency. + + + + + + + Contains the employer contribution amount information for the spending account election. + + + + + + + + A unique identifier for the currency. + + + + + + + Contains the insurance information for an employee. + + + + + + + + Contains the insurance period data for an employee based on the benefit plan year. + + + + + Contains the benefit plan year information. + + + + + Contains the insurance coverage information (elections) for an employee. + + + + + + + Contains the insurance election information for the employee. + + + + + + + + + + + Contains the beneficiary that the coverage allocation is for and the details about the allocation. + + + + + A unique identifier for the beneficiary. + + + + + The original date that coverage began. + + + + + The end date of the coverage. + + + + + + + + Contains the detailed allocation amounts for the beneficiaries of the elected coverage. + + + + + The type of allocation (primary or secondary). + + + + + The percentage allocated to the beneficiary. + + + + + + + + + + + + The amount type for percentage. + + + + + A unique identifier for the currency. + + + + + + + Contains the coverage level detailed information and volume for the insurance election. + + + + + + + + + Contains the detailed insurance coverage level information for an election. + + + + + The coverage amount selected for the election. + + + + + + + + + + + + The buy up amount selected for the election. + + + + + + + + + + + + The guarantee issue amount for the election. + + + + + + + + + + + + The coverage level multiplier (1x, 2x, etc.) selected for the election. + + + + + + + + + + + + The type of coverage level selected. + + + + + A unique identifier for the currency. + + + + + + + The volume information for the coverage level selected. + + + + + The volume of the coverage amount selected. + + + + + + + + + + + + A unique identifier for the currency. + + + + + + + Contains the retirement savings election information for the benefit plan year period. + + + + + + + + Contains the retirement savings election information for the benefit plan year period. + + + + + + + + + Contains the retirement savings election information for the employee. + + + + + + + + + + + + + + + + + Contains the retirement savings amount information. + + + + + + + The maximum contribution amount allowed. + + + + + + + + + + + + A unique identifier for the currency. + + + + + + + Contains the contribution amount for the retirement savings election. + + + + + The amount of the contribution. + + + + + + + + + + + + A unique identifier for the frequency. + + + + + + + Contains the payroll interface contribution amount for the retirement savings election. + + + + + The amount of the contribution. + + + + + + + + + + + + A unique identifier for the frequency. + + + + + + + Contains the employer contribution amount for the retirement savings election. + + + + + + + A unique identifier for the currency. + + + + + + + Contains the person's that are related to the worker as a dependent, beneficiary or emergency contact. + + Security Note: This element is secured to the following domains: Self Service: Benefit Elections; Worker Data: Benefit Elections + + + + + The number of dependents, for this worker, that are used for payroll purposes. + + + + + + + + + + + + Contains the dependent, beneficiary, and emergency contact information for the related person. + + + + + + + Encapsulating element containing all Salary or Hourly Plan Compensation data. + + + + + Reference element representing a unique instance of Salary or Hourly Plan. + + + + + Reference element representing a unique instance of Compensation Element. + + + + + Amount for the Salary or Hourly Plan Compensation data. + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Encapsulating element containing all Unit Salary Plan Compensation data. + + + + + Reference element representing a unique instance of Unit Salary Plan. + + + + + Reference element representing a unique instance of Compensation Element. + + + + + Reference element representing a unique instance of Unit of Measure. + + + + + Amount per unit (based on Frequency). + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Number of units. + + + + + + + + + + + + Reference element representing a unique instance of Frequency. + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Encapsulating element containing all Bonus Plan Compensation data. + + + + + Reference element representing a unique instance of Bonus Plan. + + + + + Reference element representing a unique instance of Compensation Element. + + + + + Individual target amount which overrides the default target percent for the plan. + + + + + + + + + + + Target amount for this bonus plan. + + + + + + + + + + + Individual target percent which overrides the default target percent for the plan. + + + + + + + + + + + + Target percentage for this bonus plan. + + + + + + + + + + + + Guaranteed Minimum for the Bonus Plan. + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + Percent assigned for the Bonus Plan. + + + + + + + + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Contains the detailed information for a dependent. + + + Student Status Start Date must occur before Student Status End Date. + + + + + + + The ID for the dependent. + + + + + Boolean attribute identifying whether Dependent is a Full-time Student. + + + + + The date the dependent became a full-time student. + + + + + The date the dependent's student status ended (no longer a full-time student) + + + + + Boolean attribute identifying whether Dependent is Disabled. + + + + + If inactive, the date from which dependent is inactive. + + + + + Tells if this dependent's information is used in payroll calculations. Only use if dependents for payroll purposes are being tracked for the location context of the worker for this dependent. + + + + + Reference to the legal status of the dependent. + + + + + Reference to the primary country of which the dependent is a national. + + + + + Reference to the dependent's country of birth. + + + + + Reference to the dependent's country region of birth. + + + + + The dependent's city of birth. + + + + + + + + Encapsulating element containing all Dependent data. + + + Cannot inactivate dependent because s/he is a dependent in a current election. + + + + + + + A reference to the dependent. + + + + + Contains the detailed information for a dependent. + + + + + + + Encapsulating element containing all Related Person data. + + + + + A reference to the related person relationship. + + + + + Reference to the Related Person. + + + + + + Encapsulating element containing all Dependent data. + + + + + Encapsulating element containing all Beneficiary data. + + + + + Encapsulating element containing all Emergency Contact data. + + + + + + + Encapsulating element containing all Allowance Plan Compensation data. + + + + + Reference element representing a unique instance of Allowance Plan. + + + + + Reference element representing a unique instance of Compensation Element. + + + + + Percent for the Allowance Plan. + + + + + + + + + + + + Amount for the Allowance Plan. + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Encapsulating element containing all Beneficiary data. + + + + + A reference to the beneficiary. + + + + + Contains the details about the beneficiary. + + + + + + + Encapsulating element containing all Unit Allowance Plan Compensation data. + + + + + Encapsulating element containing all Unit Allowance Plan Compensation data. + + + + + Reference element representing a unique instance of Compensation Element. + + + + + Number of units. + + + + + + + + + + + + Reference element representing a unique instance of Unit of Measure. + + + + + Reference element representing a unique instance of Frequency. + + + + + Amount per unit (based on Frequency). + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Contains the details about the beneficiary. + + + + + The ID for the beneficiary. + + + + + Indicates if the beneficiary is revocable. + + + + + If inactive, the date from which the beneficiary is inactive. + + + + + + + + Encapsulating element containing all Merit Plan Compensation data. + + + + + Reference element representing a unique instance of Merit (Percent) Plan. + + + + + Individual target percent which overrides the default target percent for the plan. + + + + + + + + + + + + Default target percent for the merit plan. + + + + + + + + + + + + Reference element representing a unique instance of Merit Increase Matrix. + + + + + Guaranteed Minimum for the Merit Plan. + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Encapsulating element containing all Commission Plan Compensation data. + + + + + Reference element representing a unique instance of Commission Plan. + + + + + Reference element representing a unique instance of Compensation Element. + + + + + Target amount for the Commission Plan. + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + Draw amount for the Commission Plan. + + + + + + + + + + + + Reference element representing a unique instance of Frequency for the Draw Amount. + + + + + Text attribute describing the duration of the draw amount. + + + + + Boolean attribute identifying whether Compensation Element is recoverable. + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Wrapper element for documents associated with a worker. + + + + + + + + Reference element representing a unique instance of Location. + + + A valid instance of Location must exist for the given Integration ID Reference. + Location Reference does not exist. + + + Only Integration ID Reference or Location ID Reference is allowed for the Location Reference, but both are not allowed. + Only Integration ID Reference or Location ID Reference is allowed for the Location Reference, but both are not allowed. + + + + + + + Integration ID reference is used as a unique identifier for integratable objects in the Workday system. + + + + + A reference to a location. + + + Location must be of usage Business Site. + Location must be of usage Business Site. + + + + + + + + + Reference element representing a unique instance of Organization. + + + A valid instance of Organization must exist for the given Integration ID Reference. + Organization Reference Integration ID does not exist! + + + Only Integration ID Reference or Organization ID Reference is allowed for the Organization Reference, but both are not allowed. + Only Integration ID Reference or Organization ID Reference is allowed for the Organization Reference, but both are not allowed. + + + + + + + + Contains a reference to the organization. + + + + + + + Contains the job classifications from the job profile for the position and the additional job classifications specified for the position. + + + + + A unique identifier for the job classification. + + + + + A unique identifier for the job group. + + + + + + Indicates if the job classification is an additional job classification for the position. + + + + + + Contains the job profile for the position. + + + + + A unique identifier for the job profile. + + + + + A boolean attribute that returns true if the job profile is exempt for this position. Exempt job profiles are typically for positions that are salaried and not eligible for overtime pay. + + + + + A unique identifier for the management level. + + + + + A unique identifier for the job category. + + + + + A unique identifier for the job family. + + + + + The name of the job profile. + + + + + A boolean attribute that returns true if a work shift is required on the position where this job profile is used. + + + + + Boolean attribute indicating whether the job profile is considered a critical job. + + + + + A unique identifier for the difficulty to fill. + + + + + + + Contains the organization reference and details about an organization. + + + + + A unique identifier for the organization. + + + + + + + + Contains the details about the organization. + + + + + The Organization Reference ID for the organization. + + + + + Text attribute identifying Organization Code. A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + + The name of the organization. + + + + + A unique identifier for the type of organization. + + + + + A unique identifier for the subtype of the organization. + + + + + A unique identifier for the primary location of the organization. + + + + + + The Date the Pay Group was assigned to the Payee. + + + + + Returns true if this organization type is used in the Change Organizations business process. + + + + + + + The organizational roles which provide support for the worker. + + + + + A unique identifier for the organization role. + + + + + + + + Contains the workers that fill the organization role. + + + + + A unique identifier that can be used to reference a worker(s) that fills the organization role. + + + + + The way the role was assigned to the worker. Valid values are: Assigned, Default, Inherited + + + + + + + Contains the organization role refeference and the information about that role. + + + + + + + + Contains the worker's management chain for supervisory and matrix organizations. + + + + + + + + + Contains the worker's supervisory management chain. + + + + + + + + Contains the organization reference and details about an organization. + + + + + A unique identifier for the organization. + + + + + Returns the reference(s) to the supervisory organization's manager(s). + + + + + Returns the reference(s) to the supervisory organization's manager(s). + + + + + + + Contains the worker's matrix management chain. + + + + + + + + Contains the organization role and the organizations that the worker supports that role for. + + + + + + + + Contains the organzation role information. + + + + + A unique identifier for the organization. + + + + + The Effective Date of the Assigned, Defaulted, or Inherited Role Assignment + + + + + The way the role was assigned to the worker. Valid values are: Assigned, Default, Inherited + + + + + + + Contains the organization role and the organizations that the worker supports that role for. + + + + + A unique identifier for the organization role. + + + + + + + + National Id request criteria. + + + + + The specific national ID value for the worker. + + + + + + The type of national id for the worker. Either the type or the country need to be included. + + + + + The Country Reference for the National ID. + You must enter either the National ID Type or the Country for the National ID. + Using the National ID Type is more explicit -if a country is entered, then it is possible that there are multiple workers who have the same ID value but with different national id types within that country. + + + + + + + + Data element containing summary compensation information for the worker. + + + + + Amount representing the total base pay for the worker in the currency and frequency specified. + + + + + + + + + + + Amount representing the total salary and allowances for the worker in the currency and frequency specified. + + + + + + + + + + + Amount representing the primary compensation basis for the worker in the currency and frequency specified. + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + + + Data element containing annualized summary compensation information for a worker in the default currency. + + + + + Amount representing the total base pay for the worker in the currency and frequency specified. + + + + + + + + + + + Amount representing the total salary and allowances for the worker in the currency and frequency specified. + + + + + + + + + + + Amount representing the primary compensation basis for the worker in the currency and frequency specified. + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + + + Data element containing annualized summary compensation information for a worker. + + + + + Amount representing the total base pay for the worker in the currency and frequency specified. + + + + + + + + + + + Amount representing the total salary and allowances for the worker in the currency and frequency specified. + + + + + + + + + + + Amount representing the primary compensation basis for the worker in the currency and frequency specified. + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + + + Encapsulating element containing all Contract data for a Worker. + + + + + Contract Pay Rate for the Worker. + + + + + + + + + + + Reference to the Currency. + + + + + Reference to the Frequency. + + + + + Contract Assignment Details for the Worker. + + + + + The date the contingent worker's contract ends. The corresponding contract start date can be found in the Hire Date. + + + + + The Supplier for the Contingent Worker. + + + + + + + The Wrapper data element for the Put Dependent Web Service. + + + If a Related Person is selected, s/he must be related to the Employee. + + + If you selected Use Employee Address, you cannot specify Address Data. + + + If you selected Use Employee Phone, you cannot specify Phone Data. + + + You must select a related person relationship that has a dependent relationship type. + + + The Existing Related Person must have a Gender defined or the Gender must be provided. + + + The Existing Related Person must have a Date of Birth defined or Date of Birth must be specified. + + + The Existing Related Person must have an Address or the Address must be specified. + + + + + + + The Reference ID for the Dependent. This field can be used to fill in the ID value for a newly created Dependent, or to update the ID of an existing Dependent. + + + + + A reference to the Employee for the Dependent. + + + + + Reference to an existing related person for the Dependent. If this field is populated, this dependent's personal information data will be shared with the person specified. + + + + + Reference to the relationship between the dependent and the related person. + + + + + If this field is marked true, then the dependent will share the specified employee's primary home address. + + + + + If this field is marked true, then the dependent will share the specified employee's primary home phone data. + + + + + If this field is marked true, any new beneficiaries that are created will be marked as "Irrevocable". + + + + + Wrapper element for this dependent's personal information. + + + + + + + + Wrapper element for the Put Dependent Request Information. + + + If you are updating an existing Dependent, you cannot select an Existing Related Person to update. + + + You must select an Employee when a new Dependent is being created, but not when an existing Dependent is being updated. + + + You must select a Related Person Relationship when a new Dependent is being created. + + + If a new Dependent is being created and an existing related person is not supplied, Dependent Personal Information Data must be supplied. + + + If a new Dependent is being created and an existing related person is not supplied, Legal Name Data is required. + + + If a new Dependent is being created and an existing related person is not supplied, one email, one phone number, or one address is required. + + + If you selected Use Employee Address, the employee for this dependent must have a primary home address. + + + If you selected Use Employee Phone, the employee for this dependent must have a primary home phone number. + + + If a new Dependent is being created and an existing related person is not supplied, Gender is required. + + + If a new Dependent is being created and an existing related person is not supplied, Date of Birth is required. + + + The selected Existing Related Person is already a Dependent for the selected Employee. + + + Irrevocable may be set only for employees in Quebec. + + + If a new dependent is being created, an address is required. + + + Dependent ID already exists. + + + This dependent is currently enrolled in benefits. You must report a benefit change to remove the dependent from their elections before the date of death can be entered and they are inactivated. + + + Dependent ID already exists. + + + + + + + The reference to the Dependent being updated. For new Dependents, this reference will not exist. + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Wrapper element for this dependent's personal information. + + + Date of Death must be a date between Date of Birth and today's date. + + + Preferred names cannot be specified for dependents. + + + + + + + Wrapper element for this dependent's name data. + + + + + Wrapper element for this dependent's contact information. + + + + + Wrapper element for this dependent's ID data. + + + + + The date of birth of the dependent. + + + + + The date of death of the dependent. + + + + + The gender of the dependent. + + + + + Boolean representing whether or not this dependent uses tobacco. + + + + + Boolean representing whether or not this dependent is a full-time student. + + + + + The date the dependent became a full-time student. + + + + + The date the dependent's student status ended (no longer a full-time student) + + + + + Boolean representing whether or not this dependent is disabled. + + + + + If inactive, the date from which dependent is inactive. + + + + + + + Wrapper element for the Put Dependent Returned data. + + + + + The reference to the dependent which was added or updated. + + + + + The reference to the employee for the dependent. + + + + + + + + + Exception (Errors and Warning) associated with the transaction. + + + + + Exception Classification (Error or Warning) + + + + + Exception Detail + + + + + + + Contains the health savings account information for an employee. + + + + + Contains the health savings account period data for an employee based on the benefit plan year. + + + + + + + Contains the health saving account period data for an employee based on the benefit plan year. + + + + + Contains the benefit plan year information. + + + + + Contains the health saving account coverage information (elections) for an employee. + + + + + + + Contains the spending account coverage information (elections) for an employee. + + + + + The election information for the coverage. + + + + + More information on Health Savings Account Election such as coverage target. + + + + + Contains the health saving account election information including the contribution, payroll interface contribution, goal, and annual contribution information. + + + + + Contains the employer contribution amount information for the health saving election. + + + + + + + References to specific Organizations to return + + + + + References to specific Organizations to return + + + + + + + + This element contains criteria to filter the Organizations returned. + + + + + This element allows you to subset the Organizations returned by type. + + + + + Set this attributes to true to include Inactive Organizations in your results. Default is not to include Inactive Organizations. + + + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request, then only the following elements will be returned: Reference, Organization Data, Hierarchy Data and if a Supervisory Organization Type the Supervisory Data. + + + + + Indicates whether the Roles Data element is included in the response. + + + + + Indicates whether the Hierarchy Data element is included in the response. + + + + + Indicates whether the Supervisory Data element is included in the response (ONLY APPLIES TO SUPERVISORY TYPE ORGS). + + + + + Indicates whether the Staffing Restrictions Data element is included in the response (ONLY APPLIES TO SUPERVISORY ORGS). + + + Include Supervisory Data must be selected when use the Include Staffing Restrictions flag. + + + + + + + + + Root element for Get Organizations operation request + + + + + Wrapper element containing references to specific organizations + + + + + Wrapper element containing filtering criteria to subset the organizations to return in the response. + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request, then only the following elements will be returned: Reference, Organization Data, Hierarchy Data and if a Supervisory Organization Type the Supervisory Data. + + + + + + + + Response element containing an instance of Organization and its associated data. + + + + + + + + Contains each Organization based on the Request References or Request Criteria. The data returned is the current information as of the dates in the response filter, and does not include all historical information about the Organization. + + + + + Utilize the Request References element to retrieve a specific instance(s) of Organization and its associated data. + + + + + Utilize the Request Criteria element to search the transaction log for specific instance(s) of a Organization based upon an Event type within a date range. + + + + + + This response group allows for the response data to be tailored to only include elements that the user is looking for. If no response group is provided in the request, only the following elements will be included: Reference, Hierarchy Data, and if a Supervisory Organization, the Supervisory Organization Data. + + + + + The "Response_Results" element contains summary information about the data that has been returned from your request including "Total_Results", "Total_Pages", and the current "Page" returned. + + + + + Contains each Organization based on the Request References or Request Criteria. The data returned is the current information as of the dates in the response filter, and does not include all historical information about the Organization. + + + + + + + + The secondary reasons for the worker's most recent termination. + + + + + Secondary reason for the worker's termination. + + + + + Reference to the secondary termination reason category. + + + + + + + Benefit Plan Earnings Deduction Details Data + + + + + Whether Family or Employee is the target of the Health Savings Account. + + + + + The annual maximum amount total for employee and employer contribution in the Health Savings Account. + + + + + + + + + + + The currency of the annual maximum amount for Health Savings Account. + + + + + + + Contains the detailed information about an Organization. + + + + + Integration Reference ID used for integration purposes; This is also the Organization ID + + + + + The name of the Organization that appears on pages and reports. A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + A long description of the Organization. + + + + + Text attribute identifying Organization Code. A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + Boolean choice to include the Manager/Leader Name in the Organization Name display. + + + + + Boolean attribute identifying whether to include the Organization Code within the name (Display ID within Workday). A new effective-dated organization name is automatically created if value for this field is different as of specified effective date. + + + + + A unique identifier for the type of organization. + + + + + A unique identifier for the subtype of the organization. + + + + + Date the Organization is available for use. + + + + + Date/Time for the last update. + + + + + Inactive indicator for the Organization. + + + + + Date the Organization was made Inactive. + + + + + Unique identifier for the manager for the organization. + + + + + Manager(s) of this organization. If there is a position restriction with an overlap, both are returned. + + + + + A unique identifier for the worker that owns the Organization. + + + + + A unique identifier for the scope of visibility for the Organization. + + + + + Non-Workday URL link for more Organizational information. + + + + + Contains external system name and its corresponding ID that can be used to match data between systems during an integration. + + + + + Contains information about an Organization Role and incumbent worker(s). + + + + + Contains the top-level organization, the immediate superior organization, and all immediate subordinate organization references. + + + + + For Organizations of type Supervisory, contains staffing model and restrictions, location and other organizational assignments. + + + + + + + + Contains information regarding organizations just adjacent in the hierarchy. + + + + + Reference information for the top-level node. + + + + + Reference information for immediately superior Organization to the current Organization. Will only appear for Hierarchical Organizations. + + + + + Reference information for all Organizations immediately subordinate to the current Organization. Will only appear for Hierarchical Organizations. + + + + + Reference information for all included Organizations. Will only appear for Hierarchical Organizations that include other organizations as members. + + + + + Reference information for Organizations that include this Organization in their Organization hierarchy + + + + + + + Contains details specific to a Supervisory Organization. + + + + + The staffing model used for the organization. + + + + + Unique identifier for the primary Location for the organization. + + + Location must be of usage Business Site. + Location must be of usage Business Site. + + + + + + + Contain information for Staffing related Organizations; minimally for Company, Cost Center and Region. + + + + + For Supervisory Organizations, contain staffing restrictions. + + + + + Returns a true if this is able to be filled by a worker. + + + + + Boolean attribute identifying whether a Hiring Freeze is currently in affect. + + + + + + + Element containing application related exceptions data + + + + + Exception Data + + + + + + + Element containing Exceptions Data + + + + + Exceptions Data + + + + + + + Wrapper element for the default organization assignments for this organization. + + + Only one organization allowed for [org type]. + + + + + + + A unique identifier for the type of organization. + + + + + A unique identifier for the organization. + + Organization_Reference_ID + + For Organization Type [org type], the Organization '[org]' does not comply with the Allowed Organizations. + + + + + + + + + Response element containing an instance of Organization and its associated data. + + + + + + + + Defines the As Of Date to be used for any application effective dated data within the Workday system. For "Request" elements, the "As Of Date" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Date" entered in the "Request" element or the default "As Of Date" if omitted.. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. For "Request" elements, the "As Of Moment" determines what data is to be used within search logic or returned in a response. For "Response" elements, this element will echo "As Of Moment" entered in the "Request" element or the default "As Of Moment" if omitted. + + + + + + + Contains information about role assignments for an organization. + + + + + Contains information about an Organization Role and incumbent worker(s). + + + + + + + Contains information about organization role assignments. + + + + + A unique identifier for the organization role. + + + + + A unique identifier that can be used to reference a worker(s) that fills the organization role. + + + + + + + Contains data for adding or updating a Workers' Compensation Code. + + + Add Only is true but the Workers' Compensation Code ID is already in use. + + + + + + + Reference to an existing Workers' Compensation Code. Only needed when updating the Reference ID for the Workers' Compensation Code. + + + + + Contains data for a Worker's Compensation Code. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Contains request reference, filter and response group for getting Workers' Compensation Code data + + + + + + Get Workers' Compensation Code request references + + + + + + + + Element containing Workers' Compensation Code response grouping options + + + + + + + + Element containing reference instance for a Workers' Compensation Code + + + + + Reference to an existing Workers' Compensation Code + + + + + + + Element containing Worker Compensation Codes response elements including received criteria, references, data based on criteria and grouping, results filter and result summary + + + + + + + + + + Wrapper Element that includes the Workers' Compensation Code Data + + + + + + + + Wrapper Element for Worker Compensation Code Data + + + + + Element contains Worker Compensation Code data + + + + + + + Wrapper element that includes the Workers' Compensation Code instance set and data. + + + + + Reference to an existing Workers' Compensation Code + + + + + Workers' Compensation Code Data + + + + + + + Element containing Workers' Compensation Code data + + + + + Workers' Compensation Code Reference ID. This is the unique identifier for a Workers' Compensation Code. + + + + + Workers' Compensation Code. + + + + + Workers' Compensation Code Name. + + + + + Reference to the Country for the workers' compensation code. + + + The country cannot be changed for [worker comp code] as it has already been used by a job profile. + + + + + + + Reference to the country region for the workers' compensation code. + + + + + Reference to the location for the workers' compensation code. + + + + + Boolean to indicate whether the workers' compensation code is active. + + + + + + + Element containing Put Workers' Compensation Code Response Data + + + + + Reference for Workers' Compensation Code + + + + + + + + Element containing Workers' Compensation Code data for a Job Profile. + + + The Workers' Compensation Code: [WCC] - has a location in common with one of the other Workers' Compensation Codes for this Job Profile. Remove one of these workers' compensation codes. + + + The Workers' Compensation Code: [WCC] - has a country region site in common with one of the other Workers' Compensation Codes for this Job Profile. Remove one of these workers' compensation codes. + + + The Workers' Compensation Code: [WCC] - has a country (without country region or locations) in common with one of the other Workers' Compensation Codes for this Job Profile. Remove one of these workers' compensation codes. + + + + + + + Reference to an existing Workers' Compensation Code + + + + + + + Encapsulating element containing all Stock Plan Compensation data. + + + + + Reference element representing a unique instance of Stock Plan. + + + + + Percent of target that are options. + + + + + + + + + + + + Percent of target that are stocks. + + + + + + + + + + + + Default target shares for the stock plan. + + + + + + + + + + + + Individual target share which overrides the default target share for the plan. + + + + + + + + + + + + Default target percent for the stock plan. + + + + + + + + + + + + Individual target amount which overrides the default target share for the plan. + + + + + + + + + + + Default target amount for the stock plan. + + + + + + + + + + + Individual target percent which overrides the default target share for the plan. + + + + + + + + + + + + Currency of amount. + + + + + Reference element representing a unique instance of Stock Vesting Schedule. + + + + + Compensation Matrix of plan. + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Company Tax ID Request Reference element contains the specific instance set containing the requested Company Tax ID. The Company ID is either the Lookup ID or the Workday ID (GUID). + + + + + Company Tax ID Reference + + + + + + + The Request Criteria is a wrapper element around a list of elements representing the operation specific criteria needed to search for Company TaxID instances + + + + + Wrapper element around a list of elements representing the amount of data that should be included in the Company Tax ID response. + + + + + Include Reference + + + + + + + This element is the top-level request element for all "Get" Company TaxID operations. + + + + + + Request References + + + + + Request Criteria + + + + + + Response Filter + + + + + Response Group + + + + + + + + Element containing Company Tax ID Response data + + + + + Element containing Company Tax ID + + + + + + + Top-level response element for all "Get" Company Tax ID operations + + + + + Company Tax ID Request References + + + + + Company Tax ID Request Criteria + + + + + Response Filter + + + + + Company Tax ID Response Group + + + + + Company Tax ID Response Results + + + + + Company Tax ID Response Data + + + + + + + + Element encapsulating Company Tax ID data. + + + Tax ID is required + Tax ID is required + + + + + + + Represents a reference to the company. + + + + + Tax ID for the Company. + + + + + + + Element containing Company Tax ID reference for update and all Company Tax ID data items + + + + + Company Tax ID Data + + + + + + + + Element containing Put Company Tax ID Response Data + + + + + Company Reference + + + + + + + + Response element containing an instance of Company and its Tax ID. + + + + + + + + Request to get Holiday Calendars. + + + + + + + + + + + + + + Response for Get Holiday Calendars. + + + + + + + + + + Retrieved Holiday Calendars. + + + + + + + + Wrapper containing data for Condition Rule. + + + + + Text name for Condition Rule. + + + + + Text description of Holiday Calendar. + + + + + Reference to the Calendar Rule for the Holiday Calendar. + + + + + Display on Time Off and Leave Calendar + + + + + Event Data for the Holiday Calendar. + + + + + + Text value for reference ID for Holiday Calendar Event. + + + + + + Event Data for the Holiday Calendar. + + + + + Text Value for the name of the Holiday Calendar Entry. + + + + + Wrapper element containing date and times for the Calendar Event. + + + + + Wrapper element containing recurrence data for the Calendar Event. + + + + + + Text value for reference ID for Holiday Calendar Event. + + + + + + Wrapper element containing recurrence data for the Calendar Event. + + + Only Daily Recurrence, Weekly Recurrence, or Monthly Recurrence is allowed. + + + Either 'Recurs Every Weekday' or 'Recurrence Interval Multiplier' must be specified. + + + "Last Day of the Month" cannot be selected in conjunction with other Days of the Month. + + + At least one value specified for "Day of the Week" must be the day of the week associated with the "Start Date". + + + The End Date must occur on or after the Start Date. + + + "Recurs Every x Week(s)" must be greater than 0 and less than 53 weeks. + + + 'Day of Month' must be specified and neither 'Day of Week' nor 'Week of Month' are specified OR 'Day of Month' is not specified but both 'Day of Week' and 'Week of Month' are specified. + + + 'Month' is required. + + + 'Day of the Week' is required. + + + Either 'Recurs Every Weekday' or 'Recurrence Interval Multiplier' must be specified. + + + "Last Day of the Month" cannot be selected in conjunction with other Days of the Month. + + + At least one value specified for "Day of the Week" must be the day of the week associated with the "Start Date". + + + The Start Date for the recurrence range must be on the Start Date of the event. + + + The start date must be on a weekday for events that recur every weekday. + + + + + + + Reference for Run Frequency for Calendar Event. + + + + + Numeric value for Recurrence Interval Multiplier for Calendar Event. + + + + + + + + + + + + If true, calendar event recurs every weekday. + + + + + Reference for Day of the Week for Calendar Event. + + + + + Reference for Month for Calendar Event. + + + + + Reference for Day of the Month for Calendar Event. + + + + + Reference for Week of the Month for Calendar Event. + + + + + Date value for Trigger Start Date for Calendar Event. + + + + + Date value for Trigger End Date for Calendar Event. + + + + + + + Request to get Work Schedule Calendar. + + + + + + Wrapper for Work Schedule Calendar references. + + + + + Request criteria for Work Schedule Calendar response. + + + + + + + Options for responded Work Schedule Calendar. + + + + + + + + Retrieved Work Schedule Calendar. + + + + + Reference for Work Schedule Calendar and data. + + + + + + + Instance data for Work Schedule Calendar. + + + An option must be chosen as the day breaker divider when the day breaker is not 12:00 AM. When the day breaker is 12:00 AM, day breaker divider must be left blank. + + + Select a Biweekly Calculation Start Date that falls on the Work Week Start Day ( [Work Week Start Day] ). + + + Only one schedule pattern is allowed per day. Edit the schedule patterns so that they do not start on the same day. The work schedule calendar in error is: [wsc] + + + Combine schedule patterns on the same week that have identical Start Times, End Times, and meal times or schedule patterns on the same week that are 24-Hour Shifts and submit them as a single schedule pattern. The work schedule calendar in error is: [wsc] + + + Schedule patterns cannot overlap with each other. Edit the pattern Start Times, End Times, Days of the Week, or Week Numbers so that the events do not overlap. Note: A schedule pattern may overlap with an event on another day if it crosses midnight. The work schedule calendar in error is: [wsc] + + + Edit the schedule pattern so that the total number of hours for each day is greater than or equal to: [min number of hours per day]. Alternatively, edit the Minimum Number of Hours per Day so that it is less than or equal to the total number of hours for each day. The work schedule calendar is: [wsc] + + + Edit the schedule pattern so that the total number of hours for each day is less than or equal to: [max number of hours per day]. Alternatively, edit the Maximum Number of Hours per Day so that it is greater than or equal to the total number of hours for each day. The work schedule calendar is: [wsc] + + + Edit the meal duration so that it is greater than or equal to: [min meal duration]. Alternatively, edit the Minimum Meal Duration so that it is less than or equal to the meal duration for each schedule pattern. The schedule pattern in error belongs to this work schedule calendar: [wsc] + + + Edit the meal duration so that it is less than or equal to: [max meal duration]. Alternatively, edit the Maximum Meal Duration so that it is greater than or equal to the meal duration for each schedule pattern. The schedule pattern in error belongs to this work schedule calendar: [wsc] + + + Edit the schedule patterns so that the Start Times occur on or after the Flexible Start Times and the End Times occur on or before the Flexible End Times and the Start Times occur before the End Times. The schedule pattern in error belongs to this work schedule calendar [wsc]. + + + To add meals to patterns, the Enable Worker Editing Options field and the Allow Meals field must either be both selected or both cleared. Either select the fields, clear the fields, or remove the meals. The work schedule calendar in error is: [wsc] + + + A work schedule calendar with Worker Editing Options enabled must have schedule patterns. Either add schedule patterns or clear the Enable Worker Editing Options field. The work schedule calendar in error is: [wsc] + + + You must submit worker editing options for a work schedule calendar that has schedule patterns. Either add worker editing options or remove the schedule patterns. You can submit worker editing options that are disabled. The work schedule calendar in error is: [wsc] + + + Because the Uniform Start and End Times field is selected, you must have no more than one schedule pattern per Week Number. Either clear the Uniform Start and End Times field or submit only one schedule pattern for each Week Number. The work schedule calendar in error is: [wsc] + + + Edit the schedule patterns so that the total number of hours for each Week Number is greater than or equal to: [min number of hours per week]. Alternatively, edit the Minimum Number of Hours per Week so that it is less than or equal to the total number of hours for each week. The work schedule calendar is: [wsc] + + + Edit the schedule patterns so that the total number of hours for each Week Number is less than or equal to: [max number of hours per week]. Alternatively, edit the Maximum Number of Hours per Week so that it is greater than or equal to the total number of hours for each week. The work schedule calendar is: [wsc] + + + Edit the work schedule calendar so that it has only schedule patterns or only calendar events. The work schedule calendar in error is: [wsc] + + + Add schedule patterns or clear the Number of Weeks and Pattern Start Date fields. The work schedule calendar in error is: [wsc] + + + Enter a Number of Weeks and a Pattern Start Date or remove the schedule patterns. These fields are required when a work schedule calendar has schedule patterns. The work schedule calendar in error is: [wsc] + + + Edit the work schedule calendar so that the Number of Weeks is 1 or 2, or remove the schedule patterns and clear the Pattern Start Date field. The work schedule calendar in error is: [wsc] + + + + + + + Text name for Work Schedule Calendar. + + + + + A short description of the work schedule calendar or its restrictions to display to workers when they edit their work schedules. + + + + + Text description of Work Schedule Calendar. + + + + + Reference to the Calendar Rule for the Work Schedule Calendar. + + + + + Reference to Day Breaker for Work Schedule Calendar as Twenty Four Hour. + + + + + Reference to Day Breaker Divider for Work Schedule Calendar. + + + + + Reference to day of the week which begins the work week. This setting only applies to time entry and does not affect the start day of a worker's schedule shown in My Schedule report. + + + + + Reference to Biweekly Calculation Start Date for Work Schedule Calendar. + + + + + The date on which the patterns begin cycling, if using Pattern Schedule Events. This setting does not affect the week start day of the My Schedule report. + + + + + Number of Weeks for Work Schedule Calendar, if using Pattern Schedule Events. + + + Enter a number of weeks that is less than or equal to 2. + + + + + + + + + + + + + + Work Schedule Calendar Event data. + + + + + + + + Text value for reference ID for Work Schedule Calendar. + + + + + + Work Schedule Calendar Event data. + + + Meal times only allowed for calendar events spanning up to 24 hours. + + + You can't include meals in a non-timed event. Remove the meal(s) from the event. + + + Calendar events cannot have more than two meals. + + + + + + + Text value for the name of the Work Schedule Calendar Event. + + + + + Display Name of the Work Schedule Calendar Event. + + + + + Wrapper element containing date and times for the Calendar Event. + + + + + Wrapper element containing meal times for the Work Schedule Calendar Event. + + + + + Wrapper element containing recurrence data for the Calendar Event. + + + + + + Text value for reference ID for Work Schedule Calendar Event. + + + + + + Put Holiday Calendar + + + Holiday Calendar ID already exists. + + + + + + + Reference for Holiday Calendar. + + + + + Wrapper containing data for Condition Rule. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Put Holiday Calendar Response. + + + + + Reference for Holiday Calendar. + + + + + + + + Wrapper for Holiday Calendar references. + + + + + Reference for Holiday Calendar. + + + + + + + Request criteria for Holiday Calendar response. + + + + + Options for responded Holiday Calendars. + + + + + Boolean value to include references for Holiday Calendar. + + + + + Boolean value to include holiday calendar data for Holiday Calendar. + + + + + + + Retrieved Holiday Calendars. + + + + + + + + Wrapper for Holiday Calendar reference and data. + + + + + Reference for Holiday Calendar. + + + + + + + + Put Work Schedule Calendar and Events. + + + Work Schedule Calendar ID already exists. + + + + + + + Reference for Work Schedule Calendar. + + + + + Instance data for Work Schedule Calendar. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Put Work Schedule Calendar response. + + + + + Reference for Work Schedule Calendar. + + + + + + + + Wrapper for Work Schedule Calendar references. + + + + + Reference for Work Schedule Calendar. + + + + + + + Request criteria for Work Schedule Calendar response. + + + + + Options for responded Work Schedule Calendar. + + + + + Boolean value to include references for Work Schedule Calendar. + + + + + Boolean value to include holiday calendar data for Work Schedule Calendar. + + + + + + + Response for Get Work Schedule Calendar. + + + + + + + + + + Retrieved Work Schedule Calendar. + + + + + + + + Requested Work Schedule Calendar data. + + + + + Reference for Work Schedule Calendar. + + + + + + + + Future payment plan assignment data submitted by the put future payment plan assignment request. + + + + + Compensation Plan Reference + + + + + Individual Target Amount + + + + + + + + + + + Individual Target Currency Reference + + + + + Individual Target Payment Date + + + + + Comment + + + + + + + Wrapper element for the worker compensation code. Contains the reference id and the worker comp code. + + + + + Reference for Workers' Compensation Code + + + + + The worker compensation code. + + + + + + + Field Result Request Criteria + + + + + Field And Parameter Initialization Provider Reference + + + + + + + Result of the evaluation of an External Field based on a contextual instance. + + + + + Integration Document Field Reference + + + + + Value + + + + + + + Wrapper element containing date and times for the Calendar Event. + + + Start Date, Start Time, End Date and End Time are required if the event is not an all day event. + + + The End Date/Time must be on or after the Start Date/Time. + + + The End Date must occur on or after the Start Date. + + + + + + + Boolean value for all day event for Calendar Event. If true, this event will occur all day. If false, this event will occur in the start to end date range. + + + + + Date value for the start time for Calendar Event. + + + + + Time reference for the start time for Calendar Event. + + + + + Date value for the End Time for Calendar Event. + + + + + Time reference for the end time for Calendar Event. + + + + + + + Contains the plans that the worker is eligible for + + + + + Benefit plan that the worker is eligible for + + + + + + + + Contains data for an Employee Contract. + + + + + Employee Contract which is being edited. An employee contract may have many versions. The employee contract reference is common for each version. + 1. Update existing contract if Employee Contract Reference is specified. + 2. Add new contract if Employee Contract Reference is not specified. + + + Employee Contract does not belong to the specified Employee. + + + Employee Contract is not for the same position as the parent event's position. + + + + + + + The reference(s) to the Employee Contract Reason(s) for this Employee Contract. + + + + + Unique identifier for a an employee contract. + 1. If Employee Contract Reference is specified, the existing employee contract will be updated with this Employee Contract ID. If the Employee Contract ID is not specified, the employee contract will retain its existing Employee Contract ID. + 2. If Employee Contract Reference is not specified, a new employee contract will be created with this Employee Contract ID. If the Employee Contract ID is not specified, the system will automatically generate a unique identifier. + + + Employee Contract ID is already in use. + + + + + + + The date the contract version is created. This is always set to the date and time of the last update. Any value sent in the request will be ignored. + + + + + This is a user-provided identifier and need not be unique. For the same contract it may change over time. + + + + + The type of contract, based on the contract types defined within your organization. + + + Contract type is not valid. + + + + + + + This is the start date in the contract itself. May not be earlier than Hire Date of the primary job or the start date of the Additional Job the contract is attached to. + + + Employee contract date range overlaps with another employee contract for this position. + + + Employee contract start date cannot be before the start date of the position. + Contract Start Date: [contract] + Position Date: [start] + + + Contract Start Date cannot be after the end date of the position: + Contract Start Date: [date1] + Position End Date: [date2] + + + + + + + This is the end date (if any) in the contract itself. Before opening a new contract for an employee (for example, when transferring or changing jobs) you should end the old contract with an end date one day prior to the Change Job date. + + + Contract End Date may not be earlier than Contract Start Date. + + + Contract End Date cannot be after this position's end date: [date] + + + Contract End Date cannot be after the proposed termination date: [date] + + + + + + + The reference(s) to the Collective Agreement(s) for this Employee Contract. + + + Only 1 Collective Agreement is allowed. + + + + + + + The Maximum Weekly Hours entered for this Employee Contract. + + + Maximum Weekly Hours is not valid for this Location. + + + + + + + + + + + + + + The Minimum Weekly Hours entered for this Employee Contract. + + + Minimum Weekly Hours is not valid for this Location. + + + + + + + + + + + + + + The status of the contract, based on the status types defined within your organization. The status values will be those defined for the location of the employee's primary position. + + + Employee contract status is not valid. + + + + + + + The position to which this contract is related. + + + Position is not valid for the worker. + Position: [position] + Worker: [worker] + + + Position Reference is required. + + + + + + + Use this field for any notes or details that pertain to this contract or contract version + + + + + The date the employee signed the contract. Must be within 1 month of the Contract Start Date and not later than the Contract End Date. + + + Date Employee Signed cannot be later than the Contract End Date + + + Date Employee Signed should be within the year before or month after the Contract Start Date. + + + + + + + The date the employer signed the contract. Must be within 1 month of the Contract Start Date and not later than the Contract End Date. + + + Date Employer Signed should be within a month of the Contract Start Date + + + Date Employer Signed cannot be later than the Contract End Date + + + + + + + You may attach scanned contract images, addendums, or other file attachments. + + + + + + + Contains the position's organization that it is part of + + + + + + Provides additional information on Pay Group Assignment corrections or rescinds. This element only reports Pay Group Assignment Rescind events. + + + + + + + Contains the language ability information. + + + + + Reference element representing a unique instance of Language Proficiency. + + + + + Reference element representing a unique instance of Language Ability Type. + + + + + + + Wrapper element containing summary compensation information for a position. The information is in the position's compensation currency and frequency, annualized, and annualized in the default currency. + + + + + Employee Compensation Summary Data + + + + + Annualized Summary Data + + + + + + Annualized in Reporting Currency Summary Data + + + + + + + + Contains information about all the succession plans that this employee is on. + + + + + + + + Contains the potential assessment for the employee. + + + + + Contains the information about the employee's potential. + + + + + + + Contains information about the succession plan candidacy for the employee. + + + + + The position or position restriction for which this employee is a succession plan candidate. + + + + + The readiness of the candidate to fill this position. + + + + + Indicates whether the employee is the top candidate for this succession plan. + + + + + Notes on this candidate. + + + + + The date the candidate information was last updated. + + + + + + + Contains the information about the employee's potential. + + + + + The Potential for this Employee. + + + + + The Achievable Level for this Employee. + + + + + The Retention status for this Employee. + + + + + The Loss Impact Status for this Employee + + + + + Notes for this Talent Assessment. + + + + + + + Organization Assignment Restrictions Request References + + + + + Supervisory Organization Reference + + + + + + + Get Organization Assignment Restrictions Request + + + + + Organization Assignment Restrictions Request References + + + + + + + + + Organization Assignment Restrictions Response Data + + + + + + + + Response Data + + + + + + + + Get Organization Assignment Restrictions Response + + + + + + + + + + + + Organization Assignment Restrictions Data + + + An Organization Type only allows 1 Default Organization Assignment. + An Organization Type only allows 1 Default Organization Assignment. + + + Organization Types in request can not duplicate. + Organization Types in request can not duplicate. + + + Default Company must be one of the 'Restricted To Companies' for default Cost Center. + Default Cost Center [cost_center] has 'Restricted To Companies' and the default value for Company [company] must be one of them. If Company has allowed values, then they must include one of the 'Restricted To Companies' as the default value for Company must also be an allowed value. + + + + + + + Supervisory Organization Reference holds the Superviosry Organization for which the allowed/default organization(s) will be changed. + + + + + Organization Assignment Restrictions Data for an Organization Type + + + + + + Default to FALSE, if omitted. + If set to TRUE, all existing Allowed/Default Organization(s) will be removed before any further processes. + If inheritance of default and allowed values from the superior is being severed, setting this to 'TRUE' will not persist inherited values for any org type. + + + + + + Organization Assignment Restrictions by Type Data + + + Organization Assignment Restrictions or Defaults cannot be specified for this organization type. + Organization Assignment Restrictions or Defaults cannot be specified for this organization type ([org type]). + + + Because allowed organization is defined for the organization type, default organization must be one of the allowed organizations. + + + + + + + Organization Type Reference. Can not be duplicated within 1 request. + + + + + + + + + Put Organization Assignment Restrictions Request + + + + + + + + + Put Organization Assignment Restrictions Response + + + + + Supervisory Organization Reference + + + + + + + + Contains each payroll reporting code for the position. + + + + + Reference to the payroll reporting code. + + + + + The payroll reporting code's value. + + + + + The payroll reporting code with formatting applied. + + + + + The name of the payroll reporting code. + + + + + Reference to the payroll reporting type for the payroll reporting code. + + + + + + + "References" element allowing the specification of specific object instances to be returned based on ID values. + + + + + A reference to a specific Frequency based on its unique ID (Frequency ID or Workday ID). + + + + + + + Root request element for the operation + + + + + "References" element allowing the specification of specific object instances to be returned based on ID values. + + + + + + + + + Contains the data for a single frequency + + + + + A reference to a specific Frequency based on its unique ID (Frequency ID or Workday ID). + + + + + + + + Contains the core response data based on the request submitted + + + + + Contains the data for a single frequency + + + + + + + Root element for the Response on the Get operation. Contains the instances returned by the Get operation and their accompanying data. + + + + + + + + Contains the core response data based on the request submitted + + + + + + + + Container for the core frequency data + + + + + The unique identifier for the frequency + + + + + The functional name for the frequency + + + + + The number of occurrences within a year for a frequency (e.g. Yearly = 1, Monthly = 12, etc...) + + + + + + + + + + + + A mapping to the internal Workday frequencies functionality. The values for this reference can be found using the "Integration IDs" task within the Workday application (Business Object = Frequency Behavior) + + + + + A boolean flag indicating whether a worker's weekly hours should be used instead of a normal conversion rate when converting to/from hourly-based rates in Workday Compensation. + + + Use Weekly Hours only applies to Hourly Frequencies (Frequency Behavior = HOURLY). + + + + + + + Identifies that the frequency is used in Payroll Interface + + + + + + + Root request element for the operation + + + When "Add Only" is used, the Frequency ID must not already exist. + Frequency already exists. + + + Frequency Name already exists. Please use a unique name. + + + + + + + A reference to a specific Frequency based on its unique ID (Frequency ID or Workday ID). + + + + + Container for the core frequency data + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response for Put Frequency service + + + + + Reference for Frequency object + + + + + + + + Wrapper element for Language Achievement information + + + Duplicate language entries are not allowed. + + + At least one ability for this language is required. + + + + + + + Language Reference + + + There is an in progress event for this worker for the language: [language]. Only one in progress event is allowed. + + + + + + + Used for inbound operations to indicate that the language should be removed for the person. Will always return false for outbound operations. + + + + + Used for inbound operations to indicate that the language is Native language for the person. + + + + + + + Language Ability must not be specified if Remove Language is true. + + + + + + + Date of Assessment + + + + + Assessment Comments + + + + + Worker assessing the language + + + + + + + Wrapper element for Language Ability + + + Select a Language Ability that isn't already in use. + + + + + + + Language Ability Reference + + + + + + + + Element containing Worker Compensation Code response group options + + + + + Include Reference + + + + + + + Contains the details of a Job Profile. + + + + + A unique identifier for the job profile. + + + + + The name of the job profile. + + + + + A unique identifier for the management level. + + + + + A unique identifier for the job category. + + + + + A unique identifier for the job family. + + + + + A boolean attribute that returns true if a work shift is required on the position where this job profile is used. + + + + + + Boolean attribute indicating whether the job profile is considered a critical job. + + + + + A unique identifier for the difficulty to fill. + + + + + + + Wrapper for restriction data for openings for all staffing models. + + + + + Date the opening is available. + + + + + Earliest date that a worker can be hired/contracted into this opening. + + + + + Reference(s) to the job families that a worker being hired/contracted using this opening can use. + + + + + Reference(s) (and additional data) to the job profiles that a worker being hired/contracted using this opening can use. + + + + + Reference(s) to the location that a worker being hired/contracted using this opening can use. + + + + + Reference to the worker type that a worker being hired/contracted using this opening can use. + + + + + Reference to the time type that a worker being hired/contracted using this opening can use. + + + + + Reference(s) to the position worker types that the position is restricted by (e.g., Regular, Contractor, Temporary). + + + + + + + Element containing the Job Profile Exempt data for a Job Profile. + + + Only one Job Exempt entry for a Country/Country Region is allowed. This Country/Country Region is entered more than once: [Location Context]. + + + + + + + Contains the reference to the Country Reference or Country Region Reference for this Job Exempt value. Only this reference ID is required to fully specify Country or Country Region. Sibling ID for parent object is not required. + + ISO_3166-1_Alpha-2_Code + + + + + + Returns True if the Job Profile is Exempt for the given Country or Country Region. + + + + + + If True is entered, the Job Exempt for the supplied Country/Country Region reference will be deleted. + + + Delete is selected but the Job Profile does not have a Job Exempt entry for this Country/Country Region as of the effective date. + Job Profile: [profile] + Country/Country Region: [location] + Effective Date: [date] + + + + + + + + Contains data for adding or updating a Company Insider Type + + + Add Only is true but the Company Insider Type ID is already in use. + + + + + + + Reference to an existing Company Insider Type. Only needed when updating the Reference ID for the Company Insider Type. + + + + + Contains data for a Company Insider Type. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Element containing Put Company Insider Type Response Data + + + + + Reference to a company insider type. + + + + + + + + Element containing reference instance for a Company Insider Type + + + + + Reference to a company insider type. + + + + + + + Contains request reference and filter for getting Company Insider Type data. + + + + + + + + + + Element containing Company Insider response elements including received criteria, references, data based on criteria and grouping, results filter and result summary. + + + + + + + + + + + + Wrapper element that includes Company Insider reference instance and Company Insider Type data. + + + + + + + + Element containing company insider type reference and data. + + + + + Reference to a company insider type. + + + + + + + + Utilize the Request Criteria to search for a specific instance(s) of a Workers' Compensation Code + + + + + Reference to the Country for the workers' compensation code. + + + + + Reference to the country region for the workers' compensation code. + + + + + Reference to the location for the workers' compensation code. + + + Location must be of usage Business Site. + Location must be of usage Business Site. + + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Disability and its associated data. + + + + + A unique identifier used to reference an Disability. + + + + + + + Request element for Get Disabilies service task. + + + + + + Request References + + + + + + + + + + Contains the response elements for the Get Disabilities and Put Disability service requests. + + + + + A unique identifier used to reference an Disability. + + + + + Encapsulating element containing all Disability data. + + + + + + + The "Response Data" element contains the core data results based on the inbound request that was processed. + + + + + Reference element representing a unique instance of Disability. Does not support the update of Disability Status. Use Put Applicant web service to update the Disability Status for a Person. + + + + + + + Contains the response elements for the Get Disabilities and Put Disability service requests. + + + + + + + + Encapsulating element containing all Disability data. + + + + + + + + Encapsulating element containing all Disability data. + + + + + The ID for the Disability (Disability_ID). + + + + + The name of the Disability. + + + Name is required. + + + + + + + The code for the Disability. + + + + + The description for the Disability. + + + + + The country the Disability is for. + + + Location (Country or Country Region) is required. + + + + + + + A boolean flag indicating whether the Disability is active or not. + + + + + + + Request element for Put Disability + + + Disability, '[disability]', already exists. + + + + + + + A unique identifier used to reference an Disability. + + + + + Encapsulating element containing all Disability data. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for the Put Disability operation. + + + + + A unique identifier used to reference an Disability. + + + + + + + + Contains data for adding or updating a Job Category. + + + Add Only is true but the Job Category ID is already in use. + + + + + + + Reference to an existing Job Category. Only needed when updating the Reference ID for the Job Category. + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Element containing the Put Job Category response data. + + + + + Reference to a Job Category. + + + + + + + + Element containing reference instance for a Job Category. + + + + + Reference to a Job Category. + + + + + + + Element containing Job Category response elements include received criteria, references, data based on criteria and grouping, results filter and result summary. + + + + + + + + + + + + Wrapper element that includes the Job Category reference instance and data. + + + + + + + + Element containing the job category reference and data. + + + + + Reference to a Job Category. + + + + + + + + Contains data for adding or updating a Work Shift. + + + Add Only is true but the Work Shift ID is already in use. + + + + + + + Reference to an existing Work Shift. Only needed when updating a reference id on the Work Shift. + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Element Containing Put Work Shift Response Data + + + + + Reference to a Work Shift. + + + + + + + + Element containing reference instance for a Work Shift. + + + + + Reference to a Work Shift. + + + + + + + Element containing Work Shift response elements including received criteria, references, data based on criteria and grouping, results filter and result summary. + + + + + + + + + + + + Wrapper element that includes Work Shift reference instance and Work Shift data. + + + + + + + + Element containing work shift reference and data. + + + + + Reference to a Work Shift. + + + + + + + + Contains data for adding or updating a Job Profile. + + + Add Only is true but the Job Profile ID is already in use. + + + + + + + Reference to an existing Job Profile. Only needed when updating the reference id (Job Profile ID or Job Code) for the Job Profile. + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for Put Job Profile. + + + + + Unique Identifier for a Job Profile. Also known as Job Profile ID. + + + + + + + + + Element containing all Job Profile Data. + + + + + Unique Identifier for a Job Profile. Also known as Job Profile ID. + + + You do not have a sequence generator setup. Specify a job code. + + + + + + + On a Put this is the date the change to the Job Profile will take effect. Will default to today if not submitted. + On a Get this is the As of Effective Date specified in the Response Filter or today's date if no request criteria is specified. + During implementation, we recommend using a date of 01-01-1900 for the initial entry. + + + The effective date of the change [date] cannot be earlier than the earliest effective date [early]. + + + + + + + + + + + Element containing Worker's Compensation Code data for a Job Profile. This element does a complete replacement of data based on what is submitted. All Worker's Compensation Codes must be included for an update (unless none will be touched). + + + + + + + + Contains the primary and secondary Questionnaires for internal and external career site for Job Profile. + + + + + + + Element containing the Job Family data for a job profile. + + + + + Reference element representing a unique instance of Job Family. + + + + + + If True is entered, the Job Family will be removed from this Job Profile as of the effective date. + + + Delete is selected but the Job Profile does not have the indicated Job Family. + Job Profile: [profile] + Job Family: [family] + + + + + + + + Element containing Job Classification data for a Job Profile. + + + + + A unique identifier for the job classification. + + + + + + If True is entered, the Job Classification will be removed from the Job Profile as of the effective date. + + + Delete is true but the job profile does not have this job classification as of the effective date. + + + + + + + + Element containing Job Profile Pay Rate Data + + + Only one entry for a Country is allowed. This country is entered more than once: [country]. + + + + + + + Reference to an existing Country + + + + + Reference element representing a unique instance of Pay Rate Type. + + + + + + If True is entered, the Job Profile Pay Rate for the supplied country reference will be deleted. + + + Delete is selected but the Job Profile does not have a pay rate for the supplied country as of the effective date. + Job Profile: [profile] + Country: [country] + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Job Profile and its associated data. + + + + + A unique identifier for the job profile. + + + + + + + + Utilize the Request Criteria element to limit the Job Profiles returned based on the specific criteria. Job Profiles that are returned must meet all of the criteria specified. + + + + + + The identifier of an existing Event. + + + + + The unique identifier of a Job Family or a Job Family Group. If a Job Family Group is submitted, any Job Profile that has a Job Family that is part of that Job Family Group will be returned. + + + + + A unique identifier for the management level. + + + + + A unique identifier for a job level. + + + + + A unique identifier for the job category. + + + + + Company Insider Type ID. This is the unique identifier for a company insider type. + + + + + A unique identifier for the job classification. + + + + + A unique identifier for a job classification group. + + + + + Workers' Compensation Code Reference ID. This is the unique identifier for a Workers' Compensation Code. + + + + + A unique identifier of a work hours profile. + + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request, then all groups will be returned. If the Response Group element is returned, you can select which sections of data to include in the response. + + + + + Indicates if the Reference element for the job profile is included in the response. + + + + + Indicates if the basic job profile information is included in the response. + + + + + Indicates if the Job Classification Data is included in the response. + + + + + Indicates if the Job Profile Pay Rate Type element is included in the response. + + + + + Indicates if the Job Profile Job Exempt element is included in the response. + + + + + Indicates if the workers' compensation code data is included in the response. + + + + + Indicates if the Responsibility Qualifications element is included in the response. + + + + + Indicates if the Work Experience Qualifications element is included in the response. + + + + + Indicates if the Education Qualifications element is included in the response. + + + + + Indicates if the Language Qualifications element is included in the response. + + + + + Indicates if the Competency Qualifications element is included in the response. + + + + + Indicates if the Certification Qualifications element is included in the response. + + + + + Indicates if the Training Qualifications element is included in the response. + + + + + Indicates if the Compensation Rules using the Job Profile are included in the response. + + + + + Indicates if the Skills associated with the Job Profile are included in the response. + + + + + Indicates if the Questionnaires associated with the Job Profile are to be included in the response. + + + + + + + Request element used to find and get Job Profiles and their associated data. + + + + + + + + + + + + Contains each Job Profile based on the Request References or Request Criteria. The data returned is the current information as of the dates in the response filter, and does not include all historical information about the job profile. + + + + + + + + Response element containing an instances of job profiles and their associated data. + + + + + + + + + + + + + + Element containing the Company Insider Type data for a job profile. + + + + + Reference to a company insider type. + + + + + + If True is entered, the Company Insider Type will be removed from this Job Profile as of the effective date. + + + Delete is true but the job profile does not have this company insider type. + Job Profile: [profile] + Company Insider Type: [type] + + + + + + + + Replacement element containing Competency Qualifications for the Job Profile + When updating a Job Profile, all Competencies for the Job Profile will be replaced by the submitted data. If no data is submitted, then the existing Competencies are not changed. + + + + + Reference element representing a unique instance of Competency. + + Competency_ID + + + + + + Reference element representing a unique instance of Proficiency Rating Behavior. + + + + + Boolean which identifies if the Competency is required for the Job Profile. + + + + + + + Replacement element containing Education Qualifications for the Job Profile + When updating a Job Profile, all Education Qualifications for the Job Profile will be replaced by the submitted data. If no data is submitted, then the existing Education Qualifications are not changed. + + + Select a Degree that isn't already in use for this Field of Study. + + + + + + + Unique identifier of a Degree. + + + + + Unique identifier of a Field of Study. + + + + + Boolean attribute identifying whether Education Qualification Profile is required for Job. + + + + + + + Replacement element containing Training Qualifications for the Job Profile + When updating a Job Profile, all Training Qualifications for the Job Profile will be replaced by the submitted data. If no data is submitted, then the existing Training Qualifications are not changed. + + + Training Type is required. + + + Training Name is required. + + + + + + + Text attribute identifying name of Training Program/Class. + + + + + Text attribute identifying description of Training Program/Class. + + + + + Reference to the Training Type (Example: Instructor-led, Online) + + + + + Boolean attribute identifying whether Training Qualification Profile is required for Job. + + + + + + + Replacement Element containing Responsibility Qualifications for the Job Profile. + When updating a Job Profile, all Responsibilities for the Job Profile will be replaced by the data in being submitted. If no data is submitted, then the existing Responsibilities are not changed. + + + + + Text attribute identifying a description of the Responsibility. + + + + + Boolean attribute identifying whether the Responsibility is required. + + + + + + + Replacement element containing Work Experience Qualifications for the Job Profile + When updating a Job Profile, all Work Experiences for the Job Profile will be replaced by the submitted data. If no data is submitted, then the existing Work Experiences are not changed. + + + + + Unique identifier of a Work Experience. + + + + + Unique identifier of a Work Experience Rating. + + + The rating is not valid for this work experience. + Work Experience: [work] + Rating: [rating] + + + + + + + Boolean attribute identifying whether Work Experience Qualification Profile is required for Job. + + + + + + + Replacement element containing Certification Qualifications for the Job Profile + When updating a Job Profile, all Certifications for the Job Profile will be replaced by the submitted data. If no data is submitted, then the existing Certifications are not changed. + + + As of v13, certification name is no longer required. You may submit a certification reference or name. + You must either submit a Certification Reference or a Certification Name and Issuer. + + + You must first select Enable Specialties for Certifications on the Maintain Skills and Experience Setup task. + + + You must either submit a Certification Reference or a Certification Name and Issuer. + + + + + + + The country (reference) where the certification was issued. + + + + + The certification reference identifying the certification. + + + + + Text attribute identifying name of Certification. + + + + + Text attribute identifying Issuer of Certification. + + + + + Boolean attribute identifying whether Certification Qualification Profile is required for Job. + + + + + + + + Replacement element containing Language Qualifications for the Job Profile. When updating a Job Profile, all Languages for the Job Profile will be replaced by the submitted data. If no data is submitted, then the existing Languages are not changed. + + + A language profile ability is required. + + + Duplicate language entries are not allowed. + + + + + + + Unique identifier of a Language + + + + + + Boolean attribute identifying whether Language Qualification Profile is required for Job. + + + + + + + Element containing the language ability type and proficiency for a Job Profile Language Qualfication language. + + + Select a different Language Ability Type; this one is already in use for the language. + + + + + + + Unique identifier of a Language Ability Type. + + + + + Unique identifier of a Language Proficiency + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Ethnicity and its associated data. + + + + + A unique identifier used to reference an Ethnicity. + + + + + + + Request element for Get Ethnicities + + + + + + + + + + + + Encapsulating element containing all Ethnicity data. + + + + + A unique identifier used to reference an Ethnicity. + + + + + Contains the detailed information about an Ethnicity. + + + + + + + Response element for Get Ethnicities + + + + + Encapsulating element containing all Ethnicity data. + + + + + + + Response element for Get Ethnicities + + + + + + + + + + + + Contains the detailed information about an Ethnicity. + + + + + Reference ID (Ethnicity_ID) + + + + + The name of the Ethnicity. + + + Name is required. + + + + + + + The code for the Ethnicity. + + + + + The description of the Ethnicity. + + + + + The country the ethnicity is for. + + + Location (Country or Country Region) is required. + + + + + + + This is the Workday Owned Ethnicity mapping for this Ethnicity. + + + + + Flag indicating that the ethnicity is no longer used + + + + + + + Request element for Put Ethnicity + + + Ethnicity, [ethnicity], already exists. + + + + + + + A unique identifier used to reference an Ethnicity. + + + + + Contains the detailed information about an Ethnicity. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for Put Ethnicity + + + + + A unique identifier used to reference an Ethnicity. + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Training Type and its associated data. + + + + + A unique identifier used to reference a Training Type. + + + + + + + Request element for Get Training Types + + + + + + + + + + + + Training Type Response Data + + + + + A unique identifier used to reference a Training Type. + + + + + Contains the detailed information about a Training Type. + + + + + + + Response element for Get Training Types + + + + + Encapsulating element containing all Training Type data. + + + + + + + Response element for Get Training Types + + + + + + + + + + + + Request element for Put Training + + + + + Reference ID (Training_Type_ID) + + + + + The name of the Training Type. + + + Name is required. + + + + + + + Indicates if the training type is inactive. If a training type is inactive, it will no longer be allowed to be selected when a user enters or updates their training. + + + + + + + Request element for Put Training + + + Training Type, with ID [id], already exists as [training type] + + + + + + + A unique identifier used to reference a Training Type. + + + + + Contains the detailed information about a Training Type. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for Put Training Type + + + + + A unique identifier used to reference a Training Type. + + + + + + + + Contains the basic job profile information. + + + This Job Title along with one or more Job Families combination is already in the system. Combination of Job Title and Job Family has to be unique in the system. + + + You can’t load the Additional Job Description because the Recruiting functional area isn’t enabled. + + + + + + + Boolean attribute indicates if the Job Profile is inactive. + + + + + The name of the job profile. + + + Job Profile Name is required. + + + + + + + Boolean attribute identifying whether Job Code should be included in Name (Display ID within Workday). + + + + + Private Job Profile Title. This field is the same as Job Title Default in the online page. + + + + + Text attribute identifying Job Profile Summary. + + + + + Rich text attribute identifying Job Profile Job Description. + + + + + Additional Job Description is only active in Workday when you have the Recruiting functional area enabled. It’s a way to create an alternate Job Description for use in job postings. Example: use Job Description for external job postings and Additional Job Description for internal job postings. + + + + + Boolean attribute indicating whether a work shift is required for workers in this job profile. + + + + + Boolean attribute indicating whether the job profile is considered a public job. + + + + + Reference element representing a unique instance of Management Level. + + + + + Reference to a Job Category. + + + + + Reference to a job level for a job profile + + + + + + + Reference for an Active Referral One-Time Payment Plan + + + [payment plan] is inactive and will not be used for Referral Payments using this Job Profile. + + + You can't enter referral payment plans because you haven't enabled Workday Recruiting. + + + Only Referral Payment Plans with their category set to "Referral" can be used. + + + Only amount based Referral Payment Plans can be used. + + + + + + + Boolean attribute indicating whether the job profile is considered a critical job. + + + + + Reference to a difficulty to fill. + + + + + Restrict to Country Reference + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Job Classification Group and its associated data. + + + + + A unique identifier used to reference a Job Classification Group. + + + + + + + Get Job Classification Group Response Group + + + + + Include Reference + + + + + A boolean attribute to indicate whether to include Job Classifications within a Job Classification Group in the WS response. When the boolean is set to 0 or false none of the Job Classifications will be returned. The default value is 1 or true. + + + + + + + Request Element for Get Job Classification + + + + + + + + + Get Job Classification Group Response Group + + + + + + + + Element containing the Job Classification Group response data + + + + + Encapsulating element containing all Job Classification Group data. + + + + + + + Response Element for Get Job Classification Groups + + + + + + + + + + + + + Job Classification Group Data Element + + + + + Job Classification Group ID + + + + + Effective Date. A new effective-dated organization name is automatically created if any attributes used for organization name are different as of specified effective date which include: Organization Name, Organization Code, and Include 'xx' in Name booleans. + + + The effective date of the change [date] cannot be earlier than the earliest effective date [early]. + + + + + + + The name of the Job Classification Group. + + + Name is required. + + + + + + + Metadata value the job classification group maps to. + + + + + Location Reference. Reference to a Country or Country Region. + + + + + Inactive Flag. + + + + + Job Classification Element + + + + + + + Job Classification Group Data + + + Job Classification Data needs to be included unless Delete is True. + + + Job Classification Data cannot be included if Delete is True. + + + If Delete is True, a Job Classification Reference must be included. + + + + + + + A unique identifier use to reference a Job Classification. + + + + + Job Classification Data + + + + + + Flag indicating that the referenced data should be deleted. + + + Job Classification cannot be deleted because it is in use. Please set it to inactive. + + + + + + + + Job Classification Data Element + + + + + Unique Identifier for a Job Classification. On a new entry, this will become the Reference ID. When updating an existing Job Classification, you can enter a new value here to change the Reference ID. + + + + + A text value for the Job Classification ID. This is usually defined by the outside agency that sets the Job Classification in the group. It does not need to be unique. + + + Identifier ID is Required + + + + + + + Job Classification Description + + + + + The Workday Owned metadata value the job classification maps to + + + + + Inactive Flag. + + + + + + + Request Element for Put Job Classification Group + + + Job Classification Group ID already exists for '[job classification group]' + + + + + + + A unique identifier used to reference a Job Classification Group. + + + + + Contains the detailed information about a Job Classification Group. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for Put Job Classification + + + + + A unique identifier used to reference a Job Classification Group. + + + + + + + + Contains all the Goal Details (Review Goals and Worker Goal Details) for a Worker. + + + + + Contains a single Goal Detail (either Review Goal or Worker Goal Detail) and its Notes and History. + + + + + + + Contains a single Goal Detail (Review Goal or Worker Goal Detail) and the Notes and History. + + + + + Contains the Reference ID for the shared Goal for which this Goal Detail provides a new snapshot. + + + + + Contains the Name of the Goal that is the primary way the Goal is identified to the User. + + + + + Contains an optional Description to expand on the Goal Name and which can contain rich text formatting online but the rich text formatting is removed for this response. + + + + + Contains an optional reference to an Organization Goal which this Goal Detail supports. + + + + + Contains the Date that the Goal is Due to be completed. + + + + + Contains an optional reference to a Completion Status that indicates progress of the goal. + + + + + Contains the date the Goal was completed. + + + + + + + The Job Family reference(s) to be retrieved. + + + + + Reference element representing a unique instance of Job Family. + + + + + + + + Job Family Response Group + + + + + Flag indicating if the reference to the Job Family should be included. If omitted, the default is to return the references. + + + + + Flag indicating whether or not to include the basic data about Job Profiles that are used by the Job Families associated with the group. Default is to not return this additional information. + + + + + + + Request element for Get Job Families + + + + + The Job Family reference(s) to be retrieved. + + + + + + + Job Family Response Group which controls the type and amount of data returned. + + + + + + + + Contains Job Family information + + + + + Reference element representing a unique instance of Job Family. + + + + + + + + Job Family Response Data containing the retrieved Job Family information + + + + + contains the retrieved Job Family information + + + + + + + Response element for Get Job Families. + + + + + + + + + + + + + + Request element for Put Job Family + + + Job Family, '[job family]', already exists. + + + + + + + Reference element representing a unique instance of Job Family. + + + Job Family reference, '[job family group]', is a Job Family Group, not a Job Family. + + + + + + + Data to be used for adding a new Job Family or updating an existing Job Family. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for Put Job Family + + + + + Reference element representing a unique instance of Job Family. + + + + + + + + Contains the reference to the Goal Detail and all the Goal Data payload. + + + + + Reference to the Goal Detail. + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Job Family Group and its associated data. + + + + + A unique identifier used to reference a Job Family Group. + + + + + + + + Get Job Family Group Response Group + + + + + Flag indicating if the reference to the Job Family Group should be included. If omitted, the default is to return the references. + + + + + Flag indicating whether or not to include the basic data about Job Profiles that are used by the Job Families associated with the group. Default is to not return this additional information. + + + + + + + Request element for Get Job Family Groups + + + + + + + + + + + + + Response element for the Get Job Family request + + + + + + + + Response element for the Get Job Family Group request + + + + + Utilize the Request References element to retrieve a specific instance(s) of Job Family Group and its associated data. + + + + + + Contains settings to control the type and amount of data returned by the request. + + + + + + + + + + Job Family Data. Contains the references to Job Families contained in the group. Optionally contains other data about the contained families, however this extra data is for information only and cannot be updated here. + + + + + Reference element representing a unique instance of Job Family. + + + + + Optional, read-only, data about the job family. This extra information is optionally provided on the Get operation. + + + + + + Flag indicating that the association of the given Job Family should be removed from the group. + + + + + + Request element for Put Job Family Group + + + Job Family Group ID already exists for '[job family group]'. + + + + + + + A unique identifier used to reference a Job Family Group. + + + Job Family Group reference, '[job family]', is a Job Family, not a Job Family Group. + + + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for the Put Job Family Group + + + + + Reference element representing a unique instance of Job Family Group. + + + + + + + + Info only data about a Job Family + + + + + The name of the Job Family. + + + + + A summary description of the Job Family. + + + + + Boolean attribute indicating if a Job Family/Job Family Group is Inactive or not. Inactive Job Families/Groups will not appear in prompts. + + + + + Optional, Information only, Job Profile data. This data is optionally included here and cannot be updated. + + + + + + + Data element containing summary compensation information for a worker converted to their pay group frequency. + + + + + Amount representing the total base pay for the worker in the currency and frequency specified. + + + + + + + + + + + Amount representing the total salary and allowances for the worker in the currency and frequency specified. + + + + + + + + + + + Amount representing the primary compensation basis for the worker in the currency and frequency specified. + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + + + Wrapper element for Internal Project Experience information. + + + + + Reference to the Internal Project Experience. + + + + + Wrapper element for the Internal Project Experience information. + + + + + + + Wrapper element for the Internal Project Experience information. + + + Only one change can be in progress (the event in progress and not complete or canceled) for an internal project experience for a particular worker. + There is an in progress event for this worker for the internal project experience: [project]. Only one in progress event is allowed. + + + + + + + Internal Project Experience ID. If no value is provided, a new internal project experience will be created. If a value is passed in an a corresponding internal project experience is not found, a new internal project experience will be created with the provided id. + + + + + Used for inbound operations to indicate that the internal project experience should be removed for the person. Will always return false for outbound operations. + + + Remove Internal Project Experience is true without an Internal Project Experience or valid Internal Project Experience ID. An Internal Project Experience or valid Internal Project Experience ID must be specified in order to remove the Internal Project Experience. + + + + + + + The name of the project. Required unless the project is being removed. + + + Internal Project must be specified unless the Internal Project Experience is being removed. + + + + + + + The project description. + + + + + The date the project started. + + + + + The date the project ended. + + + The End Date must be on or after the Start Date + + + + + + + The project leader. This field is free entry and is not tied in any way to any employee or other person in the system. + + + + + + + Element containing reference to a specific Location. + + + + + Reference to a specific Location to return. + + + + + + + + Element containing filtering criteria to specify the Location to return in the response. + + + + + Location Name for the request criteria. + + + + + Reference to the usage of the Location. (e.g. Business Site, Work Space, etc.) + + + + + The location type associated with the location that ties to the usage that has been setup. + + + + + + Excludes inactive locations from being returned in the response. + + + + + Excludes active locations from being returned in the response. + + + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request, then all groups will be returned. + + + + + Indicates whether the Reference is included in the response. + + + + + Indicates whether the Location Data element is included in the response. + + + + + + + Contains each Location based on the Request Reference or Request Criteria. The data returned is the current information as of the dates in the response filter, and does not include all historical information about the Location. + + + + + + + + Response element containing an instance of Location and its associated data. + + + + + A unique identifier for the Location. + + + + + + + + Contains data for adding or updating a Location. + + + Location already exists. + + + + + + + Reference to an existing Location. Only needed when updating the Reference ID for the Location. + + + + + Element containing all Location data. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for Put Location operation. + + + + + A unique identifier for the Location. + + + + + + + + + Wrapper element for Education Data. + + + + + Reference to a role + + Employee_ID + + Element Content 'Role_Reference' is required, on internal element 'Manage Education Data for Role' + + + + + + + Reference to the source of the skill. + + + + + + + + Wrapper element for Professional Affiliation Data. + + + + + Role Reference + + + Element Content 'Role_Reference' is required, on internal element 'Manage Professional Affiliation Data for Role' + + + + + + + Reference to the source of the skill. + + + + + + + + Wrapper element for Education information. + + + + + The reference to the education profile. + + + + + + + + Wrapper element for Education information. + + + The request must contain either a School Reference ID or School Name. + + + Only one change can be in progress (the event in progress and not complete or canceled) for an education for a particular worker. + There is an in progress event for this worker for the education: [education]. Only one in progress event is allowed. + + + If you submit Date Degree Received, the Degree Completed Reference must have a value of Yes. + + + In one or more cases, the degree selected for a worker is not available in the country where the degree was earned. Please make sure to only select degrees that are available in the country that the school is in. + + + If you submit School Name, Country field must have a value. + + + Enter the First Year Attended. + + + Enter a Last Year Attended that is after the First Year Attended. + + + Enter the Last Year Attended. + + + + + + + Education ID. If no value is provided, a new education will be created. If a value is passed in and a corresponding education is not found a new education will be created with the provided id. + + + + + Used for inbound operations to indicate that the education should be removed for the person. Will always return false for outbound operations. + + + Remove Education is true without an Education or valid Education ID. An Education or valid Education ID must be specified in order to remove the Education. + + + + + + + The Reference of the Country in which the school is located. If the Country Reference and School Name matches an entry from the Schools report, this reference will not be set; a School Reference will be used instead. + + + + + The Reference of the School where the education was received. The Schools report returns all of the schools that can be referenced. + + + + + The name of the education institution. + + + + + A Reference of the of School Type. If a School Reference is submitted, or found by a matching Country Reference and School Name, this value will not be saved because the School Reference is linked to a School Type. + + + + + The text location of the education institution. If a School Reference is submitted, or found by a matching Country Reference and School Name, this value will not be saved. + + + + + The degree earned. + + + + + Indicates whether the degree was received. + + + + + The date on which the degree was awarded. + + + + + The field of study. + + + + + The grade point average. + + + + + The first year of attendance. This field should be in YYYY-MM-DD format, however the month and day will be ignored. + + + + + The last year of attendance. Should be displayed in YYYY-MM-DD format, but the month and day will be ignored. + + + + + Indicates whether this is the worker's highest level of education. Degrees are ranked using Qualification Rating Value. If a worker has two or more equivalent degrees, the most recent one is considered highest. + + + + + The first date of attendance using day month year precision. Note this can only be + populated when the Education is for a Worker in a Country that has been configured to 'Use Date with Day Precision + for Education' on Tenant Setup - Global. + + + + + The last date of attendance using day month year precision. Note this can only be populated when the Education is for a Worker in a Country that has been configured to 'Use Date with Day Precision for Education' on Tenant Setup - Global. + + + + + + + Response element containing an instance of Job Profile and its associated data. + + + + + A unique identifier for the job profile. + + + + + + + + Contains the additional benefits data for an employee. + + + + + Contains the additional benefits period data for an employee based on the benefit plan year. + + + + + + + Contains the additional benefits period data for an employee based on the benefit plan year. + + + + + Contains the benefit plan year information. + + + + + Contains the additional benefits coverage information (elections) for an employee. + + + + + + + Contains the additional benefits coverage information (elections) for an employee. + + + + + A reference to the coverage target elected. + + + + + The first date that coverage began for this type of coverage. + + + + + The election information for the coverage. + + + + + + + + + Element containing the qualification data for a Position Restriction or Job Profile. + + + + + + + + + + + + + + + Wrapper element for Responsibility Qualifications. Allows all responsibility qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing qualifications with those sent in the web service. + + + If Delete is yes, do not send any qualifications in the Responsibility Qualification Replacement Data element. All responsibilities will be deleted for the Position Restriction or Job Profile. + + + + + + + + + Enter yes to delete all responsibility qualifications for the Position Restriction or Job Profile. Do not send any additional responsibility qualifications. + + + + + + Wrapper element for Work Experience Qualifications. Allows all work experience qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing work experience qualifications with those sent in the web service. + + + If Delete is Yes, do not send any qualifications in the Work Experience Qualification Replacement Data element. All work experience data will be deleted for the Job Profile or Position Restriction. + + + Duplicate experience entries are not allowed. + + + + + + + + + Enter yes to delete all work experience qualifications for the Position Restriction or Job Profile. Do not send any additional work experience qualifications. + + + + + + Wrapper element for Education Qualifications. Allows all education qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing education qualifications with those sent in the web service. + + + If Delete is Yes, do not send any qualifications in the Education Qualification Replacement Data element. All education data will be deleted for the Job Profile or Position Restriction. + + + + + + + + + Enter yes to delete all education qualifications for the Position Restriction or Job Profile. Do not send any additional education qualifications. + + + + + + Wrapper element for Language Qualifications. Allows all language qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing language qualifications with those sent in the web service. + + + If Delete is Yes, do not send any qualifications in the Language Qualification Replacement Data element. All language data will be deleted for the Job Profile or Position Restriction. + + + + + + + + + Enter yes to delete all language qualifications for the Position Restriction or Job Profile. Do not send any additional language qualifications. + + + + + + Wrapper element for Competency Qualifications. Allows all competency qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing competency qualifications with those sent in the web service + + + If Delete is Yes, do not send any qualifications in the Competency Qualification Replacement Data element. All competency data will be deleted for the Job Profile or Position Restriction. + + + Select a Competency that isn't already in use. + + + + + + + + + Enter yes to delete all competency qualifications for the Position Restriction or Job Profile. Do not send any additional competency qualifications. + + + + + + Wrapper element for Certification Qualifications. Allows all certification qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing certification qualifications with those sent in the web service + + + If Delete is Yes, do not send any certifications in the Certification Qualification Replacement Data element. All certification data will be deleted for the Job Profile or Position Restriction. + + + + + + + + + Enter yes to delete all certification qualifications for the Position Restriction or Job Profile. Do not send any additional certification qualifications. + + + + + + Wrapper element for Training Qualifications. Allows all training qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing training qualifications with those sent in the web service. + + + If Delete is Yes, do not send any data in the Training Qualification Replacement Data element. All training data will be deleted for the Job Profile or Position Restriction. + + + + + + + + + Enter yes to delete all training qualifications for the Position Restriction or Job Profile. Do not send any additional training qualifications. + + + + + + Wrapper for Government Identification Data. Includes National Identifiers and Government Identifiers. + + + + + Wrapper element for all National Identifier Data. + + + + + Wrapper element for all Government Identifier Data. + + + + + + If Replace All is set to True, a full sync will be performed once the web service is submitted. + + + + + + Wrapper element that contains position's international assignment information + + + + + This is the assignment type that is associated with the international assignment position. + + + + + Contains the reason from this position's Start International Assignment business process. + + + + + This is the date that you would expect the international assignment to end. + + + + + Contains the host country for worker's international assignment + + + + + Contains the home country for worker's primary job + + + + + + + Wrapper for Passports and Visas Identification Data. Includes Passport Identifiers and Visa Identifiers + + + + + Wrapper for Passport Identifier data. + + + + + Wrapper element for all Visa Identifier Data. + + + + + + If Replace All is set to True, a full sync will be performed once the web service is submitted. + + + + + + Wrapper element that contains basic information of worker's international assignment if any. + + + + + If the value is yes, it indicates that worker has internaitonal assignment + + + + + Contains the host countries for worker's international assignment job(s) + + + + + Contains the home country for worker's primary job + + + + + + + Wrapper for License Identification Data. Includes License Identifiers. + + + + + + + If Replace All is set to True, a full sync will be performed once the web service is submitted. + + + + + + Wrapper for Custom Identification Data. Includes Custom Identifiers. + + + + + Wrapper element for all Custom Identifier Data. + + + + + + If Replace All is set to True, a full sync will be performed once the web service is submitted. + + + + + + Contains the employee's contract information. + + + + + Contains data for an Employee Contract. + + + + + + + Contains the components of a name in local script, such as the First Name and Last Name, for supporting countries. + + + + + Contains first name in local script, which is generally configured to as Given Name, for supporting countries. + + + + + Contains middle name in local script for supporting countries. + + + + + Contains last name in local script, which is generally configured to as Family Name, for supporting countries. + + + + + Contains secondary last name in local script, which is generally configured to as Maternal Family Name, for supporting countries. + + + + + Contains first name in second local script, which is generally configured to as Given Name, for supporting countries. + + + + + Contains middle name in second local script for supporting countries. + + + + + Contains last name in second local script, which is generally configured to as Given Name, for supporting countries. + + + + + Contains secondary last name in second local script, which is generally configured to as Maternal Family Name, for supporting countries. + + + + + + Contains the formatted local name in local script as configured for the country. + + + + + Contains the formatted local script name which contains the ISO code and name. + + + + + + Contains the employee's feedback received + + + + + Contains the informational components of a feedback (comment, date, question asked, sender, requester, and type). + + + + + + + Contains the informational components of a feedback (comment, date, question asked, sender, requester, and type). + + + + + The worker who sent the feedback or displayed as anonymous + + + + + The worker who requested the feedback + + + + + The feedback type + + + + + The date when feedback was submitted + + + + + Element for Feedback Comments and Questions. There can be multiple questions per request, thus multiple comments per feedback given. + + + + + + + Contains the components of a name in local script, such as the First Name and Last Name, for supporting countries. + + + + + Contains first name in local script, which is generally configured to as Given Name, for supporting countries. + + + + + Contains middle name in local script for supporting countries. + + + + + + + Contains the formatted local name in local script as configured for the country. + + + + + Contains the formatted local script name which contains the ISO code and name. + + + + + + Encapsulating element for all Local Last Name data, for countries supporting Last Name or Secondary Last Name in local script. + + + + + + Type of Last Name (e.g. Hereditary, Secondary, etc.) + + + + + + + + Encapsulating element containing all Job Family Group data + + + + + This is the reference id of the Job Family Group (Job_Family_Group_ID). + + + Job Family, '[job family]' specified where Job Family Group expected. + + + + + + + Effective date of Job Family Group + + + The effective date of the change [date] cannot be earlier than the earliest effective date [early]. + + + + + + + Text attribute identifying Job Family Group Name. This can be used for compensation and benefits eligibility rules. + + + Name is required. + + + Another Job Family or Job Family Group is already using this name. + + + + + + + Text attribute identifying Job Family Group Summary. + + + + + Boolean attribute indicating if a Job Family/Job Family Group is Inactive or not. Inactive Job Families/Groups will not appear in prompts. + + + + + Job Family Data. Contains the references to Job Families contained in the group. Optionally contains other data about the contained families, however this extra data is for information only and cannot be updated here. + + + + + + + References to Difficulty to Fill + + + + + References to Difficulty to Fill + + + + + + + The request component of the Get Difficulty to Fill web service task. + + + + + + Contains the references to difficulty to fill + + + + + + + + + + Response element for difficulty to fill. + + + + + References to Difficulty to Fill. + + + + + + + Container for the difficulty to fill data. + + + + + + + + Container for the difficulty to fill data. + + + + + Difficulty to Fill + + + + + + + Difficulty to Fill + + + + + A unique identifier for the difficulty to fill. + + + + + Container for the difficulty to fill data. + + + + + + + Container for the difficulty to fill data. + + + + + Optional line order. If specified, lines will be sorted by this value when displayed and when invoice is printed. + + + + + Name of the difficulty level. + + + + + A unique identifier for the difficulty to fill. + + + + + Description of the difficulty level. + + + + + Whether or not the difficulty is inactive or not. + + + + + + + The request component of the Put Difficulty to Fill web service task. + + + + + A unique identifier for the difficulty to fill. + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. If an existing instance is found and this flag is set there will be an error. + + + + + + + Response element for difficulty to fill. + + + + + A unique identifier for the difficulty to fill. + + + + + + + + Element containing the Job Profile reference for a Job Family. + + + + + A unique identifier for the job profile. + + + + + + If True is entered, the job profile reference will be deleted. + + + + + + Court Order Details. NOTE: You must pass in the entire set of court orders. Any existing court orders that are not submitted will be removed. + + + Benefit coverage type is not valid for specified benefit contact. Please ensure that the benefit contact is eligible for the coverage type. + + + + + + + Enforce court order for this benefit coverage type. + + + + + Enforce court order starting on this date. + + + + + Stop enforcing court order on this date. + + + + + + + Contains the worker's user account information (user name, preferred language). + + + + + The user name that is used to sign on to the Workday application. + + + + + The preferred language for the user account. + + + + + The preferred locale for the user account. + + + + + The preferred currency for the user account. + + + + + The preferred time zone for the user account. + + + + + The default display language is derived by the system from the employee data. It is overridden by the User Language Reference value if it exists. + + + + + + + Contains the information about the employee's willingness to relocate as part of their job. + + + + + Indicates if an employee is willing to relocate in the short term to another geographic location as part of their job. + + + + + A reference to the geographic area that the employee is willing to relocate to as part of their job. This is only valid when the employee is willing to relocate (Willing to Relocate = Yes or Maybe). + + + + + Indicates if an employee is willing to relocate in the long term to another geographic location as part of their job. + + + + + A reference to the geographic area that the employee is willing to relocate to as part of their job. This is only valid when the employee is willing to relocate (Willing to Relocate = Yes or Maybe). + + + + + More information about why (or why not) the employee is willing to relocate as part of their job. + + + + + + + Data element containing summary compensation information for the worker in an hourly frequency when the worker has at least one hourly pay plan assigned. + + + + + Amount representing the total base pay for the worker in the currency and frequency specified. + + + + + + + + + + + Reference element representing a unique instance of Currency. + + + + + Reference element representing a unique instance of Frequency. + + + + + + + Contains Worker Request References and filter for getting Worker Photo Image data + + + + + + + + + + Element containing Get Worker Photo response elements including received criteria, references, and response data. + + + + + + + + + + + + Wrapper Element that Contains Worker References and Worker Photo Data + + + + + Element Containing Worker Reference and Photo Data. + + + + + + + Element Containing Worker Reference and Photo Data. + + + + + Reference to a Worker. + + + + + Element Containing Worker Reference and Photo Data. + + + + + + + Contains data for Adding/Updating a workers photo, + + + + + Reference to a Worker. + + + + + + + + + Element containing Put Worker Photo Response Information. + + + + + Worker Reference + + + + + + + + Element containing specific union membership dates and details. + + + Union Start Date cannot be after the End Date + + + + + + + Start Date of union membership. + + + + + End Date of the union membership. + + + + + Membership Type Reference. + + + '[member type name]' is not a valid membership type for [union] + + + + + + + Notes Pertaining to the union membership. + + + + + + + Element containing a single union member with associated membership details. + + + Membership dates overlap or are invalid in relation to one another. + + + + + + + Worker Reference that is enrolled in the union. + + + + + Union Reference of the Union that a worker is enrolled in. + + + + + Seniority Date of the Union Member + + + + + + + + Top Level Request element containing the information needed to create a new union member instance. + + + + + + + + + + Contains the response data for the Put Union member WS. Returns the Union Membership Event Reference info for the instance created. + + + + + Contains References for the Union Membership Event. + + + + + + + + Request References + + + + + Academic Rank Reference + + + + + + + Request Criteria + + + + + Request element for Get Academic Rank + + + + + + Request References + + + + + Request Criteria + + + + + + Response Filter + + + + + + + + Academic Rank Element + + + + + Academic Rank Reference + + + + + + + + Container for all the detail information about the Academic Rank + + + + + Academic Rank Element + + + + + + + Response Element for Get Academic Unit + + + + + Request References + + + + + Request Criteria + + + + + Response Filter + + + + + Response results for Get Academic Rank Web Service + + + + + Container for all the detail information about the Academic Rank + + + + + + + + Container for all the detail information about the Academic Rank + + + + + A Reference ID for the Academic Rank generated by Workday and used for internal purposes only + + + + + The Name of the Academic Rank + + + An Academic Rank already exists with this name. + + + + + + + The description of the Academic Rank + + + + + Academic Rank Emeritus Status + + + + + Academic Rank Order + + + + + + + + + + + + Job Profiles to be associated with the Academic Rank + + + Validation Error: Occurs when Job Profile that is selected is inactive + The Job Profile selected is inactive. Please choose another Job Profile. + + + + + + + Metadata Academic Rank Reference + + + + + Indicates whether or not the Academic Rank is considered Inactive. If set, the static text (inactive) will be appended to the Academic Rank's default display ID (Academic Rank Name). + + + + + + + Request element for the Put Academic Rank Request + + + Add Only is true but Academic Rank Title ID is already in use. + + + + + + + A reference to Academic Rank + + + + + Container for all the detail information about the Academic Rank + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for the Put Academic Rank Response + + + + + A reference to Academic Rank + + + + + + + + Contains the current career information for an employee. This includes the travel and relocation preferences, job profiles the employee is interested in, and their career interests + + + + + + + + + + + Element containing the specifics for the academic appointment being added or updated. An academic appointment tracks an academic worker’s time at a university or college. + + + Update Date must be prior to the Academic Appointment End Date + + + The key Reference ID for the Academic Appointment Track/Thread is required for an Update Academic Appointment request. + + + Appointment Tracks with an In-Progress event cannot be updated or ended until the In-Progress event is completed or cancelled + + + + + + + The reference to the Academic Appointment Thread being updated. Leave blank in an Add Academic Appointment task. Required for an Update. + The appointment reference is assigned during the Add Academic Appointment business process that created the appointment thread. + + + The academic appointment isn’t valid for this appointee. + + + + + + + The unique identifier for the Academic Appointment Track. This is used when you want to manually assign or update the Appointment Track ID. + + + The Academic Appointment Track ID you specified is already in use. + + + + + + + The Academic Track Type for the appointment. + + + Academic Track Type is required for Add Academic Appointment. + + + Updates to Academic Track Type are not allowed for Update Academic Appointment + + + Inactive Academic Track Types are not allowed. + + + This Academic Track Type is not allowed by the Academic Unit. + + + The Academic Track Type Category for this Track Type is set to Inactive. + + + + + + + Reference for the Appointment Identifier that indicates the type of appointment; for example, could be primary, joint, or dual. Only one of an academic’s active appointments may be assigned an Identifier with a Identifier Description marked as Primary. On an update, the existing value will be retained if not sent. + + + + + A Position, filled by the Worker, for the Academic Appointment. Note: This field only accepts Positions that are already filled. You cannot use a the same Position from a Hire or Add if this is a sub-process. + + + [position] is not currently a valid Position for worker [worker]. + + + + + + + Reference for the Academic Unit for the Appointment assignment. On an update, the existing value will be retained if not sent. + + + Select an Academic Unit that is available as of [Start Date]. + + + Select an Academic Unit that is available as of [Start Date]. + + + + + + + Percent ownership of the academic by the appointment’s Academic Unit (0.00 - 1.0). May be blank or zero; for example, for centers and institutes. On an update, the existing value will be retained if not sent. + + + Roster Percent cannot be greater than 100 percent (1.0). + + + + + + + + + + + + + + Date the Add Appointment or Update Appointment business process entries take effect. + Will not default from the existing value on an update. Will default from the parent business process when this is a sub process. + + + + + Informational date that tracks the term of the Appointment. Will be blank when an academic is holding a tenured appointment. Will not default from the existing value on an update. + + + Appointment End Date must be greater than the Appointment Start Date. + + + + + + + Override for Academic Appointment Track Start Date + + + The value supplied for the Track Start Date must be less than or equal to the Appointment Start Date. + + + + + + + Reference for the Academic Rank associated with the Appointment. On an update, the existing value will be retained if not sent. + + + The Academic Rank must be an allowed value for the Academic Track Type. + + + + + + + Reference to the Named Professorship associated with the Appointment + + + [professorship] is not a valid Named Professorship for the Appointment as it is in a Pending status. + + + [professorship] is not a valid Named Professorship for the Appointment as it has been associated with the current Appointment track in the past. + + + [professorship] is not a valid Named Professorship for the Appointment as it associated with In-Progress Edit Named Professorship event. + + + [professorship] is not a valid Named Professorship for the Appointment as it associated with an In-Progress Academic Appointment event. + + + [professorship] is not a valid Named Professorship for the Appointment as it is in a Discontinued status. + + + [professorship] is not a valid Named Professorship for the Appointment as it is in a On Hold status. + + + [professorship] is not a valid Named Professorship for the Appointment as it is Filled. + + + [professorship] is not a valid Named Professorship for the Appointment as the Initial Established Date is greater than Appointment Start Date. + + + + + + + Appointment Specialty for Appointment Reference + + + Enter an active Appointment Specialty. + + + Enter an Appointment Specialty that is associated with 1 of these: the appointment's Academic Unit, Academic Unit Hierarchy or its superiors. + + + + + + + Do not enter, Constructed Title will be defaulted and used if all fields pertaining to rule set for track is supplied. + + + Do not enter, Constructed Title will be defaulted and used if all fields pertaining to rule set for track is supplied. + + + + + + + Title assigned to the academic while holding the Appointment. On an update, the existing value will be retained if not sent. + + + + + Manually adjusted date for when the title and/or rank were earned. Used when academic has earned credit for time spent at another institution. On an update, the existing value will be retained if not sent. + + + + + Manually maintained date that acts as a reminder to review the academic for promotion. Only applies when the Appointment’s Track includes a Promotion program. On an update, the existing value will be retained if not sent. + + + Academic Review Date must be greater than the Appointment Start Date. + + + + + + + Related Academic Unit for Appointment Reference + + + Select a Related Academic Unit that is available as of [Start Date]. + + + Select a Related Academic Unit that is available as of [Start Date]. + + + + + + + The academic unit that serves as the appointment's tenure home. + + + Tenure Home is required If the track type includes a tenure program. Otherwise, Tenure Home is not allowed. + + + Select a Tenure Home that is available as of [Start Date]. + + + Select a Tenure Home that is available as of [Start Date]. + + + + + + + Reference for Academic Tenure Status. Only applies when the Appointment’s Track includes a Tenure program. On an update, the existing value will be retained if not sent. + + + Tenure Status is not allowed if the Academic Track does not include a tenure program. + + + Tenure Status Reference is required if the Academic Track includes tenure program. + + + + + + + Date the Academic Tenure probationary period is expected to end. Only applies when the Appointment’s Track includes a Tenure program. On an update, the existing value will be retained if not sent. + + + Probationary End Date is not allowed if the Academic Track Type does not include a tenure program. + + + Probationary End Date must be greater than the Appointment Start Date. + + + Probationary end date is not allowed if the academic tenured status has a value of true for "tenured." + + + + + + + Date the academic was awarded full Tenure status. Only applies when the Appointment’s Track includes a Tenure program. On an update, the existing value will be retained if not sent. + + + Tenure Award Date is not allowed if the Academic Track does not include a tenure program. + + + Tenure Award Date is required if Academic Tenure Status is set to Tenured. + + + Tenure Award Date is not allowed if the Academic Tenure Status is not Tenured. + + + + + + + + + Contains the information about the employees willingness to travel as part of their job. + + + + + A reference to whether an employee is willing to travel as part of their job. The only values allowed are: Yes, No, and Maybe. + + + + + A reference to the amount of time that the employee is willing to travel for as part of their job. This is only applicable when the employee is willing to travel (Willing to Travel = Yes or Maybe). + + + The Travel Amount Reference is inactive. + + + Willing to Travel should be set to 'Yes' or 'Maybe' in-order to specify any Travel Amount. + + + + + + + More information about why (or why not) the employee is willing to travel as part of their job. + + + + + + + Wrapper element for the End Academic Appointment business process. + + + Enter a Track End Date that is after [date_formatted], the most recent add or update date. + + + Appointment Tracks with an In-Progress event cannot be updated or ended until the In-Progress event is completed or cancelled + + + The Academic Appointment is not valid for the specified Worker. + + + The Worker submitted has no Academic Appointments available to end. + + + The Worker submitted has more than one Academic Appointment, so an Academic Appointment Track reference must be supplied. + + + The Academic Appointment is not valid for the specified Academic Affiliate. + + + The Academic Affiliate submitted has more than one Academic Appointment, so an Academic Appointment Track reference must be supplied. + + + The Academc Affiliate submitted has no Academic Appointments available to end. + + + You cannot end an Academic Appointment that is already ended. + + + + + + + + Reference to the Worker whose appointment is being ended. + + Employee_ID + + Worker reference or Academic Affiliate reference is required unless the end academic appointment business process is a sub-process. + + + An Academic Affiliate is not allowed when processing an appointment as a sub-process. + + + + + + + Reference to the Academic Affiliate whose appointment is being ended. + + Academic_Affiliate_ID + + + + + + + Reference to the Academic Appointment Track that is being ended. + + + + + Reference to the Reason for the End Academic Appointment business process. + + Event_Classification_Subcategory_ID + + + + + + Date that the Academic Appointment Track is being ended. + + + + + + + Top-level request element to end an academic appointment + + + + + + + + + + Top-level response element for Academic Appointment business process operations. + + + + + Reference to the Academic Appointment business process. + + + + + Reference to the Worker that the business process applies to. + + + + + Reference to the Academic Affiliate that the business process applies to. + + + + + Reference to the Academic Appointment Track that the business process applies to. + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of provisioning groups. + + + + + A unique identifier to reference a provisioning group. + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request all sub-elements will be returned. + + + + + Indicates if the Reference element for the provisioning group is included in the response. + + + + + Indicates if the Provisioning Group Data element is included in the response. + + + + + + + Request element to retrieve provisioning group setup data. + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request all sub-elements will be returned. + + + + + + + + Response element containing the requested instances of provisioning groups and their associated data. + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request all sub-elements will be returned. + + + + + + + + + + Contains each provisioning group based on the Request References or Request Criteria. + + + + + + + + Encapsulating element containing all provisioning group data. + + + + + A unique identifier used to reference a provisioning group. + + + + + + + + This element contains all setup data for a provisioning group. + + + + + Name of the provisioning group + + + + + Description of the provisioning group + + + + + + + This element contains all provisioning group assignments for a person. + + + + + + + + This element contains all data defining the assignment of the person to a specific provisioning group at the current moment. It does not include the assignment's history. + + + + + Name of the provisioning group + + + + + Latest status of the provisioning group assignment, possible values are Assigned, Activated, Unassigned, Disabled + + + + + Date/time when the status of the assignment was last changed + + + + + + + Wrapper element for the Add Academic Appointment business process. + + + The Create Workday Account Sub Business Process element is only valid for Academic Affiliate without a Workday Account. + + + The Create Workday Account Sub Business Process element is only valid for Academic Affiliate without a Workday Account. + + + Reference ID for Academic Affiliate already in use. + + + The Manage Professional Affiliation Sub Business Process element is only valid for new Academic Affiliates + + + The Manage Professional Affiliation Sub Business Process element is only valid for new Academic Affiliates + + + The Manage Education Sub Business Process element is only valid for Academic Affiliates without Education Details + + + The Manage Education Sub Business Process element is only valid for new Academic Affiliates + + + + + + + The reference to the reason for the Add Academic Appointment business process. + + + + + + Reference to the Worker for whom an academic appointment is being added. + + Employee_ID + + Either an Academic Worker or Academic Affiliate is required for Add Academic Appointment + + + An Academic Affiliate is not allowed when processing an appointment as a sub-process + + + An employment position is not allowed when processing an appointment for an academic affiliate + + + + + + + Reference to the Academic Affiliate for whom an academic appointment is being added. + + Academic_Affiliate_ID + + + + + + Data for a new Academic Affiliate if an affiliate is to be created as part of the appointment. + + + + + + + + + + + + + Top-level request element to add an academic appointment + + + + + + + + + + Wrapper element to hold the name and contact information of the emergency contact + + + Preferred names and additional names cannot be specified for emergency contacts. + + + + + + + + + + + Top-level request element to update an academic appointment + + + + + + + + + + Put Provisioning Group Request + + + + + A unique identifier used to reference a provisioning group. + + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of provisioning group assignments. + + + + + A unique identifier to reference a provisioning group assignment + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request all sub-elements will be returned. + + + + + Indicates if the Reference element for the provisioning group assignment is included in the response. + + + + + Indicates if the Provisioning Group Assignment Data element is included in the response. + + + + + + + Request element to retrieve assignments of persons and workers to provisioning groups. + + + + + + + + + + + + Utilize the Request Criteria element to search for provisioning group assignments to specific workers or persons. + + + + + Reference to a person + + + + + Reference to a worker + + + + + + + Contains each provisioning group assignment based on the Request References or Request Criteria. + + + + + + + + Encapsulating element containing all provisioning group assignment data. + + + + + A unique identifier used to reference a provisioning group assignment. + + + + + + + + The element includes all data for the assignment of a person/worker to a provisioning group. The data reflects the current status, the assignment history is not included. + + + If both, a worker and a person are provided, they need to match. + + + Either a worker or a person needs to be entered for the provisioning group assignment. + + + + + + + Reference to the person that is assigned to the provisioning group. + + + + + Reference to the worker corresponding to the person that is assigned to the provisioning group. + + + + + Name of the provisioning group + + + The provisioning group [group] does not exist. + + + + + + + Latest status of the provisioning group assignment, possible values are Assigned, Activated, Unassigned, Disabled + + + + + Date/time when the status of the assignment was last changed + + + + + + + Response element containing the requested instances of provisioning group assignments and their associated data. + + + + + + + + + + + + + + Request element to add or update a provisioning group assignment + + + + + A unique identifier used to reference a provisioning group assignment. + + + + + + + + + Reference to the created or updated provisioning group assignment + + + + + A unique identifier used to reference a provisioning group assignment. + + + + + + + + + Reference to the provisioning group created or updated. + + + + + A unique identifier used to reference a provisioning group. + + + + + + + + + Encapsulating element containing all Emergency Contact data. + + + + + A reference for the emergency contact. + + + + + Contains the details about an emergency contact. + + + + + + + Contains the details about an emergency contact. + + + + + The ID for the emergency contact. + + + + + The preferred language for the emergency contact. + + + + + The order of priority for the emergency contact. + + + + + + Flag to specify the emergency contact is primary or not. + + + + + The order of the priority of the emergency contact + + + + + + + + + + + + Element contains Compensation related data for the Job Profile. Currently, only an optional Compensation Grade association for the Job Profile is available. + + + Compensation grade profiles are not valid for the compensation grade. + + + Compensation Grade is required. + + + + + + + References an active Compensation Grade which is directly associated with the Job Profile. Workers with this Job Profile will be able to be assigned this Compensation Grade by default. + + + + + References active Compensation Grade Profiles which are directly associated with the Job Profile. Workers with this Job Profile will be able to be assigned a Compensation Grade Profile from the associated list based on eligibility. + + + + + + + Get search settings + + + + + + + + + Response element search setup data + + + + + + + + + + + Search Settings Data + + + + + Specify the object types that are suppressed by default in search results. Suppressions are not applied to domain searches and can be turned off by using the "all:" domain. + + + + + Create synonyms for Workday Terms to help make tasks and standard reports more easily discovered using worker's terminology. Enter the Workday Term using the tenant base language, then define synonyms separated by comma (i.e. "PTO, vacation, holiday"). + + Synonyms in different languages can be listed together. However, if many synonyms will be defined across several languages, it is recommended to define synonyms below in the tenant base language and then use the Business Object Translation task to create translations in other languages. + + + + + + + Put search settings request. + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + A synonym which maps a single workday term to one or more custom terms + + + The same workday term cannot be used for more than one synonym. + + + + + + + The workday term, i.e. "time off" + + + The workday term you entered does not match any tasks or standard reports. + + + The same workday term cannot be used for more than one synonym. + + + + + + + The customer terms, i.e. "PTO, vacation" + + + + + + + Wrapper element for the Update Academic Appointment business process. + + + + + The reference to the reason for the Add Academic Appointment business process. + + + + + + Reference to a worker + + Employee_ID + + An Academic Affiliate is not allowed when processing an appointment as a sub-process + + + An employment position is not allowed when processing an appointment for an academic affiliate + + + Either an Academic Worker or Academic Affiliate is required for Update Academic Appointment + + + + + + + Reference to the Academic Affiliate for whom an academic appointment is being updated. + + Academic_Affiliate_ID + + + + + + + Used to set or update the Reference ID for the Appointment Thread. The value cannot already be in use by a different appointment thread. + + + + + + + Employees Career Interest Data. + + + + + Indicates if an employee has career preference. + + + The Career Interest Reference is inactive. + + + + + + + Indicates Employee's career preference. + + + + + + + Contains the information about the employee's job interests. + + + + + Indicates an employee's job interest. + + + + + + + Response element containing tenant setup search data + + + + + + + + + Wrapper element that includes Search Settings data + + + + + + + + Wrapper Element that includes Search Settings Data + + + + + + + + Element Containing Worker Reference and Photo Data. + + + + + A unique identifier for the worker. + + + + + Text attribute identifying Filename of the Attachment. + + + + + + + + + + File content in binary format. + + + + + + + Contains address information. + + + Address Line 1 (or Address Line 1 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 1 (or Address Line 1 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 3 is not Valid for this Country. + Address Line 3 is not Valid for this Country. + + + Address Line 3 (or Address Line 3 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 3 (or Address Line 3 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 2 not Valid for this Country. + Address Line 2 not Valid for this Country. + + + Address Line 2 (or Address Line 2 - Local if configured on Tenant Setup Global) is Required in this Country. + Address Line 2 (or Address Line 2 - Local if configured on Tenant Setup Global) is Required in this Country. + + + Address Line 1 is not valid for this Country. + Address Line 1 is not valid for this Country. + + + Municipality is required for certain countries. + Municipality is required for certain countries. + + + Postal Code is required for certain countries. + Postal Code is required for certain countries. + + + Municipality is not a valid address component for certain countries . + Municipality is not a valid address component for certain countries . + + + Postal Code is not a valid address component for certain countries. + Postal Code is not a valid address component for certain countries. + + + Address Line 5 is not Valid for this Country. + Address Line 5 is not Valid for this Country. + + + Address Line 5 (or Address Line 5 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 5 (or Address Line 5 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 4 is not Valid for this Country. + Address Line 4 is not Valid for this Country. + + + Address Line 4 (or Address Line 4 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 4 (or Address Line 4 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 8 is not Valid for this Country. + Address Line 8 is not Valid for this Country. + + + Address Line 8 (or Address Line 8 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 8 (or Address Line 8 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 7 is not Valid for this Country. + Address Line 7 is not Valid for this Country. + + + Address Line 7 (or Address Line 7 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 7 (or Address Line 7 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Address Line 6 is not Valid for this Country. + Address Line 6 is not Valid for this Country. + + + Address Line 6 (or Address Line 6 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 6 (or Address Line 6 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Submunicipality (or City Subdivision - Local if configured on Tenant Setup Global) is required for certain countries. + Submunicipality (or City Subdivision - Local if configured on Tenant Setup Global) is required for certain countries. + + + Region Name must be valid for the specified Country. + Region Name must be valid for the specified Country. + + + Region is required for certain countries. + Region is required for certain countries. + + + Address Line 9 is not Valid for this Country. + Address Line 9 is not Valid for this Country. + + + Address Line 9 (or Address Line 9 - Local if configured on Tenant Setup Global) is Required for this Country. + Address Line 9 (or Address Line 9 - Local if configured on Tenant Setup Global) is Required for this Country. + + + Second Subregion is required for certain countries. + Second Subregion is required for certain countries. + + + Subregion is required for certain countries. + Subregion is required for certain countries. + + + Second Subregion is not a valid address component for certain countries. + Second Subregion is not a valid address component for certain countries. + + + Second Submunicipality is not a valid address component for certain countries. + Second Submunicipality is not a valid address component for certain countries. + + + Submunicipality is not a valid address component for certain countries. + Submunicipality is not a valid address component for certain countries. + + + Subregion is not a valid address component for certain countries. + Subregion is not a valid address component for certain countries. + + + Region Subdivision 2 - Local is not Valid for this Country. + Region Subdivision 2 - Local is not Valid for this Country. + + + Region Subdivision 1 - Local is not Valid for this Country. + Region Subdivision 1 - Local is not Valid for this Country. + + + City Subdivision 2 - Local is not Valid for this Country. + City Subdivision 2 - Local is not Valid for this Country. + + + City Subdivision 1 - Local is not Valid for this Country. + City Subdivision 1 - Local is not Valid for this Country. + + + City - Local is not Valid for this Country. + City - Local is not Valid for this Country. + + + Address Line 9 - Local is not Valid for this Country. + Address Line 9 - Local is not Valid for this Country. + + + Address Line 8 - Local is not Valid for this Country. + Address Line 8 - Local is not Valid for this Country. + + + Address Line 7 - Local is not Valid for this Country. + Address Line 7 - Local is not Valid for this Country. + + + Address Line 6 - Local is not Valid for this Country. + Address Line 6 - Local is not Valid for this Country. + + + Address Line 5 - Local is not Valid for this Country. + Address Line 5 - Local is not Valid for this Country. + + + Address Line 4 - Local is not Valid for this Country. + Address Line 4 - Local is not Valid for this Country. + + + Address Line 3 - Local is not Valid for this Country. + Address Line 3 - Local is not Valid for this Country. + + + Address Line 2 - Local is not Valid for this Country. + Address Line 2 - Local is not Valid for this Country. + + + Address Line 1 - Local is not Valid for this Country. + Address Line 1 - Local is not Valid for this Country. + + + Submunicipality 2 (or City Subdivision 2 - Local if configured on Tenant Setup Global) is required for certain countries. + Submunicipality 2 (or City Subdivision 2 - Local if configured on Tenant Setup Global) is required for certain countries. + + + If one local script address field is submitted, all required local script address fields must be submitted. + If one local script address field is submitted, all required local script address fields must be submitted. + + + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + Contains Address information. + + + + + + + Container for defining whether a previous system job history entry is being added, updated or deleted. + + + Previous System Job History Detail Data element is required (unless deleting an entry). + + + Add Only is True but the reference ID is already in use. Verify that you are sending the correct ID - or set Add Only to false if you want to update the existing entry. + ID: [ID] + In Use on: [Used] + + + + + + + Unique Identifier to a Previous System Job History entry. Required if you are deleting or updating an existing entry. Leave blank on an Add. + + + Previous System Job History Reference is Required if Delete flag is True. + + + The Previous System Job History Reference submitted is in use for a different worker. + Previous System Job History Reference: [Job] + Worker Submitted: [Worker] + Worker in use: [OtherWorker] + + + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + Flag indicating that the referenced data should be deleted. + + + Add Only and Delete cannot both be true. + + + + + + + + Request element containing Address update information. + + + Validates that the address is related to an active contactable. + Address must be related to a Contactable. + + + + + + + Identifies instance of Address. + + + + + Wrapper for Address Update Data. + + + + + + + + Response element containing Address reference. + + + + + Represents a unique instance of Address. + + + + + + + + Contains each Worker and their job history from a previous system. + + + + + + + + Response for Put Previous System Job History. Returns the worker. + + + + + A reference to the ID of the worker. The ID consists of a type attribute, which should be set to "Employee_ID" or "Contingent_Worker_ID", and a value attribute, such as "04345". + + + + + + + + Contains the Data for adding, updating or deleting a previous system job history entry for a worker. + + + + + + + + + Container for a Worker and the Previous System Job History data. + + + + + A reference to the ID of the worker. The ID consists of a type attribute, which should be set to "Employee_ID" or "Contingent_Worker_ID", and a value attribute, such as "04345". + + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request, then all groups will be returned. If the Response Group element is returned, you can select which sections of data to include in the response. + + + + + Indicates if the Reference to the Worker should be included in the response at the Previous_System_Job_History element level. It is always returned in the Previous_System_Job_History_Data level. + + + + + + + Utilize the Request Criteria element to limit the Job Families returned based on the specific criteria. Job Families that are returned must meet all of the criteria specified. + + + + + + Gives the customer the ability to have inactive job families returned + + + + + + + Wrapper element for the Maintain Contact Information for Person business process web service + + + You cannot initiate this action because there are other pending or completed actions for the worker that conflict with this one. + You cannot initiate this action because there are other pending or completed actions for the worker that conflict with this one. + + + Effective Date Entered must be later than maximum address effective date. Please rescind latest Contact Information event in order to add an address with an earlier effective date. + Effective Date Entered must be later than maximum address effective date. Please rescind latest Contact Information event in order to add an address with an earlier effective date. + + + + + + + A unique identifier for the worker. + + Employee_ID + + + + + + Date that the contact information change will be effective + + + + + + + + Operation allowing the addition of contact information for a person + + + + + Container for the processing options for a business process. If no options are submitted (or the options are submitted as 'false') then the business process is simply initiated as if it where submitted on-line with approvals, reviews, notifications and to-do's in place. + + + + + Wrapper element for the Maintain Contact Information for Person business process web service + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + The Contact Information for Person Event created by the corresponding request + + + + + The Contact Information for Person Event created by the corresponding request + + + + + + + + Contains all Development Items for the referenced Worker + + + + + + + + Contains the reference to the Development Item and the Development Item details + + + + + The reference to the Development Item + + + + + + + + Contains detailed data for the referenced Development Item + + + Select an active Development Item Status. + + + + + + + Title field of the referenced Development Item + + + + + + + + + + Additional Information field for the referenced Development Item + + + + + The status of the Development Item. The status is required and must be an active Development Item Status. + + + + + Status Note field for the referenced Development Item + + + + + Updated by Worker Reference is the worker updating the Development Item. If left empty, the processing worker will be used. + + + + + Tag Reference for Development Items based on Competency, Job Profile, and Work Experience Skill. + + + + + + + Wrapper element that contains position's academic pay setup related data. + + + + + Work period percent of year from the annual work period assigned to position. + + + + + + + + + + + + Start date for annual work period assigned to the position based on the effective moment from the request. + + + + + End date for annual work period assigned to the position based on the effective moment from the request. + + + + + Start date for disbursement plan period assigned to the position based on the effective moment from the request. + + + + + End date for disbursement plan period assigned to the position based on the effective moment from the request. + + + + + + + Wrapper element for Background Check data. + + + Background check status ([status]) is not valid. + + + Background check status ([status]) is not valid. + + + + + + + Background check status date. + + + + + Background check status. + + + + + Background check status comment. + + + + + + + Request References + + + + + Service Center Representative Reference + + + + + + + Request Criteria + + + + + Response Group + + + + + Include Reference + + + + + + + Get Service Center Representatives Request + + + + + + Request References + + + + + Request Criteria + + + + + + + Response Group + + + + + + + + Element containing Service Center Representative data. + + + + + A unique identifier for the Service Center Representative. + + + + + + + + Element containing Service Center Representative response data. + + + + + Element containing Service Center Representative data. + + + + + + + Response Element for Get Service Center Represtative + + + + + + + + + + Element containing Service Center Representative response data. + + + + + + + + Service Center Representative Data + + + Service Center is not permitted for inactive Service Center Representative. + + + Service Center is required for active Service Center Representative. + + + Name is required when creating a service center representative. + + + + + + + Service Center to which the Service Center Representative belongs. + + + + + Service Center Representative Inactive + + + + + Encapsulating element for all of the Name data for a person. + + + + + Contact Information Data + + + + + + Service Center Representative ID + + + + + + Put Service Center Representative Request + + + Service Center Representative ID already exists. + + + + + + + Reference to an existing Service Center Representative for update purposes only. + + + + + Service Center Representative Data + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Put Service Center Representative Response + + + + + A unique identifier for the Service Center Representative. + + + + + + + + Request References + + + + + Service Center Representative Reference + + + + + + + Request Criteria + + + + + Response Group + + + + + Include Reference + + + + + + + Service Center Representative Workday Account request + + + + + + Request References + + + + + Request Criteria + + + + + + + Response Group + + + + + + + + Element containing Workday Account information for a Service Center Representative. + + + + + A unique identifier for the Service Center Representative. + + + + + Element containing Service Center Representative Workday Account data. + + + + + + + Element containing Service Center Representative Workday Account response data. + + + + + Element containing Service Center Representative Workday Account data. + + + + + + + Element containing Service Center Representative Workday Account response. + + + + + + + + + + Element containing Service Center Representative Workday Account response data. + + + + + + + + Element containing Service Center Representative Workday Account data. + + + + + Element containing Service Center Representative Workday Account data. + + + + + + + Request Element for Put Service Center Representative Workday Account + + + Service Center Representative ID does not exist. + + + + + + + A unique identifier for the Service Center Representative. + + + + + Element containing Service Center Representative Workday Account data. + + + + + + + + Put Service Center Representative Workday Account Response + + + + + A unique identifier for the Service Center Representative. + + + + + + + + Wrapper element for Change Background Check Status business process web service + + + Background check status ([status]) is not valid. + + + + + + + Contains reference for employee who will have background check status updated. + + + + + Background check status date. + + + + + Background check status. + + + + + Background check status comment. + + + + + + + This web service operation is designed to update an employee's background check status. + + + If packages are configured, you won't be able to jump directly into change background check status. + Background Check Packages are configured in this tenant, cannot change background check status directly. + + + + + + + + + + + + This element contains information on Background Check Event + + + + + This element contains information on Background Check Event + + + + + + + + Encapsulating element containing all Period Salary Plan Compensation data. + + + + + Reference element representing a unique instance of Period Salary Plan. + + + + + Reference element representing a unique instance of Compensation Element. + + + + + Reference element representing a unique instance of Compensation Period of time measure. + + + + + Reference element representing a unique instance of Currency. + + + + + The multiplier for a Period Salary Plan. + + + + + + + + + + + + Reference element representing a unique instance of Frequency. + + + + + The more recent of the effective date of this assignment or the FTE Change Date (if using). + + + + + + + Encapsulating element containing all Period Salary Plan Compensation data. + + + + + Compensation Plan Default Compensation Element for a Period Salary Plan. + + + + + Reference element representing a unique instance of Compensation Period of time measure. + + + + + A unique identifier for the currency. + + + + + The multiplier for a Period Salary Plan. + + + + + + + + + + + + Reference element representing a unique instance of Frequency. + + + + + The actual end date for the plan assignment. + + + Please check the Enable Actual End Date tenant setup - HCM flag before attempting to set the Actual End Date. + + + + + + + + + Encapsulating element containing all Period Salary Plan Compensation data. + + + + + Text attribute identifying name of Period Salary Plan + + + A valid instance of Compensation Component must exist for the given value of Period Salary Plan Name. + The Period Salary Plan provided does not exist. + + + + + + + Encapsulating element containing all Period Salary Plan Compensation data. + + + + + + + Contains all the information about the Skill Item. + + + + + A reference to the Skill Item Category associated with the Skill Item. + + + + + The ID of the skill item. + + + + + + The name of the skill item. + + + + + When true, the Skill Item is inactive. + + + + + + Wrapper element for Skill Items. + + + + + A reference to a Skill Item. + + + + + An element containing information about a Skill Item. + + + + + + + A collection of references to one or more Academic Units + + + + + A collection of references to one or more Academic Units + + + + + + + Request Criteria + + + + + The Name of the Academic Unit + + + + + Effective As of Date + + + + + + + Response Group + + + + + Include Reference + + + + + + + A container for a request for one or more Academic Units + + + + + + Request References + + + + + Request Criteria + + + + + + Response Filter + + + + + Response Group + + + + + + + + A container for Academic Unit Data + + + + + A reference to the Academic Unit + + + + + A container for detailed information about the Academic Unit + + + + + + + A container for Academic Unit responses + + + + + A container for Academic Unit Data + + + + + + + A container for Academic Unit response data + + + + + A container for Academic Unit request references + + + + + A container for Academic Unit request criteria + + + + + + Response Group + + + + + + + + + + A container for all the detail information about the Academic Unit + + + You cannot inactivate an Institutional academic unit. + + + + + + + A Reference ID for the Academic Unit generated by Workday and used for internal purposes only + + + + + Effective as of Date + + + + + The Name of the Academic Unit + + + Academic Unit Name is required on add. + + + + + + + A functional ID for the Academic Unit available to system users and in the display ID, if desired + + + + + Indicates whether the Academic Unit is designated as an institution. + + + This Academic Unit cannot be designated as an institution because [Institution AU] is already designated as an institution in the structure. + + + + + + + Indicates whether the functional ID should be included as part of the display ID (Name). If this value is set, the Code field is pre-pended to the Name with a hyphen separator + + + + + Indicates whether or not the person holding the leadership role for the Academic Unit's name will be included as part of the display ID (Name). If set, this value will cause the leader's name to be appended in parentheses to the Academic Unit's name. + + + + + A reference to the Academic Unit Subtype for this Academic Unit (required) + + + Academic Unit Subtype is required on add. + + + + + + + Indicates whether or not the Academic Unit Subtype should be part of the Academic Unit's display ID (Name). If set, this value will cause the Subtype Name to be appended to the Academic Unit's Name. The default for this value is false. + + + + + Indicates whether or not the Academic Unit is considered Inactive. If set, the static text (Inactive) will be appended to the Academic Unit's default display ID (Name). Inactive Academic Units are not available for selection when adding or updating Appointments. Inactive Academic Units, however, can continue to contain historical Appointments and can be viewed and reported on. Prompts will include the Inactive Academic Units in a separate folder. + + + + + Provides a reference to the Company associated with the Academic Unit. + + + + + Provides a reference to a CIP code for this Academic Unit. + + + + + One or more references to an external URL (e.g. home page for the department or school) + + + + + Provides a reference to a Supervisory Organization associated with the Academic Unit. + + + + + A list of references to Academic Track Types allowable for this Academic Unit + + + + + Field for providing a reference to the Superior Academic Unit of this Academic Unit. + + + Assigning this superior academic unit would create a circular reference. + + + + + + + + + Request element for selecting the Academic Unit to be updated + + + Academic Unit Already Exists + + + + + + + A reference to the Academic Unit + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for the Put Academic Unit response + + + + + A reference to the Academic Unit + + + + + + + + Wrapper element for references to Academic Unit Hierarchies + + + + + Reference(s) to Academic Unit Hierarchy + + + + + + + Top-level request element. + + + + + Element used to retrieve specific instances of Academic Unit Hierarchy. + + + + + + + + + Wrapper element for Academic Unit Hierarchy attributes and relationships. + + + + + Reference ID + + + + + Descriptive name + + + + + Code or abbreviation + + + + + Indicates whether or not the Code should be included in the display name + + + + + Indicates whether or not the name of the person assigned to the leadership role should be included in the display name + + + + + Indicates whether or not the subtype should be included in the display name + + + + + Reference to the subtype + + + + + Reference to an external URL + + + + + Reference to the superior or parent Academic Unit Hierarchy + + + + + Reference to the subordinate Academic Unit Hierarchies. This is for display only. The superior-subordinate relationship is set by using the superior reference + + + + + Reference(s) to the Academic Unit included in this Academic Unit Hierarchy + + + + + Indicates the Academic Unit Hierarchy is not active. + + + + + + + Wrapper element for the Academic Unit Hierarchies + + + + + + + + Top-level response element for the Get Academic Unit Hierarchies operation + + + + + Wrapper element for reference(s) to specific Academic Unit Hierarchy instances to be retrieved + + + + + + + + + + + Wrapper element for the Academic Unit Hierarchy reference and associated data.\ + + + + + Reference to the Academic Unit Hierarchy + + + + + + + + Top-level request element used to add or update an Academic Unit Hierarchy. + + + Add Only is true but Academic Unit Hierarchy ID is already in use. + + + + + + + Reference to an existing Academic Unit Hierarchy that is being updated. + + + + + Wrapper element for Academic Unit Hierarchy detail data. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Top-level response element for the Put Academic Unit Hierarchy operation + + + + + Reference to the Academic Unit Hierarchy added or updated. + + + + + + + + Creates all Skills for the referenced Worker + + + + + + + + Wrapper element for the disability status information for the person. + + + The worker's location context is not enabled for Disability Grade. + + + The provided Disability Grade is not valid for the worker's location context or is inactive. + + + The worker's location context is not enabled for Disability Degree. + + + The worker's location context is not enabled for Disability Remaining Capacity. + + + The worker's location context is configured to use Disability Authority Reference. + + + The provided Disability Authority is not valid for the worker's location context or is inactive. + + + The worker's location context is not enabled for Disability Authority. + + + The provided Disability Authority Reference is not valid or inactive for the worker's location context. Or the worker's location context is not enabled for Disability Authority. + + + The worker's location is not enabled for Disability Certification Location. + + + The worker's location context is not enabled for Disability Certification ID. + + + The worker's location context is not enabled for Disability Certification Basis. + + + The provided Disability Certification Basis is not valid for the worker's location context or is inactive. + + + The worker's location context is not enabled for Disability Severity Recognition Date. + + + The worker's location context is not enabled for Disability FTE Toward Quota. + + + The provided Disability is not valid for the worker's location context. The location context is derived from the country of the location specified for the position. + + + The entered Certification Basis is not valid for the entered Disability Type + The entered Certification Basis is not valid for the entered Disability Type + + + The entered Certification Authority is not valid for the entered Disability Type + The entered Certification Authority is not valid for the entered Disability Type + + + The entered Disability Grade is not valid for the entered Disability Type + The entered Disability Grade is not valid for the entered Disability Type + + + + + + + The person's disability + + + + + This person's disability status date + + + The Disability Status Date cannot be before the Date of Birth + The Disability Status Date cannot be before the Date of Birth + + + The element Disability Reference is required if a Disability Status Date is entered. + The element Disability Reference is required if a Disability Status Date is entered. + + + + + + + The date you (the employer) first learned about the disability. + + + The Disability Date Known cannot be before the Date of Birth. + + + + + + + The date through which the worker is considered disabled. In some countries, this is the date through which the certification for the current level of disability is effective. + + + The Disability End Date cannot be before the Date of Birth. + + + + + + + A code or number that identifies the level of disability. + + + + + A percentage that identifies the worker's level of disability as of the disability date. + + + + + + + + + + + + The percentage of that the person may work per labor physician or other authority. + + + + + + + + + + + + + The name of the person or agency that certified the disability. + + + + + The name of the person or agency that certified the disability. + + + + + + The place where the person or agency certified the disability. + + + + + The ID provided to the worker, if any. + + + + + How the worker qualified for the certification. + + + + + The date the disability was recognized as severe by the recognizing authority. + + + The Disability Severity Recognition Date cannot be before the Date of Birth. + + + + + + + The FTE that counts towards the employer's quota for hiring the disabled. + + + + + + + + + + + + List any work restrictions that apply to the worker. + + + + + Describe any accommodations requested by the worker or their care provider. + + + + + Describe any accommodations provided by you, the employer. + + + + + Describe any rehabilitation measures requested by the worker or their care provider. + + + + + Describe any rehabilitation measures provided by you, the employer. + + + + + Enter any additional information related to this disability. + + + + + Attach a copy of the certification or other documents related to this instance of disability. + + + + + Reference ID for the Disability Status + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Political Affiliation and its associated data. + + + + + A unique identifier used to reference a Political Affiliation.{+3} + + + + + + + Request element for Get Political Affiliations service task. + + + + + + Request References + + + + + + Parameters that let you filter the data returned in the response. You can filter returned data by dates and page attributes. + + + + + + + + Contains the response elements for the Get Political Affiliation and Put Political Affiliation service requests. + + + + + A unique identifier used to reference a Political Affiliation + + + + + + + + The "Response Data" element contains the core data results based on the inbound request that was processed. + + + + + Reference element representing a unique instance of Political Affiliation + + + + + + + Contains the response elements for the Get Political Affiliation and Put Political Affiliation service requests. + + + + + Request References + + + + + Parameters that let you filter the data returned in the response. You can filter returned data by dates and page attributes. + + + + + The "Response_Results" element contains summary information about the data that has been returned from your request including "Total_Results", "Total_Pages", and the current "Page" returned. + + + + + Encapsulating element containing all Political Affiliation data. + + + + + + + + Encapsulating element containing all Political Affiliation data. + + + + + The ID for the Political Affiliation (Political_Affiliation_ID). + + + + + The name of the Political Affiliation. + + + Name is required. + + + + + + + The code for the Political Affiliation. + + + + + The description for the Political Affiliation. + + + + + The country the Political Affiliation is for. + + + Location (Country or Country Region) is required. + + + + + + + A boolean flag indicating whether the Political Affiliation is active or not. + + + + + + + Request element for Put Political Affiliation + + + + + A unique identifier used to reference a Political Affiliation. + + + + + Encapsulating element containing all Political Affiliation data. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for the Put Political Affiliation operation. + + + + + A unique identifier used to reference a Political Affiliation. + + + + + + + + Information about the Earliest and Earliest Contiguous Eligiblility Dates for Retirement Plans which are Part of a Plan Year + + + + + The Benefit Plan for these Dates + + + + + The earliest date that the worker was ever eligible for this plan, ignoring gaps in coverage. + + + + + The earliest date that the worker was contiguously eligible for this plan (accounting for gaps in coverage). + + + + + + + Attachments for Certification. + + + + + Filename for the attachment. + + + + + + + + + + Free form text comment about the attachment. + + + + + Binary file contents. + + + + + Category of attachment. + + + + + Text attribute identifying Content Type of the Attachment. + + + + + + + + + + + + Wrapper element for the Change Personal Information business process web service. + + + You cannot submit this request because another personal information change event is already in progress for this worker. + You cannot submit this request because another personal information change event is already in progress for this worker. + + + + + + + Reference to the Worker that the personal information will be applied to. + + + + + + + + This web service allows updates to the personal information of a worker. + + + + + + + + + + Responds with the Event ID for the Personal Information Change Event. + + + + + Event ID of the Personal Information Change Event. + + + + + + + + + Wrapper element for the Government Identifier data. + + + + + Reference to the Worker that the government identifier(s) will be applied to. + + + + + + + + This web service allows the updating of government identifiers for a worker. + + + + + + + + You cannot initiate this action because there is another pending action for the worker's government IDs. + + + + + + + + + + Response for the change government identifier web service. + + + + + Event ID of the Government Identifier Change Event. + + + + + + + + Wrapper element for each Military Service entry. + + + Military Service Reference is required when deleting a Military Service entry + Military Service Reference is required when deleting a Military Service entry + + + The Military Service Reference provided is not owned by the worker in this request or does not exist. + The Military Service Reference provided is not owned by the worker in this request or does not exist. + + + + + + + Reference to an existing Military Service entry for edits and deletes. + + + + + + + Flag to delete an existing military service entry. If this flag is set, Military Service Reference is also required. + + + + + + Wrapper element for all Military Service data for the worker. + + + + + + + When this flag is set to false, existing military data for the worker will be preserved. When true, it causes the web service to replace all military data for the worker with the information in the request (this is the default behavior when the entire tag is omitted). + + + + + + Container for disability status data for the Personal Information Change business process. + + + The worker's location context is not enabled for Disability Grade. + The worker's location context is not enabled for Disability Grade. + + + The provided Disability Grade is not valid for the worker's location context or is inactive. + The provided Disability Grade is not valid for the worker's location context or is inactive. + + + The worker's location context is not enabled for Disability Degree. + The worker's location context is not enabled for Disability Degree. + + + The worker's location context is not enabled for Disability Remaining Capacity. + The worker's location context is not enabled for Disability Remaining Capacity. + + + The worker's location context is configured to use Disability Authority Reference. + The worker's location context is configured to use Disability Authority Reference. + + + The provided Disability Authority is not valid for the worker's location context or is inactive. + The provided Disability Authority is not valid for the worker's location context or is inactive. + + + The worker's location context is not enabled for Disability Authority. + The worker's location context is not enabled for Disability Authority. + + + The provided Disability Authority Reference is not valid or inactive for the worker's location context. Or the worker's location context is not enabled for Disability Authority. + The provided Disability Authority Reference is not valid or inactive for the worker's location context. Or the worker's location context is not enabled for Disability Authority. + + + The worker's location is not enabled for Disability Certification Location. + The worker's location is not enabled for Disability Certification Location. + + + The worker's location context is not enabled for Disability Certification ID. + The worker's location context is not enabled for Disability Certification ID. + + + The worker's location context is not enabled for Disability Certification Basis. + The worker's location context is not enabled for Disability Certification Basis. + + + The provided Disability Certification Basis is not valid for the worker's location context or is inactive. + The provided Disability Certification Basis is not valid for the worker's location context or is inactive. + + + The worker's location context is not enabled for Disability Severity Recognition Date. + The worker's location context is not enabled for Disability Severity Recognition Date. + + + The worker's location context is not enabled for Disability FTE Toward Quota. + The worker's location context is not enabled for Disability FTE Toward Quota. + + + The provided Disability is not valid for the worker's location context. The location context is derived from the country of the location specified for the position. + The provided Disability is not valid for the worker's location context. The location context is derived from the country of the location specified for the position. + + + The entered Disability Grade is not valid for the entered Disability Type + The entered Disability Grade is not valid for the entered Disability Type + + + The entered Certification Authority is not valid for the entered Disability Type + The entered Certification Authority is not valid for the entered Disability Type + + + The entered Certification Basis is not valid for the entered Disability Type + The entered Certification Basis is not valid for the entered Disability Type + + + + + + + The person's disability + + + + + This person's disability status date + + + The Disability Status Date cannot be before the Date of Birth + The Disability Status Date cannot be before the Date of Birth + + + + + + + The date you (the employer) first learned about the disability. + + + The Disability Date Known cannot be before the Date of Birth. + The Disability Date Known cannot be before the Date of Birth. + + + + + + + The date through which the worker is considered disabled. In some countries, this is the date through which the certification for the current level of disability is effective. + + + The Disability End Date cannot be before the Date of Birth. + The Disability End Date cannot be before the Date of Birth. + + + + + + + A code or number that identifies the level of disability. + + + + + A percentage that identifies the worker's level of disability as of the disability date. + + + Disability Degree can not be over 100%. + Disability Degree can not be over 100%. + + + + + + + + + + + + + + The percentage of that the person may work per labor physician or other authority. + + + Disability Remaining Capacity can not be over 100%. + Disability Remaining Capacity can not be over 100%. + + + + + + + + + + + + + + + The name of the person or agency that certified the disability. + + + + + The name of the person or agency that certified the disability. + + + + + + The place where the person or agency certified the disability. + + + + + The ID provided to the worker, if any. + + + + + How the worker qualified for the certification. + + + + + The date the disability was recognized as severe by the recognizing authority. + + + The Disability Severity Recognition Date cannot be before the Date of Birth. + The Disability Severity Recognition Date cannot be before the Date of Birth. + + + + + + + The FTE that counts towards the employer's quota for hiring the disabled. + + + + + + + + + + + + List any work restrictions that apply to the worker. + + + + + Describe any accommodations requested by the worker or their care provider. + + + + + Describe any accommodations provided by you, the employer. + + + + + Describe any rehabilitation measures requested by the worker or their care provider. + + + + + Describe any rehabilitation measures provided by you, the employer. + + + + + Enter any additional information related to this disability. + + + + + Attach a copy of the certification or other documents related to this instance of disability. + + + + + + + Wrapper element for each disability status entry. + + + Disability Status Reference is required when deleting a Disability Status entry. + Disability Status Reference is required when deleting a Disability Status entry. + + + The Disability Status Reference provided is not owned by the worker in this request or does not exist. + The Disability Status Reference provided is not owned by the worker in this request or does not exist. + + + Disability Status Data is required unless the disability status is being deleted. + Disability Status Data is required unless the disability status is being deleted. + + + + + + + Reference to an existing Military Service entry for edits and deletes. + + + + + + + Flag to delete an existing disability status entry. If this flag is set, Disability Status Reference is also required. + + + + + + Wrapper element for all Disability Status data for the worker. + + + + + + + When this flag is set to false, existing disability data for the worker will be preserved. When true, it causes the web service to replace all disability data for the worker with the information in the request (this is the default behavior when the entire tag is omitted). + + + + + + This web service allows updates to the legal name of a worker. + + + + + + + + + + Wrapper element for the Legal Name Change business process web service. + + + You cannot change the legal name of this worker because another legal name or preferred name change is pending. + + + + + + + Reference to the Worker that the legal name data will be applied to. + + + + + The date the snapshot becomes effective. + + + + + + + + Responds with the Event ID for the Legal Name Change Event. + + + + + Event ID of the Legal Name Change Event. + + + + + + + + Contingent Worker Tax Authority Form Information + + + + + This is the Tax Authority Form Type for the Contingent Worker + + + + + + + This web service allows updates to the preferred name of a worker. + + + + + + + + + + Wrapper element for the Preferred Name Change business process web service. + + + You cannot change the preferred name of this worker because another legal name or preferred name change is pending. + You cannot change the preferred name of this worker because another legal name or preferred name change is pending. + + + Name Data is required and must have a value unless "Use Legal Name As Preferred Name" is set. + Name Data is required and must have a value unless "Use Legal Name As Preferred Name" is set. + + + + + + + Reference to the Worker that the preferred name data will be applied to. + + + + + Flag indicating that the worker's legal name should be used as preferred. If this flag is set, Name Data is not allowed (otherwise it is required). + + + + + + + + Responds with the Event ID for the Preferred Name Change Event. + + + + + Event ID of the Preferred Name Change Event. + + + + + + + + This web service allows updates to the additional names of a worker. + + + + + Reference to the Worker that the additional name data will be applied to. + + + + + + + + Response for the Change Additional Names web service request. Includes the worker reference and additional name data. + + + + + Event ID of the Additional Name Change Event Lite. + + + + + Reference to the Worker that the additional name data will be applied to. + + + + + + + + + This web service allows the updating of passport and visa identifiers for a worker. + + + + + + Wrapper element for the Passport and Visa Identifier data. + + + You cannot initiate this action because there is another pending action for the worker's passports and visas. + + + + + + + + + + Response for the change passports and visas identifier web service. + + + + + Event ID of the Passport and Visa Change Event. + + + + + + + + Wrapper element for the Passport and Visa Identifier data. + + + + + Reference to the Worker that the Passport and Visa Identifier(s) will be applied to. + + + + + + + + Wrapper element for the License Identifier data. + + + + + Reference to the Worker that the license identifier(s) will be applied to. + + + + + + + + This web service allows the updating of license identifiers for a worker. + + + + + + + + You cannot initiate this action because there is another pending actions for the worker's licenses. + + + + + + + + + + Response for the change licenses web service. + + + + + Event ID of the License Identifier Event. + + + + + + + + Wrapper element for the Other Identifier Data. + + + + + Reference to the Worker that the custom identifier(s) will be applied to. + + + + + + + + This web service allows the updating of other identifiers for a worker. + + + + + + + + You cannot initiate this action because there is another pending action for the worker's custom IDs. + + + + + + + + + + Response for the change other identifier web service. + + + + + Event ID of the Custom Identifier Change Event. + + + + + + + + Response Group + + + + + Include Reference + + + + + + + Data for a Former Worker. + + + + + Unique Identifier for the former worker. If not entered, one will be generated. + + + + + ID used in the former system. You can use this as the ID as well if it will be unique. + + + Former Worker ID is required. + + + + + + + Worker Type (Employee or Contingent Worker) for the former worker. Required for an add. + + + Worker Type is required. + + + + + + + Last Termination Date for the former worker. Required on the initial Add. + + + Last Termination Date is required. + + + Last Termination Date must be greater than the later of the Most Recent Hire Date and the Original Hire Date. + Last Termination Date: [term] + Most Recent Hire Date: [recent] + Original Hire Date: [original] + + + + + + + Most Recent Hire Date (prior to the termination) for the former worker. + + + + + Original Hire Date for the former worker. This value will be brought forward on a re-hire. + + + + + Continuous Service date for the former worker. This date will be brought forward on a re-hire. + + + + + + Reason for the Last Termination. + + + + + Last Manager of the former worker. Free-form text entry. + + + + + Cost Center for the former worker. Free-form text entry. + + + + + Job Title for the former worker. Free-form text entry. + + + + + Job Profile Code for the former worker. Free-form text entry. + + + + + Job Profile Name for the former worker. Free-form text entry. + + + + + Job Level for the former worker. Free-form text entry. + + + + + Time Type for the former worker. Free-form text entry. Example: Full Time or Part Time. + + + + + Location for the former worker. Free-form text entry. + + + + + Last Base Pay for the former worker. + + + + + + + + + + + + Currency Reference for the Base Pay. + + + + + Frequency Reference for the Base Pay. + + + + + Scheduled Weekly Hours for the former worker. + + + + + + + + + + + Returns True if the former worker is eligible for re-hire. + + + + + Performance Rating for the former worker. Free-form text entry. + + + + + + + + Contains the instructions for adding or updating a former worker. + + + Add Only is true but the Former Worker Reference ID already is in use. Set Add only to false if you want to edit the existing instance or enter a new unused ID for this entry. + + + A legal name is required when adding a former worker. Please include the Legal Name Data element when adding a former worker to the system for the first time. + + + + + + + Unique Reference to the Former Worker. Used to identify the Former Worker to update. Leave blank on an Add. + + + This former worker has been rehired or contracted. Updating via the web service is no longer allowed. + This former worker has been rehired or contracted. Updating via the web service is no longer allowed. + + + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Element for the response to Put Former Worker. Shows the Former Worker Reference ID created. + + + + + Unique Reference to a Former Worker. + Reference ID Type: Former_Worker_ID + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Former Worker and its associated data. + + + + + Unique Reference to a Former Worker. + Reference ID Type: Former_Worker_ID + + + + + + + Utilize the Request Criteria element to limit the Former Workers returned based on the specific criteria. Former Workers that are returned must meet all of the criteria specified. + + + The Updated Moment From must be less than the Updated Moment To/ + + + The Terminated From date must be less than or equal to the Terminated To date.{+3} + + + Updated To Date must be less than or equal to Current Moment + + + + + + + Defines the earliest moment (e.g. datetime) data was entered into the Workday system. + + + + + Defines the latest moment (e.g. datetime) data was entered into the Workday system. + + + + + Defines the earliest termination date to return. + + + + + Defines the latest termination date to return. + + + + + + + + Request element used to retrieve Former Workers and their data. + + + + + + + + + + + + + + Contains the data for adding or updating a Former Worker. + + + + + Unique Reference to a Former Worker. + Reference ID Type: Former_Worker_ID + + + + + + + + Response element containing an instance of a Former Worker and its associated data. + + + + + + + + Response element containing an instances of former workers and their associated data. + + + + + + + Parameters that let you filter the data returned in the response. You can filter returned data by dates and page attributes. + Former Worker data is not effective dated so using the Effective Date filter will not do anything. + + + + + + + + + + + Encapsulating element containing transaction log entries that have been rescinded or corrected. + + + + + The details of the transaction that has been rescinded or corrected. + + + + + + + The details of the transaction that has been rescinded or corrected. + + + + + A reference to a transaction log entry. + + + + + Encapsulating element containing the rescind and correction data of the transaction log entry. + + + + + + + Details on the rescind or correct of the event described in the main transaction data section. + + + + + A reference to a transaction log entry. + + + + + The Description of the Transaction Log + + + + + True if this is a correction of the main transaction. + + + + + True if this is a rescind of the main transaction. + + + + + Date attribute identifying the effective moment of the transaction prior to the correction. This date will be the same as the transaction effective moment if the correction did not involve a date change. + + + + + Date attribute identifying the entry moment of the transaction. + + + + + + + Transaction Data for an event that has been rescinded or corrected. + + + + + + + + + Personal data for the former worker. + + + + + + A person's birth date. + + + + + Indicates the ethnicities that a person has. + + + + + Returns a true if the person's ethnicity is Hispanic or Latino. + + + + + + + + + Wrapper element for Additional Name Change web service. + + + + + Reference to the Worker that the additional name data will be applied to. + + + + + This flag controls whether or not to replace existing additional names for the worker. When true, existing additional names are removed before the data in this web service request is processed. + + + + + + + + Element for Feedback Comments and Questions. There can be multiple questions per request, thus multiple comments per feedback given. + + + + + The feedback question + + + + + The feedback comment + + + + + + + Encapsulating element containing all Leave Requests that have corrected data. + + + + + Worker Leave Event + + + + + The description of Leave Request Event. + + + + + Leave Return reference + + + + + Boolean attribute identifying whether the Worker is On Leave (as of As Of Date). + + + + + Current leave event Start Date. + + + + + Current leave event Estimated End Date. + + + + + Most recent leave event Actual End Date. + + + + + First Day of Work. + + + + + Last day of work for the worker's leave event. + + + + + The type of leave. + + + + + The leave request that provides entitlement for this event + + + + + Boolean attribute identifying whether the leave event has a Benefits Effect. + + + + + Boolean attribute identifying whether the leave event has a Payroll Effect. + + + + + Boolean attribute identifying whether the leave event has a Time Off. + + + + + Boolean attribute identifying whether the leave event has a Continuous + + + + + Boolean attribute identifying whether the leave event has a Stock Vesting + + + + + Leave Type Reason + + + + + + + + The response group allows for the response data to be tailored to only included elements that the user is looking for. If no response group is provided in the request then only the following elements will be returned: Reference and Former Worker Data. + + + + + Indicates if the Former Worker Attachments (if they exist) are included in the response. + + + + + + + The information about the former worker document, such as the category and file. + + + + + The ID for the former worker document + + + + + Attachment Filename + + + + + + + + + + Attachment File + + + + + Reference to the former worker + + + + + Category of the document. + + + The category "[cat]" is inactive and cannot be used. + + + + + + + Attachment File Comment + + + + + Text attribute identifying Content Type of the document. + + + + + + + + + + + + Data for a new Academic Affiliate if an affiliate is to be created as part of the appointment. + + + + + Reference ID for Academic Affiliate + + + + + Contains the components of a name, such as the First Name and Last Name. + + + + + All of the person's contact data (address, phone, email, instant messenger, web address). + + + + + Encapsulating element containing all Personal Information for a new Academic Affiliate. + + + + + Wrapper for Person Identification Data. Includes National Identifiers, Government Identifiers, Visa Identifiers, Passport Identifiers, License Identifiers and Custom Identifiers. + + + + + Reference to the location context for the Affiliate. Auto-populated from the country from the person's legal name. + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of Social Benefits Locality and its associated data. + + + + + A unique identifier used to reference a Social Benefits Locality + + + + + + + Request element for Get Social Benefits Localities service task. + + + + + + + + + + + + Reference element representing a unique instance of Social Benefits Locality + + + + + A unique identifier used to reference a Social Benefits Locality + + + + + Encapsulating element containing all Social Benefits Locality data. + + + + + + + Encapsulating element containing all Social Benefits Locality data. + + + + + Reference element representing a unique instance of Social Benefits Locality + + + + + + + Contains the response elements for the Get Social Benefits Localities and Put Social Benefits Localities service requests. + + + + + Request References + + + + + Parameters that let you filter the data returned in the response. You can filter returned data by dates and page attributes. + + + + + The "Response_Results" element contains summary information about the data that has been returned from your request including "Total_Results", "Total_Pages", and the current "Page" returned. + + + + + Encapsulating element containing all Social Benefits Locality data. + + + + + + + + Encapsulating element containing all Social Benefits Locality data. + + + + + The ID for the Social Benefits Locality (Social_Benefits_Locality_ID). + + + A Social Benefits Locality exists with the same Social Benefits Locality ID. + + + + + + + The name of the Social Benefits Locality. + + + Name is required. + + + A Social Benefits Locality with the same name already exists for this Country. Each Social Benefits Locality name within a Country must be unique. + + + + + + + The code for the Social Benefits Locality. + + + + + The description for the Social Benefits Locality. + + + + + The country that the Social Benefits Locality is for. + + + Location (Country or Country Region) is required. + + + + + + + A boolean flag indicating whether the Social Benefits Locality is active or not. + + + + + + + Request element for Put Social Benefits Locality + + + Add Only is set to true. You can not submit a reference to update. Please remove the Add Only flag for updating. + + + + + + + A unique identifier used to reference a Social Benefits Locality + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for the Put Political Affiliation operation. + + + + + A unique identifier used to reference a Social Benefits Locality + + + + + + + + Returns data that is related to a former worker. Any data entered in this element in the Put Request will be ignored. + + + + + Returns true if the former worker has a completed Hire Employee or Contract Contingent Worker business process. + + + + + Returns the applicant used in the Hire or Contract business process. + + + + + Returns the workers for the former worker. + + + + + + + Request element for Put Former Worker Document Request + + + Former Worker Document, '[document]', already exists. + + + Reference to former worker is required if adding a new former worker document + + + Former worker document needs a name if adding a new document + + + Document Category Reference is required when adding a new document. + + + + + + + The reference to the former worker document. + + + + + Wrapper element for the details of a former worker document. + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response Element for Put Former Worker Attachment + + + + + Reference for Former Worker Attachment + + + + + Reference to the former worker + + + + + + + + Request for Get Former Worker Document + + + + + Reference for Former Worker Document Request + + + + + + + + + + + Former Worker Document Response Group which controls the type and amount of data returned. + + + + + Flag indicating if the reference to the Former Worker document should be included. If omitted, the default is to return the references. + + + + + + + Response Element for Get Former Worker Document + + + + + Reference for former worker document request + + + + + + + + + + + + + Reference for Former worker attachment request + + + + + Former Worker Document Reference + + + + + + + Former Worker Document Response Data containing the retrieved Worker Document information. + + + + + Contains the retrieved Former Worker Document information. + + + + + + + Contains the retrieved Former Worker Document information. + + + + + The reference to the former worker document + + + + + + + + Request Criteria for Get Former Worker Documents + + + + + Reference to the former worker + + + + + + + Container for the Personal Information data. + + + + + Reference to the Gender of the person. + + + + + Person's date of birth. + + + Date of birth must precede marital status date, medical exam dates and date of death. This applies to the data in this request as well any existing data on the person that is not being modified. + Date of birth must precede marital status date, medical exam dates and date of death. This applies to the data in this request as well any existing data on the person that is not being modified. + + + Date of birth must precede all disability status dates currently on the person unless all disability data is being replaced. + Date of birth must precede all disability status dates currently on the person unless all disability data is being replaced. + + + Date of birth must precede all military discharge dates currently on the person unless all military service data is being replaced. + Date of birth must precede all military discharge dates currently on the person unless all military service data is being replaced. + + + + + + + Person's date of death. + + + Date of death is only allowed for inactive person. + Date of death is only allowed for inactive person. + + + The date of death cannot be in the future + The date of death cannot be in the future + + + + + + + Country where the person was born. + + + The country of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + The country of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + + + + + Country region where the person was born. + + + A Person cannot have a Birth Region without a corresponding Birth Country. + A Person cannot have a Birth Region without a corresponding Birth Country. + + + The Region of Birth entered is not valid for the corresponding Country of Birth. + The Region of Birth entered is not valid for the corresponding Country of Birth. + + + The country region of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The country region of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + + + + + Person's city of birth. + + + The city of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + The city of birth is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + + + + + Reference for the person's marital status. + + + The marital status does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. + The marital status does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. + + + Inactive marital statuses are not allowed in this request. + Inactive marital statuses are not allowed in this request. + + + + + + + Person's marital status date. + + + The field Marital Status is required and must have a value if a Marital Status Date is entered. + The field Marital Status is required and must have a value if a Marital Status Date is entered. + + + + + + + Reference for the person's ethnicities. + + + The ethnicity does not exist in the specified Location Context. The Location Context is derived from the Country of the Location of the Position + The ethnicity does not exist in the specified Location Context. The Location Context is derived from the Country of the Location of the Position + + + At least one ethnicity in this request is inactive. Only active ethnicities are allowed. + At least one ethnicity in this request is inactive. Only active ethnicities are allowed. + + + Multiple Ethnicities are not allowed for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + Multiple Ethnicities are not allowed for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + + + + + Boolean to indicate if a person is hispanic or latino. + + + Hispanic or Latino is only tracked in the USA and must be enabled in tenant setup by your administrator. + Hispanic or Latino is only tracked in the USA and must be enabled in tenant setup by your administrator. + + + + + + + Reference for a person's religions. + + + The religion is not valid for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The religion is not valid for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + + + + + Reference for the person's citizenship status. + + + The Citizenship Status is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The Citizenship Status is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + At least one citizenship status in this request is inactive. Only active statuses are allowed. + At least one citizenship status in this request is inactive. Only active statuses are allowed. + + + Hukou can only be entered for citizens of China. + Hukou can only be entered for citizens of China. + + + + + + + Reference for the person's Country of Nationality + + + The Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + The Nationality type is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position. + + + + + + + Country Region on the Hukou of the person. + + + Hukou Region must be in China. + Hukou Region must be in China. + + + The hukou region is not tracked for the specified Location Context. + The hukou region is not tracked for the specified Location Context. + + + + + + + Country Subregion on the Hukou of the person. + + + The Hukou Subregion does not exist within the specified Hukou Region or is inactive. + The Hukou Subregion does not exist within the specified Hukou Region or is inactive. + + + The hukou subregion is not tracked for the specified Location Context. + The hukou subregion is not tracked for the specified Location Context. + + + + + + + Locality on the Hukou of the person. + + + The hukou locality is not tracked for the specified Location Context. + The hukou locality is not tracked for the specified Location Context. + + + + + + + Hukou Postal Code for the Person + + + The hukou postal code is not tracked for the specified Location Context. + The hukou postal code is not tracked for the specified Location Context. + + + + + + + Hukou Type on the Hukou of the person. + + + The hukou type is not tracked for the specified Location Context. + The hukou type is not tracked for the specified Location Context. + + + + + + + Native Region on the Hukou of the person. + + + The native region is not tracked for the specified Location Context. + The native region is not tracked for the specified Location Context. + + + + + + + Personnel File Agency is used in China to indicate where persons have their personnel file stored. + + + The Personnel File Agency is not tracked for the specified Location Context. + The Personnel File Agency is not tracked for the specified Location Context. + + + + + + + Person's political affiliation. + + + The political affiliation does not exist in the specified Location Context. + The political affiliation does not exist in the specified Location Context. + + + + + + + Person's Social Benefits Locality. + + + The social benefits locality data has not been activated for this location via the Maintain Localization Settings task. + The social benefits locality data has not been activated for this location via the Maintain Localization Settings task. + + + The social benefits locality does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Social Benefits Locality values are ignored for Puts involving applicants since a Social Benefits Locality value is associated with workers and not applicants. + The social benefits locality does not exist in the specified Location Context. The Location Context is derived from the Country of the Location specified for the Position. Currently, the Social Benefits Locality values are ignored for Puts involving applicants since a Social Benefits Locality value is associated with workers and not applicants. + + + + + + + Date of person's most recent medical examination. + + + Medical exam history is not tracked for the specified Location Context. + Medical exam history is not tracked for the specified Location Context. + + + Medical exam history is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + Medical exam history is not tracked for the specified Location Context. The Location Context is derived from the Country of the Location for the Position + + + + + + + Expiration date of person's most recent medical examination. + + + Last Medical Exam Valid To Date must be after Last Medical Exam Date + Last Medical Exam Valid To Date must be after Last Medical Exam Date + + + + + + + Notes for the person's most recent medical examination. + + + + + + + Person's tobacco usage. Note that starting from W22 this field will no longer be used for update. To update a person's tobacco use, use the Put Worker Wellness Data web service. + + + + + + + Wrapper element for all Military Service data for the person. + + + + + + + When this flag is set to false, existing military data will be preserved. When true, it causes the web service to replace all military data with the information in the request (this is the default behavior when the entire tag is omitted). + + + + + + Wrapper element for each Military Service entry. + + + Military Service Reference is required when deleting a Military Service entry + Military Service Reference is required when deleting a Military Service entry + + + + + + + Reference to an existing Military Service entry for edits and deletes. + + + The Military Service Reference provided is not owned by the person in this request or does not exist. + The Military Service Reference provided is not owned by the person in this request or does not exist. + + + + + + + + + Flag to delete an existing military service entry. If this flag is set, Military Service Reference is also required. + + + + + + Wrapper element for all Disability Status data for the person. + + + + + + + When this flag is set to false, existing disability data will be preserved. When true, it causes the web service to replace all disability data with the information in the request (this is the default behavior when the entire tag is omitted). + + + + + + Wrapper element for each disability status entry. + + + Disability Status Data is required unless the disability status is being deleted. + Disability Status Data is required unless the disability status is being deleted. + + + Disability Status Reference is required when deleting a Disability Status entry. + Disability Status Reference is required when deleting a Disability Status entry. + + + + + + + Reference to an existing Military Service entry for edits and deletes. + + + The Disability Status Reference provided is not owned by the person in this request or does not exist. + The Disability Status Reference provided is not owned by the person in this request or does not exist. + + + + + + + + + Flag to delete an existing disability status entry. If this flag is set, Disability Status Reference is also required. + + + + + + Container for disability status data. + + + + + The person's disability + + + The provided Disability is not valid for the person's location context. The location context is derived from the country of the location specified for the position. + The provided Disability is not valid for the person's location context. The location context is derived from the country of the location specified for the position. + + + + + + + This person's disability status date + + + The Disability Status Date cannot be before the Date of Birth + The Disability Status Date cannot be before the Date of Birth + + + + + + + The date you (the employer) first learned about the disability. + + + The Disability Date Known cannot be before the Date of Birth. + The Disability Date Known cannot be before the Date of Birth. + + + + + + + The date through which the ~person~ is considered disabled. In some countries, this is the date through which the certification for the current level of disability is effective. + + + The Disability End Date cannot be before the Date of Birth. + The Disability End Date cannot be before the Date of Birth. + + + + + + + A code or number that identifies the level of disability. + + + The person's location context is not enabled for Disability Grade. + The person's location context is not enabled for Disability Grade. + + + The provided Disability Grade is not valid for the person's location context or is inactive. + The provided Disability Grade is not valid for the person's location context or is inactive. + + + + + + + A percentage that identifies the ~person's~ level of disability as of the disability date. + + + Disability Degree can not be over 100%. + + + The person's location context is not enabled for Disability Degree. + The person's location context is not enabled for Disability Degree. + + + + + + + + + + + + + + The percentage of that the person may work per labor physician or other authority. + + + Disability Remaining Capacity can not be over 100%. + Disability Remaining Capacity can not be over 100%. + + + The person's location context is not enabled for Disability Remaining Capacity. + The person's location context is not enabled for Disability Remaining Capacity. + + + + + + + + + + + + + + + The name of the person or agency that certified the disability. + + + The provided Disability Authority is not valid for the person's location context or is inactive. + The provided Disability Authority is not valid for the person's location context or is inactive. + + + The provided Disability Authority Reference is not valid or inactive for the person's location context. Or the person's location context is not enabled for Disability Authority. + The provided Disability Authority Reference is not valid or inactive for the person's location context. Or the person's location context is not enabled for Disability Authority. + + + + + + + The name of the person or agency that certified the disability. + + + The person's location context is configured to use Disability Authority Reference. + The person's location context is configured to use Disability Authority Reference. + + + The person's location context is not enabled for Disability Authority. + The person's location context is not enabled for Disability Authority. + + + + + + + + The place where the person or agency certified the disability. + + + The persons's location is not enabled for Disability Certification Location. + The persons's location is not enabled for Disability Certification Location. + + + + + + + The ID provided to the ~person~, if any. + + + The person's location context is not enabled for Disability Certification ID. + The person's location context is not enabled for Disability Certification ID. + + + + + + + How the ~person~ qualified for the certification. + + + The provided Disability Certification Basis is not valid for the person's location context or is inactive. + The provided Disability Certification Basis is not valid for the person's location context or is inactive. + + + The person's location context is not enabled for Disability Certification Basis. + The person's location context is not enabled for Disability Certification Basis. + + + + + + + The date the disability was recognized as severe by the recognizing authority. + + + The Disability Severity Recognition Date cannot be before the Date of Birth. + The Disability Severity Recognition Date cannot be before the Date of Birth. + + + The person's location context is not enabled for Disability Severity Recognition Date. + + + + + + + The FTE that counts towards the employer's quota for hiring the disabled. + + + The person's location context is not enabled for Disability FTE Toward Quota. + The person's location context is not enabled for Disability FTE Toward Quota. + + + + + + + + + + + + + + List any work restrictions that apply to the ~person~. + + + + + Describe any recommendation requested by the ~person~ or their care provider. + + + + + Describe any accommodations provided by you, the employer. + + + + + Describe any rehabilitation measures requested by the ~person~ or their care provider. + + + + + Describe any rehabilitation measures provided by you, the employer. + + + + + Enter any additional information related to this disability. + + + + + Attach a copy of the certification or other documents related to this instance of disability. + + + + + + + Container for military service data for the Person + + + The Military Service Type specified is not valid for Country from Military Status. + The Military Service Type specified is not valid for Country from Military Status. + + + The Military Rank specified is not valid for Military Service Type or Country from Military Status. + The Military Rank specified is not valid for Military Service Type or Country from Military Status. + + + + + + + Reference for the person's military status. + + + Inactive military statuses are not allowed in this request. + Inactive military statuses are not allowed in this request. + + + + + + + Date the person was discharged from the military. + + + Military Discharge Date must be greater than Date of Birth. + Military Discharge Date must be greater than Date of Birth. + + + + + + + Begin Date for military service status + + + Military Status Begin Date must be after Date of Birth. + Military Status Begin Date must be after Date of Birth. + + + + + + + Service type for military service + + + + + Military rank for military service type + + + + + Notes for military service + + + + + + + Top-level request element to create a named professorship + + + + + + Create Named Professorship Data + + + + + + + + Wrapper element for the Create Named Professorship business process. + + + + + The reference to the reason for the Create Named Professorship business process + + + + + The Reference ID for the new Named Professorship + + + The Professorship Code is already in use; you must provide a unique Code. + + + + + + + Initial Established Date for the Named Professorship. + + + Initially Established Date cannot be in the future. + + + + + + + Initial Available Date for the Named Professorship. + + + Initially Available Date needs to be greater than or same with Initially Established Date + + + + + + + Indicates whether or not the Code should be included in the display name of the Named Professorship. + + + + + + + + Top-level response element for Create Named Professorship business process operations. + + + + + Reference to the Create Named Professorship business process. + + + + + Reference to the Gift for which the Named Professorship is being added. + + + + + Reference to the Named Professorship created by the Create Named Professorship business process. + + + + + + + + Wrapper element for the Named Professorship Snapshot. + + + + + Reference to the Gift for which the Named Professorship is being added. + + + Named Professorship cannot be created for Gifts on which Gift Purpose is not set to Named Professorship. + + + + + + + The Professorship Name for the Named Professorship. + + + Professorship Name is required + + + + + + + Named Professorship Title for the Named Professorship. + + + Professorship Title is required + + + + + + + Academic Unit for the Named Professorship. + + + Academic Unit is required + + + Select an Academic Unit that is available as of [Start Date]. + + + + + + + Term limits in months for the Named Professorship. + + + + + + + + + + + + Appointment restrictions text for the Named Professorship. + + + + + + + Edit Named Professorship Event Request + + + + + Parameters for Edit Named Professorship Business Process Parms + + + + + Wrapper for Edit Named Professorship Request Data + + + + + + + + Wrapper Element for Named Professorship Data + + + Cannot have an On Hold Date and Discontinued Date at the same time. + + + + + + + Reference Named Professorship for Edit + + + You cannot edit this Named Professorship as there are other events in progress. + + + + + + + Effective Date for Edit Named Professorship + + + An edit on the same day is not allowed. The effective date must be greater than [last effective date]. + + + Out of order edits are not allowed. The effective date must be greater than [last effective date]. + + + Effective Date must be greater than Initially Established Date of the Named Professorship + + + + + + + Reference to reason for Edit Named Professorship + + + + + Determines whether the Code is included in the Display name of the Named professorship + + + + + Date Named Professorship is available + + + Cannot update the initially available date. This Named Professorship is available on [availDate] + + + Initially Available Date needs to be greater than or same with Initially Established Date + + + + + + + On hold date of Named Professorship + + + On Hold Date must be greater than or equal to Initially Available Date + + + On Hold Date needs to be greater than or same as Initially Established Date + + + Initially Available Date needs to have a value before setting an On Hold Date for Named Professorship + + + Enter a different On Hold Date; there is an active Appointment at the date entered. + + + + + + + Discontinued Date of Named Professorship + + + Discontinued Date must be greater than Initially Available Date + + + Discontinued Date must be greater than or equal to Initially Established Date + + + Initially Available Date needs to have a value before setting a Discontinued Date for Named Professorship + + + Enter a different Discontinued Date; there is an active Appointment at the date entered. + + + + + + + + + + Wrapper for Edit Named Professorship Web Service Response + + + + + Event Reference + + + + + Gift Reference + + + + + Named Professorship Reference + + + + + + + + Leave Request Additional Fields + + + + + Last Date for which paid (Canada) + + + + + Expected due date + + + + + Child's birth date + + + + + Still birth or baby deceased + + + + + Date baby arrived home from hospital + + + + + Adoption placement date + + + + + Adoption notification date + + + + + Date child entered country + + + + + Multiple child indicator + + + + + Number of babies or adopted children + + + + + + + + + + + + Number of previous births + + + + + + + + + + + + Number of previous maternity leaves + + + + + + + + + + + + Number of child dependents + + + + + + + + + + + + Boolean to indicate single parent + + + + + Age of dependent + + + + + + + + + + + + Work related + + + + + Date when paid leave ends. + + + + + IMSS Folio Code. + + + + + + + + + + Location for a worker on leave at another academic institution. + + + + + Indicates Caesarean Section Birth. + + + + + Used to record the percentage of working time for which the employee is on leave. Used when a worker is on partial leaves. + + + + + + + + + + + + Used to record the date of the Sunday prior to the expected due date. + + + + + Used to record the value of an override to entitlement. + + + + + + + + + + + Used to record date of recall used in Canada ROE report. + + + + + + + Encapsulating element containing all Collective Agreement data. + + + + + Assign Employee Collective Agreement Event + + + + + The Effective Date of the Assign Employee Collective Agreement Event + + + + + The Collective Agreement End Date is populated if there is an End Collective Agreement Event for the Collective Agreement that is being displayed or if the Collective Agreement has been ended + + + + + The Collective Agreement Snapshot Data. + + + + + + + Encapsulating element containing all Collective Agreement data. Including Corrected data. + + + + + + + + Encapsulating Element containing the Collective Agreement Classification Parameter Data. + + + + + The Collective Agreement Reference. + + + + + + + + Encapsulating Element for the Collective Agreement Snapshot Data. + + + + + The Order of the Collective Agreement Factor Parameter. + + + + + + + + + + The Collective Agreement Factor for this Collective Agreement Factor Parameter. + + + + + The Collective Agreement Factor Option for this Collective Agreement Factor Parameter. + + + + + + + Wrapper element for Assign Employee Collective Agreement event. + + + You are missing a value for one or more other collective agreement factors required for your current factor value selection. Enter the missing value(s) or change your selection of factor values. Access the collective agreement to see the valid combinations of factor values defined for this collective agreement. + + + + + + + Position of the Worker. If the Worker has only one position, the position will be defaulted, but If the Worker has multiple positions, it is expected in the request. + + + Worker has multiple Positions. Please send the Postion in the request. + + + Position is not valid for the worker. + Position: [position] + Worker: [worker] + + + Position: [pos] is not valid at the time of the Event Effective Date: [date] + + + + + + + Contains data for Assign Employee Collective Agreement event. + + + Collective Agreement: [ca] is not valid for the date range of the event effective date or is not valid for the Country of the location or is Inactive + + + + + + + Wrapper for collective agreement factors and factor options. + + + + + + + Wrapper for collective agreement factors and factor options. + + + + + Container for the collective agreement factor 1 and factor option 1 data. + + + + + Container for the collective agreement factor 2 and factor option 2 data. + + + + + Container for the collective agreement factor 3 and factor option 3 data. + + + + + Container for the collective agreement factor 4 and factor option 4 data. + + + + + Container for the collective agreement factor 5 and factor option 5 data. + + + + + + + Container for the collective agreement factor 1 and factor option 1 data. + + + You must provide a Collective Agreement Factor for each Collective Agreement Factor Option and vice-versa. + + + + + + + Contains collective agreement factor 1 data + + + + + Contains collective agreement factor option 1 data. + + + + + + + Container for the collective agreement factor 2 and factor option 2 data. + + + You must provide a Collective Agreement Factor for each Collective Agreement Factor Option and vice-versa. + + + + + + + Contains the collective agreement factor 2 data. + + + + + Contains the collective agreement factor 2 option data. + + + + + + + Container for the collective agreement factor 3 and factor option 3 data. + + + You must provide a Collective Agreement Factor for each Collective Agreement Factor Option and vice-versa. + + + + + + + Contains the collective agreement factor 3 data. + + + + + Contains the collective agreement factor 3 option data. + + + + + + + Container for the collective agreement factor 4 and factor option 4 data. + + + You must provide a Collective Agreement Factor for each Collective Agreement Factor Option and vice-versa. + + + + + + + Contains the collective agreement factor 4 data. + + + + + Contains the collective agreement factor 3 option data. + + + + + + + Container for the collective agreement factor 5 and factor option 5 data. + + + You must provide a Collective Agreement Factor for each Collective Agreement Factor Option and vice-versa. + + + + + + + Contains the collective agreement factor 5 data. + + + + + Contains the collective agreement factor 5 option data. + + + + + + + Request Element consisting of Business Process Parameters and element with Worker and Collective Agreement details + + + + + Business process parameters + + + + + Worker, Position, Effective Date and Collective Agreement data + + + + + + + + Assign Employee Collective Agreement element that has the Worker data, Position data, effective date and also contains the Collective Agreement data + + + + + Worker for the Collective Agreement Event + + + Either the Worker or the Position is required in the Assign Employee Collective Agreement Event Request. + + + You cannot assign a new collective agreement to this worker because another collective agreement event is in progress. + + + + + + + Effective Date of the Assign Collective Agreement to the Worker + + + + + Contains the Data relevant to the Collective agreement + + + + + + + Response for the Assign Collective Agreement Event + + + + + Returns the instance ID of the Collective Agreement event that has been added to the Worker + + + + + + + + Wrapper element to hold the data for the emergency contacts of a person + + + You cannot initiate this action because there are other pending or completed actions for the person. + You cannot initiate this action because there are other pending or completed actions for the person. + + + One and only one emergency contact can be specified as Primary. + One and only one emergency contact can be specified as Primary. + + + Primary Emergency Contact must be specified when Replace All is set. + Primary Emergency Contact must be specified when Replace All is set. + + + + + + + A unique identifier for the person. + + + + + This flag controls whether or not to replace existing emergency contacts for the person. When true, existing emergency contacts are removed before the data in this web service request is processed. + + + + + Data related to a emergency contact person + + + + + + + This web service allows the updating of emergency contacts for a person + + + + + + Wrapper element to hold the emergency contacts for a person + + + + + + + + Response for the change emergency contacts web service. + + + + + Event ID of the Emergency Contact Event + + + + + + + + Wrapper element to hold reference and data for an emergency contact. + + + Please Specify a Contact Name + Please Specify a Contact Name + + + Please specify the Related Person Relationship. + Please specify the Related Person Relationship. + + + Either a phone number, or an email address must be specified for an emergency contact. + Either a phone number, or an email address must be specified for an emergency contact. + + + Primary Emergency Contact cannot be deleted. + Primary Emergency Contact cannot be deleted. + + + The emergency contact reference does not belong to the Person reference. + The emergency contact reference does not belong to the Person reference. + + + Primary emergency contact must have numeric priority of 1. + Primary emergency contact must have numeric priority of 1. + + + Alternate emergency contacts must have priority greater than 1 + Alternate emergency contacts must have priority greater than 1 + + + Emergency Contact Reference is required when deleting a emergency contact entry. + Emergency Contact Reference is required when deleting a emergency contact entry. + + + Please mark another emergency contact as Primary. One and only one emergency contact must be specified as Primary. + Please mark another emergency contact as Primary. One and only one emergency contact must be specified as Primary. + + + + + + + Reference to the emergency contact that the data will be applied to + + + + + Flag indicating that the referenced data should be deleted. + + + + + + + + Wrapper element for the emergency contact + + + The Emergency Contact ID field is for updating the value of the Emergency Contact's integration ID. It cannot be the same as the ID on another Emergency Contact. + Emergency Contact ID, "[ID]" is already in use by another Emergency Contact. Please choose a different Emergency Contact ID. + + + + + + + The new Reference ID for Emergency Contact + + + + + Flag to specify the emergency contact is primary or not. + + + + + The order of the priority of the emergency contact + + + + + + + + + + + Relationship of the emergency contact to the person. + + + + + The preferred language for the emergency contact. + + + + + The name and contact information of the emergency contact + + + + + + + Wrapper element for the 'Reassign Superior to Inactive Organization' web service. + + + Organization must be inactive and it must not currently have a superior, but it must have had a superior in the past. + + + + + + + The organization that is currently inactive, does not have a superior, and the latest event was 'Inactivate' and which is the object of this transaction. + + + + + + + Provides ability to assign the previous superior to an organization that is currently inactive, does not have a superior, and the latest event was 'Inactivate'. + + + + + Container for the processing options for a business process. If no options are submitted (or the options are submitted as 'false') then the business process is simply initiated as if it where submitted on-line with approvals, reviews, notifications and to-do's in place. If the Initiator is an Integration System User, any validations you configured on the Initiation step are ignored. + + + + + Wrapper element for the Reassign Superior to Inactive Organization web service operation. + + + + + + + + Responds with the Event ID for the Assign Superior Event. + + + + + Responds with the Event ID for the Assign Superior Event. + + + + + + + + Organization Assignments information for Location Hierarchy to be updated or returned. + + + + + The Location Hierarchy whose allowed organization assignments will be set/get. + + + + + Organization Assignments by Organization Type + + + + + + Set to true if you want to replace all Organization Assignments + + + + + + Request Element for Location Hierarchy Organization Assignment. + + + + + Input data for Organization Assignments; the Location Hierarchy Reference, and Organization Type Data Element + + + + + + + + Input Element for Organization Type and Allowed Organizations data. + + + Organization Assignments cannot be specified for this organization type. + Organization Assignments cannot be specified for this organization type ([org type]). + + + + + + + Organization Type for Allowed Organizations + + + + + Allowed Organizations + + + + + + Set to true if you want to delete the organization assignments + + + + + + The Put Location Hierarchy Organization Assignments responds with the Location Hierarchy whose Organization Assignments have been updated. + + + + + The Location Hierarchy in whose allowed organization assignments are changed. + + + + + + + + References to Location Hierarchies for which to request their Organization Assignments. Can take one or more references + + + + + Reference to Location Hierarchy for Organization Assignments. + + + + + + + References to Location Hierarchies and filter options to request their Organization Assignments + + + + + + + + + + The Get Location Hierarchy Organization Assignments respond with Location Hierarchies whose Organization Assignments are requested. + + + + + + + + + + + + Returned information from the Location Hierarchy Organization Assignments request. + + + + + + + + Location Hierarchy Organization Assignments + + + + + + + + Organization Reference ID Request References + + + + + Holds Organizations for which IDs are to be retrieved. + + + + + + + Organization Reference ID Request Criteria + + + + + Request for Get Organization Reference IDs. + + + + + + Organization Reference ID Request References + + + + + Organization Reference ID Request Criteria + + + + + + + + + + Organization Reference ID Response Data + + + + + The Reference ID information is for this Organization. + + + + + + + + Organization Reference ID Response Data + + + + + Holds Organization Reference ID information + + + + + + + Response for Get Organization Reference IDs + + + + + + Request Criteria + + + + + + + Response Data + + + + + + + + Holds data for Organization Reference ID + + + + + Organization Reference ID + + + The proposed reference id is already in use on a different organization. Duplicate reference ids are not allowed because the reference id must be unique for integrations. + + + + + + + Organization Name. This field is read-only and should not be post back in Put Organization ID Request. + + + + + This option is only allowed for Supervisory Organization at the moment. When set to true, Supervisory Organizations will have Organization Reference ID suffixed to their names. A new effective-dated organization name is automatically created if value for this field is different as of current moment. + + + 'Include Organization ID in Name' can only be set to true for supervisory organizations. + + + + + + + + + Request for Put Organization Reference ID + + + + + Holds the Organization for which Organization Reference ID is going to be changed. + + + + + + + + + Response for Put Organization Reference ID + + + + + The Organization for which the Organization Reference ID information has been changed. + + + + + + + + Allowed Organization Data + + + + + Allowed Organization References + + + + + + Boolean to indicate if existing default value is to be deleted. The existing default value must be correctly specified. Do not set to true (or 'y' in EIB) to replace the existing default value. + + + + + + Default Organization Data + + + + + Default Organization Reference + + + + + + When set to TRUE, the values in Default_Organization_Reference will be removed from existing Default Organization; + when omitted or set to FALSE, the values in Default_Organization_Reference will be merged into existing Default Organization. + If inheritance of default and allowed values from the superior is being severed, setting this to 'TRUE' will not persist inherited values for this org type. + + + + + + Data for Committee Type + + + + + Unique Identifier for the committee type. If not entered, one will be generated. + + + + + Committee Type Name. Required for add. + + + The Committee Type Name already exists; enter a new unique name value. + + + + + + + Search Committee + + + You cannot change Search Committee to No. This Committee Type is in use by at least one committee with a related job requisition. + + + + + + + A boolean flag to set the committee type inactive. + + + + + + + Contains the instructions for adding or updating a committee type. + + + Add Only is true but Committee Type ID is already in use. + + + + + + + Unique Reference to the Committee Type. Used to identify the Committee Type to update. Leave blank on an Add. + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Put Committee Type Response + + + + + Unique Reference to the Committee Type. Used to identify the Committee Type to update. Leave blank on an Add. + + + + + + + + Committee Type Request References + + + + + Committee Type Request References + + + + + + + Committee Type Request Criteria + + + + + Committee Type Response Group + + + + + Boolean flag to include Reference in response. + + + + + + + Get Committee Types Request + + + + + + Committee Type Request References + + + + + Get Committee Types Request + + + + + + Response Filter + + + + + Committee Type Response Group + + + + + + + + Committee Type + + + + + Unique Reference to a Committee Type + + + + + Data for Committee Type + + + + + + + Committee Type Response Data + + + + + Committee Type + + + + + + + Committee Type Response Data + + + + + Committee Type Response Data + + + + + Committee Type Request Criteria + + + + + Response Filter + + + + + Committee Type Response Group + + + + + Response Results + + + + + Committee Type Response Data + + + + + + + + Data Committee Classification Group + + + + + Unique Identifier for the committee classification group. If not entered, one will be generated. + + + + + Committee Classification Group Name. Required for add. + + + Enter a unique Classification Group Name. The one you entered already exists. + + + + + + + A boolean flag to set the committee classification group inactive. + + + You can't deactivate this Classification Group, since it contains active Classifications. + + + You can't deactivate this Classification Group, since it contains active Classifications. + + + + + + + Included classifications for classification group + + + + + + + Contains the instructions for adding or updating a committee classification group + + + Add Only is true but Committee Classification Group ID is already in use. + + + + + + + Unique Reference to the Committee Classification Group. Used to identify the Committee Classification Group to update. Leave blank on an Add. + + + + + Data Committee Classification Group + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Committee Member Type + + + + + Committee Classification Group Reference + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Committee Classification Group and its associated data. + + + + + Unique Reference to the Committee Classification Group. Used to identify the Committee Classification Group to update. Leave blank on an Add. + + + + + + + Committee Classification Group Request Criteria + + + + + Committee Classification Group Response Group + + + + + Boolean flag to include Reference in response. + + + + + + + Request element used to retrieve Committee Classification Groups and their data. + + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Committee Classification Group and its associated data. + + + + + Committee Classification Group Request Criteria + + + + + + + Committee Classification Group Response Group. + + + + + + + + Contains the data for a Committee Classification Group. + + + + + Unique Reference to the Committee Classification Group. + + + + + Committee Classification Group Data + + + + + + + Documentation Response element containing an instance of a Committee Classification Group and its associated data. + + + + + + + + Response element containing an instances of committee classification group and their associated data. + + + + + + + + + + Committee Classification Group Response Data + + + + + + + + Data for Committee Classification + + + + + Unique Identifier for the committee classification. If not entered, one will be generated. + + + + + Committee Classification Name. Required for add. + + + Enter a unique Classification Name. The one you entered already exists. + + + + + + + A boolean flag to set the committee classification inactive. + + + You can't activate this Classification, since it belongs to a inactive Classification Group. + + + + + + + Committee Classification Group for Classification + + + + + + + Contains the instructions for adding or updating a committee classification. + + + Add Only is true but Committee Classification ID is already in use. + + + + + + + Unique Reference to the Committee Classification . Used to identify the Committee Classification Committee Classification to update. Leave blank on an Add. + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Put Committee Classification Response + + + + + Committee Classification Reference + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Committee Classification and its associated data. + + + + + Unique Reference to the Committee Classification. Used to identify the Committee Classification Group to update. Leave blank on an Add. + + + + + + + Committee Classification Request Criteria + + + + + Committee Classification Response Group + + + + + Boolean flag to include Reference in response. + + + + + + + This operation retrieves Committee Classifications + + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Committee Classification and its associated data. + + + + + Committee Classification Request Criteria + + + + + + + Committee Classification Response Group. + + + + + + + + Contains the data for a Committee Classification. + + + + + Unique Reference to the Committee Classification. + + + + + + + + Get Committee Classifications Response + + + + + + + + Get Committee Classifications Response + + + + + + + + + + Committee Classification Response Data + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Committee Member Type and its associated data + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Committee Member Type and its associated data. + + + + + + + Committee Membership Type Request Criteria + + + + + Committee Membership Type Response Group + + + + + Boolean flag to include Reference in response. + + + + + + + Get Committee Membership Types Request + + + + + + + + + + + + + + Contains the data for a Committee Membership Type + + + + + Unique Reference to the Committee Member Type + + + + + Committee Member Type Data + + + + + + + Response element containing an instances of committee member type and their associated data + + + + + Contains the data for a Committee Member Type + + + + + + + Response element containing an instances of committee membership type and their associated data + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Committee member Type and its associated data. + + + + + Committee Member Type Request Criteria + + + + + Response Filter + + + + + Committee Member Type Response Group + + + + + Response Results + + + + + Committee Member Type Response Data + + + + + + + + Data for Committee Membership Type + + + + + Unique Identifier for the committee member type. If not entered, one will be generated. + + + + + Committee Member Type Name. Required for add. + + + The Membership Type Name already exists; enter a new unique name value. + + + + + + + A boolean flag to disable this Committee Membership Type from being assigned to any new membership profiles. Note: This Committee Membership Type still appears in historical reporting. + + + + + + + Put Committee Membership Type Request + + + Add Only is true but Committee Membership Type ID is already in use. + + + + + + + Unique Reference to the Committee Member Type. Used to identify the Committee Member Type to update. Leave blank on an Add. + + + + + Data for Committee Member Type + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Put Committee Membership Type Response + + + + + Committee Member Type Reference + + + + + + + + Encapsulating element containing all Probation Period data. Including Corrected data. + + + + + Probation Period Event Reference for the Worker's effective Position + + + + + The Probation Period reference. + + + + + Effective Date of the Probation Period Event + + + + + Probation Start Date of the Probation Period belonging to the effective Position + + + + + Probation End Date of the Probation Period belonging to the effective Position + + + + + Probation Type of the Probation Period belonging to the effective Position + + + + + Probation Reason of the Probation Period belonging to the effective Position + + + + + Probation Extended End Date of the Probation Period belonging to the effective Position + + + + + Note / Comments of the Probation Period belonging to the effective Position + + + + + + + Request element for the Manage Committee Membership business process web service. + + + + + + Wrapper Element for the Manage Committee Membership business process web service. + + + + + + + + Manage Committee Membership Data, contains the data for the Manage Committee Membership event + + + The Committee Membership referenced for the update does not exist for the Committee/Member Name combination or the Effective Date is out of order. + + + You haven't changed any membership information. Click Cancel or enter changes. + + + A membership already exists for this member. + + + The Committee Membership referenced for the update does not exist for the Committee/Member Name combination or the Effective Date is out of order. + + + You cannot initiate this action because there are other pending or completed actions that conflict with this one. + + + The Manage Professional Affiliation Sub Business Process element is only valid for new External Committee Members + + + + + + + + Wrapper for all the data needed for creating a new External Committee Member + + + + + Committee Member Reference for the Manage Committee Membership Service + + + + + + Effective Date for the Manage Committee Membership Service Event, will be the start date for a new Committee Membership Service + + + An update is not allowed for the date you entered. The Effective Date must be greater than the latest entry made dated [snapshot date]. + + + + + + + Reason Reference for the Manage Committee Membership Service + + + The Event Reason supplied is invalid for this business process. + + + + + + + Committee Reference for the Manage Committee Membership Service + + + The Committee supplied is Inactive; only Active values are allowed for Memberships. + + + + + + + Committee Membership Type Reference for the Manage Committee Membership Service + + + The Membership Type supplied is Inactive; only Active values are allowed for Memberships. + + + + + + + End Date for the Manage Committee Membership Service + + + Enter an End Date that is on or after [Effective Date]. + + + End Date must be less than the Start Date of the next Membership. + + + End Date must be less than the Start Date of the next Membership. + + + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + Top level response for Manage Committee Membership business process operation + + + + + Reference to the Manage Committee Membership business process. + + + + + + + + Probation Period Request Element + + + + + Business Process Parameters + + + + + Details of the Probation Period that is being added to the Worker + + + + + + + + Details of the Probation Period being added to the Worker + + + + + Employee for the probation period + + + Either the Worker or the Position is required in the Manage Probation Period Event Request. + + + + + + + Position for which the Probation Period is being added / modified + + + Position must be submitted. If you submitted only a Worker reference, then this worker has more than one position you have access to. + If you submitted a Position Management Position ID, and more than one worker is filling that position (it has been overlapped) - please submit the worker reference as well so we can identify which worker to process. + + + Position is not valid for this Worker as of the effective date. + Worker: [worker] + Position: [position] + Date: [date] + + + Position submitted is not filled as of the effective date. + + + + + + + Probation Period that needs to be updated + + + Probation Period is not valid for the Worker. + + + + + + + Probation Period Start Date + + + Enter a Start Date that is on or between the Worker's relevant Hire Date and Termination Date. + + + + + + + Probation Period End Date + + + The Probation Start Date and End Date range overlaps with another probation period. Change the dates so that the ranges do not overlap. + + + Enter a Probation End Date that is after the Probation Start Date. + + + The Probation End Date overlaps with another employment period. Change the Probation End Date so it doesn't overlap with the employment period date range. + + + + + + + Probation Period Type + + + Probation Period Type may not be valid for the Country of the Worker's Position or may be Inactive + + + + + + + Probation Period Reason + + + Probation Period Reason may not be valid for the Country of the Worker's Position or may be Inactive or Probation Reason is not a Manager Reason if Processing User is Manager. + + + + + + + Extended End Date of the Probation Period + + + The Probation Start Date and Extended End Date range overlaps with another probation period. Change the dates so that the ranges do not overlap. + + + Enter an Extended End Date that is after the End Date. + + + Extended End Date cannot be entered without an End Date + + + The Probation Extended End Date overlaps with another employment period. Change the Probation Extended End Date so it doesn't overlap with the employment period date range. + + + + + + + Comments / Note + + + + + + + Manage Employee Probation Period Response + + + + + The Probation Period Event that is created for the Woker + + + + + + + + Contains the instructions for adding or updating a committee definition. + + + Committee already exists + + + + + + + Committee Definition + + + + + + + Add or Update + + + + + + + Wrapper element for the Maintain Committee Definition Task + + + Cannot Include Subtype in Name and Include Type in Name. Please choose one or the other. + + + + + + + Integration Reference ID used for integration purposes; This is also the Committee ID + + + + + Private Committee + + + Committees must have roles assigned before they can become private. Load this committee as public. Then assign role holders in Workday. After role holders are assigned, you can make the committee private. + + + + + + + Include Code in Name + + + + + Committee Type + + + Cannot submit an inactive Committee Type + + + Select a search committee type because a job requisition has been related to this committee. + + + + + + + Include Type in Name + + + + + Committee Subtype + + + + + Include Subtype + + + + + Committee Classification + + + Cannot use inactive committee classifications. + + + + + + + Publishable + + + + + External URL + + + + + + + + + Maintain Committee Definition Response + + + + + Committee Definition Reference + + + + + + + + Wrapper element for the Committee Definition Snapshot. + + + + + Effective Date + + + + + Committee Name + + + The Committee Name entered is in use by another committee in the same Sponsoring Organization. Enter a unique Committee Name. + + + + + + + Committee Code + + + + + Sponsoring Organization + + + Cannot choose an inactive Sponsoring Organization for Committee + + + Select a Sponsoring Academic Unit that is available as of [Effective Date]. + + + + + + + Job Requisition + + + Related Job Requisition(s) are only allowed for Search Committee Types. Ensure the committee is a Search Committee Type before entering related job requisitions. + + + Select a Job Requisition that isn't already related to a committee. Job Requisitions can only be related to 1 committee. + + + + + + + Superior Committee + + + Superior Committee must be an active committee. + + + Superior Committee cannot be the same as the Committee being edited. + + + + + + + Committee Summary + + + + + Committee Purpose -Detailed + + + + + Inactive Flag + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Committee and its associated data. + + + + + Committee Request Refereneces + + + + + + + Committee Definition Request Criteria + + + + + Committee Defintion Response Group + + + + + Include Request References + + + + + + + Wrapper for Committee Definition Request + + + + + + + + + + + + Committee Definition Response + + + + + Wrapper for Committee Definition + + + + + + + Response element containing an instances of committee definition and their associated data + + + + + + + + + + Committee Definition Response Data + + + + + + + + Committee Definition Response Data + + + + + Committee Definition Instance + + + + + + + + This element reports Pay Group Assignment rescind events. + + + + + Effective Date of the original Assign Pay Group Event + + + + + Completed Date + + + + + Pay Group Assignment Corrected? + + + + + Pay Group Assignment Rescinded? + + + + + The original Pay Group that the Employee belonged to prior the Pay Group Assignment. + + + + + The Pay Group to which the Employee was to be assigned. + + + + + + + Encapsulating element containing all Probation Period data. + + + + + The Worker's Probation Period Data. + + + + + + + Element for the attachments pertaining to a Event entered through a web service. + + + + + Filename for the attachment. + + + + + + + + + + Free form text comment about the attachment. + + + + + Category of attachment. + + + This Business Process Type has been configured to not accept Attachment Categories. + + + + + + + Binary file contents. + + + + + Text attribute identifying Content Type of the Attachment. + + + + + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of LGBT Identifications and its associated data. + + + + + A unique identifier used to reference a LGBT Identification + + + + + + + Request element for Get LGBT Identification service task. + + + + + + + + + + + + Reference element representing a unique instance of LGBT Identification + + + + + A unique identifier used to reference a LGBT Identification + + + + + Encapsulating element containing all LGBT Identification data. + + + + + + + Encapsulating element containing all LGBT Identification data. + + + + + Reference element representing a unique instance of LGBT Identification + + + + + + + Contains the response elements for the Get LGBT Identification and Put LGBT Identification + + + + + Request References + + + + + Parameters that let you filter the data returned in the response. You can filter returned data by dates and page attributes. + + + + + The "Response_Results" element contains summary information about the data that has been returned from your request including "Total_Results", "Total_Pages", and the current "Page" returned. + + + + + Encapsulating element containing all LGBT Identification data. + + + + + + + + Encapsulating element containing all LGBT Identification data. + + + + + The ID for the LGBT Identification (LGBT_Identification_ID). + + + + + The name of the LGBT Identification. + + + + + The description for the LGBT Identification. + + + + + The country that the LGBT Identification is for. + + + + + The Inactive status for this LGBT Identification. + + + + + + + Request element for Put LGBT Identification + + + Add Only is set to true. You can not submit a reference to update. Please remove the Add Only flag for updating. + + + + + + + A unique identifier used to reference a LGBT Identification + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Response element for the Put LGBT Identification operation. + + + + + A unique identifier used to reference a LGBT Identification + + + + + + + + This element contains data about each Specialty-Subspecialty combination associated with the certification achievement + + + [specname] is inactive. Specify an active specialty. + + + [subspecname] is inactive. Specify an active subspecialty. + + + Add a Specialty that isn't already in use. + + + The specialty must be associated with the certification on the Create Certification or Edit Certification task. + + + You can't specify a restricted specialty for a certification that isn't included in your Certifications library. + + + The subspecialty must be associated with the entered specialty. + + + + + + + A specialty added to the certification achievement + + + + + The subspecialty associated with the specialty. + + + + + + + Data for Appointment Specialty + + + + + Unique Identifier for the appointment specialty. If not entered, one will be generated. + + + + + Reference to Specialty + + + The combination of Academic Unit/Hierarchy and Specialty supplied already exists. + + + + + + + Academic Unit or Academic Unit Hierarchy Reference + + + You can't delete an Appointment Specialty that is assigned to an appointment. + + + You must enter an Academic Unit or Academic Unit Hierarchy to add a specialty. + + + + + + + A boolean flag to disable this appointment specialty from being assigned to any appointment + + + + + + + Put Appointment Specialty Request + + + Add Only is true but Appointment Specialty ID is already in use. + + + + + + + Unique Reference to the Appointment Specialty. Used to identify the Appointment Specialty to update. Leave blank on an Add. + + + + + Data for Appointment Specialty + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Put Appointment Specialty Response + + + + + Appointment Specialty Reference + + + + + + + + Get Appointment Specialties Request + + + + + Utilize the Request References element to retrieve a specific instance(s) of an Appointment Specialty and its associated data. + + + + + + + Appointment Specialty Request Criteria + + + + + Appointment Specialty Response Group + + + + + Boolean flag to include Reference in response. + + + + + + + Get Appointment Specialties Request + + + + + + Utilize the Request References element to retrieve a specific instance(s) of an Appointment Specialty and its associated data + + + + + Appointment Specialty Request Criteria + + + + + + Parameters that let you filter the data returned in the response. You can filter returned data by dates and page attributes. + + + + + Appointment Specialty Response Group + + + + + + + + Appointment Specialty + + + + + Appointment Specialty Reference + + + + + + + + Appointment Specialty Response Data + + + + + Appointment Specialty + + + + + + + Get Appointment Specialties Response + + + + + + + + + + Appointment Specialty Response Data + + + + + + + + Container for Membership Targets + + + + + Membership Target Class that is created/updated + + + + + Member type for Target + + + Each Membership Type can be selected only once. + + + There must be a Membership Type selected. + + + Each Membership Type can be selected only once. + + + + + + + Number of Member types targeted + + + Since you specified the Unlimited Quantity as zero, specify a Target Quantity greater than zero. + + + + + + + + + + + + + + Number of Member Types targeted is unlimited + + + Select either Unlimited or Target Quantity + + + + + + + + Delete Flag for deleting membership target for committee + + + Committee Membership Target must be included to be deleted + + + + + + + Add Only being true will add a new Target to Committee IFF Delete is false, Add Only being false requires reference to target and updates the membership target + + + Cannot add a new Committee Membership Target and update a Committee Membership Target at the same time. + + + + + + + + End Collective Agreement Assignment element that has the Worker data, Position data, and effective date + + + Either the Worker or the Position is required in the End Collective Agreement Assignment Event Request + + + + + + + The Worker for End Collective Agreement Assignment + + + + + The Position for End Collective Agreement Assignment + + Position_ID + + Worker has multiple Positions. Please send the Postion in the request. + + + Position: [position] is not valid for the Worker: [worker] + + + Position: [position] is not valid at the time of the Event Effective Date: [date] + + + + + + + Effective Date of the End Collective Agreement Assignment for the Worker + + + + + + + Request Element consisting of Business Process Parameters and element with End Collective Agreement Assignment details + + + There is no Collective Agreement that can be ended for the Worker as of the selected date for the Worker's chosen Position. + + + This worker already has End Collective Agreement Assignment event in progress . + + + + + + + Business process parameters + + + + + Worker, Position, and Effective Date data + + + + + + + + Response Element consisting of End Collective Agreement Assignment Event reference + + + + + The reference to the generated End Collective Agreement Assignment Event + + + + + + + + Reference Element for Committee Meeting + + + + + Reference for Committee Meeting + + + + + + + Request Criteria for Committee Meeting + + + + + Response Group for committee meeting + + + + + boolean that checks on whether or not to include the reference ID + + + + + + + Request to Get Committee Meetings + + + + + + References for Committee Meeting + + + + + Request Criteria for Committee meeting + + + + + + + + + + + Committee Meeting Element + + + + + container for the created committee meeting + + + + + + + + Response element for Get Committee Meetings + + + + + + + + Full response report for get committee meetings + + + + + Reference filters + + + + + Criteria filters + + + + + + Response group + + + + + + + + + + Data about the Committee Meeting + + + + + Reference ID for the Committee Meeting + + + + + Committee for the Committee Meeting + + + You can't change the committee associated with this committee meeting. + + + + + + + Committee Meeting Status + + + + + Host + + + + + Committee Meeting Type + + + The Meeting Type value supplied is invalid or inactive. + + + + + + + Committee Meeting Subject + + + + + Summary of the committee meeting + + + + + Date the committee meeting will take place + + + + + Time the committee meeting will take place + + + + + Time Zone the committee meeting time and date are based off of + + + + + Duration of the meeting in hours + + + + + + + + + + + + Location of the meeting + + + + + + All members in the committee as of the meeting date. + + + + + Committee members that are participating in the meeting + + + + + + Committee members that attended the meeting + + + + + Meeting minutes + + + + + Attachments for the meeting + + + + + Action Items for the meeting + + + + + Meeting Agenda + + + + + + + Data for Committee Meeting Web Service Request + + + Reference ID [RefID] assigned to a Committee Meeting is not unique in the system. + + + + + + + Committee meeting reference + + + + + Data for committee meeting + + + + + + Specifies whether the request is for only adding new committee meetings or editing existing committee meetings. + + + + + + + Response data for put committee meeting request + + + + + Committee meeting reference + + + + + + + + Establishment References + + + + + Establishment References + + + + + + + Request Criteria + + + + + Country for Establishments + + + + + + + Get Establishments Request + + + + + + Request References + + + + + Request Criteria + + + + + + Response Filter + + + + + + + + Establishments Data wrapper + + + + + Establishment Reference + + + + + + + + Response Data + + + + + Establishment Data + + + + + + + Get Establishments Response + + + + + + + + + Response Data + + + + + + + + Establishment Data wrapper + + + Once an Establishment has been created, the Country may not be changed. + + + Establishment Number and Country are required when creating a new Establishment. Neither can be changed when Updating an Establishment + + + The Country Reference provided does not have Establishment Settings defined. + + + All Locations provided must exist within the provided Country Reference + + + All Locations provided must exist within the referenced Establishment's Country + + + All Legal Entities provided must be of the same Legal Entity Type as defined in the Establishment Settings for provided Country Reference + + + All Legal Entities provided must be of the same Legal Entity Type as defined in the Establishment Settings for related Establishment + + + Use either Establishment Reference to Update an Establishment, or Establishment Number to Create a new Establishment. + + + Use either Establishment Reference to Update an Establishment, or Establishment Number to Create a new Establishment. + + + DUNS is not a value which is tracked for this Country's Establishment Settings. Please review + + + EEO is not a value which is tracked for this Country's Establishment Settings. Please review + + + Industry Code is not a value which is tracked for this Country's Establishment Settings. Please review + + + SIRET is not a value which is tracked for this Country's Establishment Settings. Please review + + + VETS is not a value which is tracked for this Country's Establishment Settings. Please review + + + Establishment Headquarters is not a value which is tracked for this Country's Establishment Settings. Please review + + + That Establishment Number is already in use for the specified Country. Please choose another. + + + + + + + Establishment Number + + + + + Establish for Country + + + + + Effective Date of Establishment Creation/Edit + + + + + Establishment Name + + + + + Inactive flag + + + + + Location(s) for Establishment + + + + + Legal Entities for Establishment + + + + + Duns # + + + + + EEO # + + + + + Industry Code # + + + + + SIRET # + + + + + VETS # + + + + + Headquarters flag + + + + + + + Wrapper element for Establishment data for the Put Establishment web service + + + + + + Establishment Reference. + + + + + + Establishment Data wrapper + + + + + + + + Put Establishment Response + + + + + Establishment Reference + + + + + + + + Wrapper element for Skill Qualifications. Allows all Skill Qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing Skill Qualifications with those sent in the web service. + + + If Delete is Yes, do not send any certifications in the Certification Qualification Replacement Data element. All certification data will be deleted for the Job Profile or Position Restriction. + + + + + + + + + Enter yes to delete all Skill Qualifications for the Position Restriction or Job Profile. Do not send any additional Skill Qualifications. + + + + + + Wrapper element for Skill Qualifications. Allows all Skill Qualifications for a Job Profile or Position Restriction to be removed - or to replace all existing Skill Qualifications with those sent in the web service. + + + You must submit either a predefined Skill or a new Skill Name. + + + You need to look at the cousin, because the parent is a wrapper. + Select a Skill that isn't already in use. + + + This skill is either already in use or marked as a duplicate of [duplicate]. Select [duplicate] from the prompt. + + + + + + + The Skill reference identifying the Skill. + + + + + Text attribute identifying name of Skill. + + + + + Boolean attribute identifying whether Skill Qualification Profile is required for Job. + + + + + + + Data for the Agenda Item + + + You cannot delete an Agenda Item that has minutes recorded for it. + + + + + + + Agenda reference for meeting + + + + + Agenda ID + + + This error indicates that the RefID submitted is already in use. + Reference ID [RefID] assigned to an Agenda Item is not unique in the system. + + + This error indicates that the RefID submitted is already in use. + Reference ID [RefID] assigned to an Agenda Item is not unique in the system. + + + + + + + Agenda item number + + + Enter an Item Number that isn't already in use. + + + Enter an Item Number that isn't already in use. + + + + + + + Agenda item description + + + + + Agenda type + + + + + Name of the presenter of the agenda + + + + + Details about the agenda + + + + + Academic appointments related to this agenda + + + This error indicates that the user has not enabled Education Institution Features. + The Agenda Item's Related Academic Appointment field is only available for Higher Education Institutions. Check the HCM Tenant Setup setting for Enable Education Institution Features. + + + This error indicates that the appointment selected is currently not available to be linked to an agenda. + The Appointment event associated with the Agenda Item [AptEvntID] isn't in an acceptable status of In-Progress, Denied, or Complete. + + + + + + + Data for committee meeting minutes + + + + + Data for committee meeting action items + + + + + Data for committee meeting attachments + + + + + Data for votes on the agenda item + + + + + + Delete Flag for deleting Agenda Item for Committee Meeting + + + Committee Meeting Agenda Item must be included to be deleted + + + + + + + Add Only being true will add a new Agenda Item to Committee IFF Delete is false. Add Only being false requires reference to Agenda Item and updates the Agenda Item + + + Cannot add a new Committee Meeting Agenda Item and update a Committee Meeting Agenda Item at the same time. + + + + + + + + The request element containing all necessary information to manually assign an establishment to a worker position + + + + + + + + + + Assign establishment response element containing the newly created assign establishment event reference + + + + + The assign establishment event created to process the request + + + + + + + + The request element containing all necessary information to manually assign an establishment to a worker position + + + Specified position is not valid for establishment assignment. Please check Country Establishment Settings. + + + Worker does not have a valid position for establishment assignment as of date provided. + + + Establishments can not be assigned to Contingent Workers + + + Selected Establishment is not available for the selected Date. + + + Establishments can not be assigned to Terminated Workers + + + The selected Establishment is Inactive as of the date provided + + + You can not Assign an Establishment for this Worker until you have completed the pending Assign Establishment event. + + + + + + + The date upon which this establishment assignment becomes active for the specified worker position + + + + + The worker who is to be assigned the specified establishment on the specified date + + + + + The position of the worker for which the establishment is taking effect + + + + + The establishment we wish to assign to the specified worker position + + + + + + + Data for Committee Meeting Agenda Item + + + + + Reference to agenda item votes + + + + + Indicates whether the agenda items passed + + + + + Vote record data + + + + + + Specifies whether the web service request is only adding new agenda items or if the request will be editing existing agenda items. + + + + + + Data for Committee Meeting Vote Record + + + The same Vote Status appears more than once. Each Vote Status can only appear once in the Vote Results. + + + Enter only 1 affirmative Vote Status + + + + + + + Committee Meeting Vote Reference + + + + + Committee Meeting Vote Status Reference + + + The same Vote Status appears more than once. Each Vote Status can only appear once in the Vote Results. + + + Enter only 1 affirmative Vote Status + + + The Votes Status field is required and must have a value. + + + A Vote Status value supplied for Agenda Item does not exist or inactive. + + + + + + + Vote Count + + + + + + + + + + + + + Specifies whether this web service request is only adding vote data or both adding and editing vote data. + + + When performing an Update (i.e. the Add Only flag is blank), a Vote Results Reference ID or WID is required. + + + + + + + Specifies that the request if for deleting vote data + + + When removing a vote result, a Vote Results Reference ID or WID is required. + + + + + + + + Container for the Committee Attachment + + + + + Attachment Reference to be used for updating the attachment + + + + + Reference ID can be set here + + + Reference ID [RefID] assigned to a Committee Attachment is not unique in the system. + + + + + + + The filename associated to the attachment + + + + + + + + + + The filedata associated to the attachment in Base64 encoding + + + + + The comment associated to the attachment + + + + + + + Holds Committee Meeting Attachments + + + + + + + + Data for Committee Meeting Attachments + + + + + Committee meeting attachment reference + + + + + Committee meeting attachment ID + + + Reference ID [RefID] assigned to an Meeting Attachment is not unique in the system. + + + + + + + Attachment filename + + + + + + + + + + Attachment comment + + + + + File + + + + + + + Holds Agenda Item Attachment Data + + + + + Data for agenda item attachments + + + + + + + Data for Committee Meeting Agenda Item Attachment + + + + + Reference to agenda item attachment + + + + + Agenda item attachment ID + + + Reference ID [RefID] assigned to an Agenda Item Attachment is not unique in the system + + + + + + + Attachment Filename + + + + + + + + + + Attachment comment + + + + + File + + + + + + + Wrapper element containing meal times for the Work Schedule Calendar Event. + + + Meal time cannot overlap with other meal time. + + + Meal times must be within the calendar event range, and the meal start time must occur before the meal end time. + + + + + + + Meal In Time for the Work Schedule Calendar Event. + + + + + Meal Out Time for the Work Schedule Calendar Event. + + + + + + + contains relative names for a relative of a person + + + Relative Name Reference is required when deleting a Relative Name entry + + + Person Name Detail Data and Relative Type Reference are required unless the Relative Name is being deleted. + + + + + + + holds a reference to main relative name reference, single instance referencing all versions of a relatie name + + + The Relative Name Reference provided is not owned by the worker : [worker] + + + + + + + type to specify the relative person relationship + + + Relative Name localization is not active and valid for the country of the given relative type : [relativeType] + + + The Relative Type provided is not from the same country as the worker : [worker] . Relative Type is [relativeType] . + + + Relative Type specified in this request is inactive. Only active statuses are allowed. + Relative Type specified in this request is inactive. Only active statuses are allowed. + + + + + + + + + Flag to delete an existing relative name entry. If this flag is set, Relative Name Reference is also required. + + + + + + Wrapper element for all relative names of a person + + + + + + + When this flag is set to false, existing relative name data for the person will be preserved. When true, it causes the web service to replace all relative name data for the person with the information in the request (this is the default behavior when the entire tag is omitted). + + + + + + Contains the Position-level data for a Worker. The primary position is always the first element. + + + + + Contains the worker's employment information, such as their position and job information. + + Security Note: This element is secured to the following domains: Self-Service: Current Staffing Information, Worker Data: Current Staffing Information + + + + + Contains the worker's organizations that they are a member of related to the position. + + + + + Contains the worker's management chains related to the position. + + + + + + Indicates whether the position is the primary position for a worker. + + + + + + Contains the worker's organizations that they are a member of related to the position. + + + + + + + + + Wrapper element for the Instructional Location data. + + + + + Academic Unit + + + + + Capacity + + + + + + + + + + + + Off-site + + + + + Instructional Use Only + + + + + + + A Generic Workday Account request for workers and non-workers. + + + + + + + + + + + + Request Criteria + + + + + Request References + + + + + Workday Account Reference + + + + + + + Element containing Workday Account Data + + + + + + + + + + + + + + Element containing Workday Account response data. + + + + + Element containing Workday Account Data + + + + + + + Element containing Workday Account information. + + + + + A unique identifier for the Workday Account. + + + + + + + + Input for the Reactivate Organization Web Service. + + + + + Specify Reference ID or WID for the Organization you want to reactivate. + + + Instance being reactivated must already be inactive or have a future-dated inactivation with no corresponding reactivation + + + Cannot reactivate a supervisory org with a primary location that is currently inactive or will be inactive in future + + + + + + + + + + Response for the Reactivate Organization Web Service + + + + + Response with the Reactivated Organization reference + + + + + + + + All the data needed to create a Committee Membership Service Event + + + + + Contains the legal, preferred, and additional names for a person. + + + + + All of the person's contact data (address, phone, email, instant messenger, web address). + + + Please enter at least one phone number or email address. + + + + + + + + + + + The request element containing all necessary information to assign a Veteran Status Identification for a Worker. + + + The Worker must have an active position. + + + You may not submit your own Veteran Status Identification. + + + The Worker must be an Employee. + + + Veteran Status Identification is only available for Workers with a position in the United States of America. + + + Protected Veteran Type must be turned on in Maintain Veteran Status Identification Form to use Protected Veteran Type(s). + + + Protected Veteran Types must be enabled and Recently Separated Veteran Status must be selected to use Discharge Date. + + + Protected Veteran Types are only available for those who identify as a Protected Veteran. + + + Veteran Discharge Date is required if the Recently Separated Veteran Status is selected. + + + + + + + The Worker for this business process. + + + + + The US Veteran Status to be assigned to the Worker. + + + + + The US Protected Veteran Status Types for this Worker's Veteran Status. + + + + + The discharge date for workers that have been recently separated. + + + + + + + The request element containing all necessary information to assign a Veteran Status Identification for a Worker. + + + + + + + + + + The response element containing all necessary information to assign a Veteran Status Identification for a Worker. + + + + + The Self-Identification of Veteran Status Business Process created from the request. + + + + + + + + Wrapper element containing date and times for the Calendar Event. + + + The End Date must occur on or after the Start Date. + + + The End Date/Time must be on or after the Start Date/Time. + + + Start Date, Start Time, End Date and End Time are required if the event is not an all day event. + + + + + + + Boolean value for all day event for Calendar Event. If true, this event will occur all day. If false, this event will occur in the start to end date range. + + + + + Date value for the start time for Calendar Event. + + + + + Time value for the start time for Calendar Event. + + + + + Date value for the End Time for Calendar Event. + + + + + Time value for the end time for Calendar Event. + + + + + + + Manage Professional Affiliation Sub Business Process Data + + + The "Manage Professional Affiliation Data" subelement is required if "Automatically Complete" is set to true. + The "Manage Professional Affiliation Data" subelement is required if "Automatically Complete" is set to true. + + + + + + + Manage Professional Affiliation Sub Business Process Data + + + + + Manage Professional Affiliation Sub Business Process Data + + + + + + + Manage Education Sub Business Process Data + + + The "Manage Education Data" subelement is required if "Automatically Complete" is set to true. + The "Manage Education Data" subelement is required if "Automatically Complete" is set to true. + + + + + + + Manage Education Sub Business Process Data + + + + + Manage Education Sub Business Process Data + + + + + + + Sub element of the request having positions to add/remove. + + + + + Reorganization determines the effective date that positions are added as a member + + + + + The position or position restriction you want to add to the custom organization. For position restrictions, Workday uses the reorganization effective date to determine the position. When a position restriction has job overlap as of the reorganization effective date, Workday assigns membership to the principal and overlap positions. If the position is unavailable or unfilled as of the date you view the custom organization it's assigned to, Workday doesn't display it. + + + + + Positions to be removed from the custom organization. + + + 'Positions to Remove’ contains one or more positions that are are not assigned to the Organization as of the specified effective date. + + + + + + + + + Request element having the organization, positions to be added/removed and the effective date. + + + + + Custom organization with options ‘Allow Organization Tasks’ = Yes and ‘Position Assignment Unique’ = No + + + The entered Organization must be a custom organization whose organization type is configured with options: ‘Allow Organization Tasks’ = Yes and ‘Position Assignment Unique’ = No. + + + + + + + + + + + Response element, returning only the organization. + + + + + Returning custom organization. + + + + + + + + Container Element containing all Attributes and Relationship for a Work Status Rule Set + + + + + Reference ID for Work Status Rule Set + + + Enter a Work Status Rule Set Reference ID that isn't already in use. + + + + + + + Name of Work Status Rule Set + + + Work Status Rule Set Name must be unique. + + + + + + + Description of Work Status Rule Set + + + + + The Academic Unit that the Work Status Rule Set is restricted to + + + + + Determines whether the Work Status Rule Set is defaulted to be used in other reports + + + You can't select the Default Rule Set check box because the [rule set name] rule set is already defined as the default. To make this rule set the default, clear the check box on the other one. + + + You can't select the Default Rule Set check box because the [rule set name] rule set is already defined as the default. To make this rule set the default, clear the check box on the other one. + + + An Inactive Work Status Rule Set can not be a Default rule set. + + + + + + + This flag will inactivate the Work Status Rule Set. + + + + + Leave Types that are used in the Evaluation of certain Work Status Rules + + + + + Number of Active Periods Required for Eligibility of Leave + + + Number of Active Periods must be 0 if not provided a Leave Type. + + + + + + + + + + + + + + Minimum Years Since Last Applicable Leave + + + You did not enter a Leave Type so Minimum Years Since Last Applicable Leave must be blank. + + + + + + + + + + + + + + Element Container for all the Attributes and Relationships for each Work Status Rule Row + + + + + + + Request element to add or update Work Status Rule Set + + + Add Only is set to true. You can not submit a reference to update. Please remove the Add Only flag for updating. + + + + + + + Work Status Rule Set Reference to be provided if request is an Edit action + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. If an existing instance is found and this flag is set there will be an error. + + + + + + + Work Status Rule Set Response from Put Request + + + + + Created/Edited Work Status Rule Set + + + + + + + + Container Element for all Attributes and Relationships associated to the Work Status Rule Row + + + Add Only is set to true. You can not submit a reference to update. Please remove the Add Only flag for updating. + + + Enter the Work Status Rule Row Reference for the work status rule row you want to delete. + + + + + + + Reference to Work Status Rule Row, provided whenever row needs to be modified + + + Work Status Rule Row is not for provided Work Status Rule Set. + + + + + + + Specifies the order of evaluation of the Work Status Rules + + + + + + + + + + Name of the Work Status Rule Row + + + + + Specific Work Status associated to the row + + + Enter a valid Work Status ID for this tenant. + + + + + + + Evaluation designated for the row + + + Enter a valid Work Status Rule ID for this tenant. + + + + + + + + Flag indicating that the referenced data should be deleted. + + + + + Add Only Flag. Indicates that the service is an add only, not an update. If an existing instance is found and this flag is set there will be an error. + + + + + + References Provided to be returned by Get Work Status Rule Set + + + + + References provided to obtain attributes and relationship information + + + + + + + Criteria for filtering which Work Status Rule Sets are returned + + + + + Response Group for Work Status Rule Set + + + + + Boolean that checks on whether or not to include the reference ID + + + + + + + Request Element for Get Work Status Rule Sets + + + + + + + + + + + + + + Contains the Data and Reference to the Work Status Rule Sets + + + + + Reference to Work Status Rule Set where data is retrieved from + + + + + + + + Contains the Response of the Web Service Get Request + + + + + + + + Response Element from Work Status Rule Set + + + + + + + + + + + + + + Form to put, update, and view a Period Reporting Calendar + + + + + Reference ID of the Period Reporting Calendar + + + Enter a Period Reporting Calendar Reference ID that isn't already in use. + + + + + + + Period Reporting Calendar Name + + + Another Period Reporting Calendar with this name already exists + + + + + + + The Academic Units the Period Reporting Calendar is restricted to + + + + + If true, the Period Reporting calendar is the default for the system or the academic unit + + + You can't select the Default Calendar check box because the [calendar name] period reporting calendar is already defined as the default. To make this calendar the default, clear the check box on the other one. + + + You can't select the Default Calendar check box because the [calendar name] period reporting calendar is already defined as the default. To make this calendar the default, clear the check box on the other one. + + + An inactive Calendar cannot be designated as the Default. + + + + + + + if true, the Period Reporting Calendar is inactive + + + + + Data per Period of the Period Reporting Calendar + + + + + + + Request Element for Adding or Updating a Period Reporting Calendar + + + Add Only is set to true. You can not submit a reference to update. Please remove the Add Only flag for updating. + + + + + + + Existing Period Reporting Calendar to Update + + + + + + + If true, you're only allowed to add Period Reporting Calendars. No updates! + + + + + + + Response of Put Period Reporting Calendar + + + + + Updated/Created Period Reporting Calendar instance + + + + + + + + Request References Element for Get Period Reporting Calendars Web Service + + + + + Period Reporting Calendars being requested + + + + + + + Request Criteria of the Period Reporting Calendar + + + + + Response Group of the Period Reporting Calendar Web Service + + + + + Include Reference flag for the Get Period Reporting Calendars Web Service + + + + + + + Request element for Get Period Reporting Calendars + + + + + + + The Criteria of the request + + + + + + + the specified response group of the request + + + + + + + + Wrapper Element for Responding with Reporting Calendar Data + + + + + Reference for Period Reporting Calendar + + + + + Period Reporting Calendar Data element (Contains all the information about a period reporting calendar) + + + + + + + Response element for Get Period Reporting Calendars Web Service + + + + + + + + Response Element for Get Period Reporting Calendar + + + + + Request References element for Get Period Reporting Calendars Web Service + + + + + Request Criteria for Get Period Reporting Calendars Web Service + + + + + + Response Group for Get Period Reporting Calendars Web Service + + + + + + + + + + Period Reporting Row Data + + + Add Only is set to true. You can not submit a reference to update. Please remove the Add Only flag for updating. + + + Enter the Period Reporting Calendar Row Reference for the reporting period row you want to delete. + + + + + + + The Period of the Period Reporting Calendar + + + The reporting period row's reference ID does not exist for the specified reporting calendar. Enter the correct Period Reporting Calendar Row Reference ID for the reporting calendar you want to update. + + + + + + + The order this period has + + + + + + + + + + The Name of the Period. + + + Name for the Calendar Row must be unique within the Calendar + + + + + + + The academic period associated with this period row. (Is Optional!) + + + For row # [order], the Academic Period's assigned Academic Unit must match the Calendar's Restricted to Academic Unit + + + + + + + The Start Date of the evaluation period + + + + + The End Date of the evaluation period + + + End Date must be after or on Start Date + + + + + + + The specification of how the status of a period is calculated based on the date range + + + + + + States that this row is to be deleted + + + + + Determines if this row is a new row to add + + + + + + Person's Photo Information + + + + + Name of file uploaded + + + + + + + + + + Data of file uploaded + + + + + + + Data element for everything about Minutes + + + The Minutes Reference ID doesn’t belong to the specified agenda item. Enter the correct Minutes Reference ID for the agenda item you want to update. + + + The Minutes Reference ID doesn’t belong to the specified committee meeting. Enter the correct Minutes Reference ID for the committee meeting you want to update. + + + Enter the Minutes Reference ID to update committee meeting minutes. + + + + + + + Minutes Reference for Committee Meeting or Agenda Item based on context + + + + + Minutes Details + + + + + Reference ID for Committee Meeting Minutes + + + + + + + Action Item element for everything about Action Items for Committee Meetings + + + You cannot enter an Action Item Reference ID when Action Item Add Only = Y. Either remove the Action Item Reference ID or change the Action Item Add Only = N + + + You must enter an Action Item Reference ID to delete an Action Item. + + + Verify the reference ID doesn't belong to the Action Item passed and the reference ID isn't used by another Action ID + + + The action item's reference ID doesn’t belong to the specified agenda item. Enter the correct Action Item Reference ID for the agenda item you want to update. + + + The action item's reference ID doesn’t belong to the specified committee meeting. Enter the correct Action Item Reference ID for the committee meeting you want to update. + + + + + + + Action Item instance + + + + + Reference ID for Action Item + + + + + Action Item title + + + + + Assignee for the action item + + + + + Action Item Description + + + + + Action Item is completed if true + + + + + + Specifies that the request is for deleting a committee meeting + + + + + Specifies that the request is for adding committees meetings only + + + + + + Notification Type configurations for a particular user + + + + + Notification Sub Type configuration(includes selected notification channels) for each Notification Sub Type. + + + + + + + Notification sub type configuration for each notification sub type + + + + + Notification sub type for which notification channels will be updated/added. + + + Notification Type [Notification Sub Category] must be enabled for user preferences in order to update Notification Channels + + + + + + + Notification channels to add/update for specified notification sub type. These Notification Channels must be allowed for the Notification Sub Type. + + + This notification type [Notification Categorizable] contains default Notification Channels that are no longer valid. + + + If Disabled is selected no other notification channels may be selected. + + + + + + + + + The Web Service Element holding Location Attribute Data + + + + + Reference ID for the Location Attribute + + + + + The Location Attribute Name + + + Enter a Location Attribute Name not already in use. + + + + + + + References the Location Usages of the Location Attribute + + + + + Location Attribute is Inactive + + + + + + + Web Service Element for Put Location Attribute Requests + + + Add Only is true but Location Attribute already exists. + + + + + + + The Location Attribute reference + + + + + + + Add Only Flag. Indicates that the service is an add only, not an update. + + + + + + + Web Service Element for Put Location Attribute Response + + + + + The Location Attribute reference + + + + + + + + Location Attribute Request References Web Service Element + + + + + The Location Attribute(s) to be returned + + + + + + + Get Location Attributes Request Web Service Element + + + + + + + + + + Location Attribute Web Service Element + + + + + The Location Attribute reference + + + + + + + + Location Attribute Response Data Web Service Element + + + + + + + + Get Location Attributes Response Web Service Element + + + + + + + + + + + + Contains the primary and secondary Questionnaires for internal and external career site for Job Profile. + + + Staffing Actions: Job Requisition Job Questionnaires Domain has an Inactive Policy. Cannot save/retrieve Job Profile Questionnaires + Staffing Actions: Job Requisition Job Questionnaires Domain has an Inactive Policy. Cannot save/retrieve Job Profile Questionnaires + + + Select a primary questionnaire before selecting a secondary one. + Select a primary questionnaire before selecting a secondary one. + + + + + + + Primary Questionnaire to be used by candidates for the Internal Career Site. + + + You can select only recruiting questionnaires. + You can select only recruiting questionnaires. + + + Only active questionnaires can be used for Job Profile. + Questionnaire [questionnaire] is inactive and will not be used for Job Requisitions using this Job Profile. + + + + + + + Secondary Questionnaire to be used by candidates for the Internal Career Site. + + + You can select only recruiting questionnaires. + You can select only recruiting questionnaires. + + + Only active questionnaires can be used for Job Profile. + Questionnaire [questionnaire] is inactive and will not be used for Job Requisitions using this Job Profile. + + + This questionnaire is already in use, select another one. + This questionnaire is already in use, select another one. + + + + + + + Primary Questionnaire to be used by candidates for External Career Sites. + + + You can select only recruiting questionnaires. + You can select only recruiting questionnaires. + + + Only active questionnaires can be used for Job Profile. + Questionnaire [questionnaire] is inactive and will not be used for Job Requisitions using this Job Profile. + + + + + + + Secondary Questionnaire to be used by candidates for External Career Sites. + + + You can select only recruiting questionnaires. + You can select only recruiting questionnaires. + + + Only active questionnaires can be used for Job Profile. + Questionnaire [questionnaire] is inactive and will not be used for Job Requisitions using this Job Profile. + + + This questionnaire is already in use, select another one. + This questionnaire is already in use, select another one. + + + + + + + + + Worker Reference and Name of the Worker + + + + + A reference to the ID of the worker. The ID consists of a type attribute, which should be set to "Employee_ID" or "Contingent_Worker_ID", and a value attribute, such as "04345". + + + + + Worker name including person name and status and other information about the worker. + + + + + + + Instance data for Schedule Pattern. This schedule pattern may be linked to schedule changes that a manager made. If you update this schedule pattern, you will also be deleting the manager's changes. + + + A schedule pattern cannot have Meal Start or Meal End times if it is a 24-Hour Shift. Either clear the 24-Hour Shift field or remove the Meal Start and Meal End times. The schedule pattern belongs to this work schedule calendar: [wsc] + + + One or more Meal Start and Meal End times is in error for a schedule pattern. Edit the schedule pattern so that Meal Start times occur after schedule pattern Start Times, Meal End times occur before schedule pattern End Times, and Meal Start times occur before Meal End times. The schedule pattern belongs to this work schedule calendar: [wsc] + + + Either enter a Start Time and End Time or select 24-Hour Shift for the schedule pattern. The schedule pattern belongs to this work schedule calendar: [wsc] + + + A schedule pattern cannot have Start or End Times if it is a 24-Hour Shift. Either clear the 24-Hour Shift field or remove the Start and End Times. The schedule pattern belongs to this work schedule calendar: [wsc] + + + + + + + Numeric value for Pattern Week Number for Pattern Schedule Event. + + + Edit the schedule pattern so that the Week Number is 1 or 2. The pattern in error belongs to this work schedule calendar: [wsc] + + + Edit the schedule pattern so that the Week Number is 1. The pattern in error belongs to this work schedule calendar: [wsc] + + + + + + + + + + + + + + Day(s) of the Week for Pattern Schedule Event. + + + + + Minute-precision Start Time for Pattern Schedule Event. Note: This is also referred to as the In time for the schedule pattern. + + + + + Minute-precision End Time for Pattern Schedule Event. Note: This is also referred to as the Out time for the schedule pattern. + + + + + Boolean value specifying whether the Pattern Schedule Event is a 24-Hour Shift. + + + A schedule pattern cannot have Start or End Times if it is a 24-Hour Shift. Either clear the 24-Hour Shift field or remove the Start and End Times. The schedule pattern belongs to this work schedule calendar: [wsc] + + + + + + + Minute-precision Meal Start Time for Pattern Schedule Event. + + + Enter a Meal Start or clear the Meal End field. The work schedule calendar in error is: [wsc] + + + + + + + Minute-precision Meal End Time for Pattern Schedule Event. + + + Enter a Meal End or clear the Meal Start field. The work schedule calendar in error is: [wsc] + + + + + + + + Text value for reference ID for Pattern Schedule Event. + + + + + + Instance data for Worker Editing Options for Work Schedule Calendar. + + + Enter either 0 or 1 for the Enable Worker Editing Options field or remove any pattern schedule events along with all worker editing options. The work schedule calendar in error is: [wsc] + + + Enter either 0 or 1 for the Change Scheduled and Non Scheduled Days field or clear the Enable Worker Editing Options field. The work schedule calendar in error is: [wsc] + + + Enter either 0 or 1 for the Change Number of Scheduled Days field or clear the Change Scheduled and Non Scheduled Days field. The work schedule calendar in error is: [wsc] + + + Enter either 0 or 1 for the Enable Hours Restrictions field or clear the Enable Worker Editing Options field. The work schedule calendar in error is: [wsc] + + + Enter either 0 or 1 for the Change Daily Start and End Times field or clear the Enable Worker Editing Options field. The work schedule calendar in error is: [wsc] + + + Enter either 0 or 1 for the Allow Meals field or clear the Enable Worker Editing Options field. The work schedule calendar in error is: [wsc] + + + Enter either 0 or 1 for the Change Meal Start and End Times field or clear the Allow Meals field. The work schedule calendar in error is: [wsc] + + + Enter either 0 or 1 for the Uniform Start and End Times field or clear the Change Daily Start and End Times field. The work schedule calendar in error is: [wsc] + + + Submit a Maximum Meal Duration or clear the Minimum Meal Duration and Allow Meals field. The work schedule calendar in error is: [wsc] + + + Submit a Minimum Meal Duration or clear the Maximum Meal Duration and Allow Meals field. The work schedule calendar in error is: [wsc] + + + Submit a Flexible End Time or clear the Flexible Start Time and Change Daily Start and End Times fields. The work schedule calendar in error is: [wsc] + + + Submit a Flexible Start Time or clear the Flexible End Time and Change Daily Start and End Times fields. The work schedule calendar in error is: [wsc] + + + If selecting the Enable Worker Editing Options field, also select at least one of these options: Change Daily Start and End Times, Change Meal Start and End Times, or Change Scheduled and Non Scheduled Days. Otherwise, clear the Enable Worker Editing Options field. The work schedule calendar in error is: [wsc] + + + + + + + Boolean value for enabling Worker Editing Options. + + + + + Boolean value for allowing Worker to Change Scheduled and Non-Scheduled Days for schedule pattern. + + + Either select the Enable Worker Editing Options field or clear the Change Scheduled/Non-Scheduled Days field. The work schedule calendar in error is: [wsc] + + + + + + + Boolean value for allowing Worker to Change Number of Scheduled Days for schedule pattern. + + + Either select the Enable Worker Editing Options field or clear the Change Number of Scheduled Days field. The work schedule calendar in error is: [wsc] + + + Either select the Change Scheduled and Non Scheduled Days option if selecting the Change Number of Scheduled Days field, or clear the Change Number of Scheduled Days field. The work schedule calendar in error is: [wsc] + + + Either select the Change Daily Start and End Times option if selecting the Change Number of Scheduled Days field, or clear the Change Number of Scheduled Days field. The work schedule calendar in error is: [wsc] + + + + + + + Boolean value to enable Minimum/Maximum Number of Hours per Day and Minimum/Maximum Number of Hours per Week for schedule pattern. + + + Either select the Enable Worker Editing Options field or clear the Enable Hours Restrictions field. The work schedule calendar in error is: [wsc] + + + + + + + Numeric value for Minimum Number of Hours per Day for schedule pattern. + + + Enter a Minimum Number of Hours per Day that is between 1 and 24 hours. The work schedule calendar in error is: [wsc] + + + Either select the Enable Hours Restrictions field or clear the Minimum Number of Hours per Day field. The work schedule calendar in error is: [wsc] + + + + + + + + + + + + + + Numeric value for Maximum Number of Hours per Day for schedule pattern. + + + Enter a Maximum Number of Hours per Day that is between 1 and 24 hours. The work schedule calendar in error is: [wsc] + + + Either select the Enable Hours Restrictions field or clear the Maximum Number of Hours per Day field. The work schedule calendar in error is: [wsc] + + + Edit the work schedule calendar so that the Maximum Number of Hours per Day is greater than or equal to the Minimum Number of Hours per Day. The work schedule calendar in error is: [wsc] + + + + + + + + + + + + + + Numeric value for Minimum Number of Hours per Week for schedule pattern. + + + Either select the Enable Hours Restrictions field or clear the Minimum Number of Hours per Week field. The work schedule calendar in error is: [wsc] + + + Enter a Minimum Number of Hours per Week that is between 1 and 168 hours. The work schedule calendar in error is: [wsc] + + + + + + + + + + + + + + Numeric value for Maximum Number of Hours per Week for schedule pattern. + + + Either select the Enable Hours Restrictions field or clear the Maximum Number of Hours per Week field. The work schedule calendar in error is: [wsc] + + + Enter a Maximum Number of Hours per Week that is between 1 and 168 hours. The work schedule calendar in error is: [wsc] + + + Edit the work schedule calendar so that the Maximum Number of Hours per Week is greater than or equal to the Minimum Number of Hours per Week. The work schedule calendar in error is: [wsc] + + + + + + + + + + + + + + Boolean value for allowing Worker to Change Daily Start and End Times for schedule pattern. + + + Either select the Enable Worker Editing Options field or clear the Change Daily Start and End Times field. The work schedule calendar in error is: [wsc] + + + + + + + Boolean value for enforcing Uniform Start and End Times for schedule pattern. + + + Either select the Change Daily Start and End Times field or clear the Uniform Start and End Times field. The work schedule calendar in error is: [wsc] + + + + + + + Minute-precision Time value for Flexible Start Time for schedule pattern. + + + Either select the Change Daily Start and End Times field or clear the Flexible Start Time field. The work schedule calendar in error is: [wsc] + + + Submit a Flexible Start Time or clear the Flexible End Time and Change Daily Start and End Times fields. The work schedule calendar in error is: [wsc] + + + Enter a Flexible Start Time or clear the Flexible End Time field. The work schedule calendar in error is: [wsc] + + + + + + + Minute-precision Time value for Flexible End Time for schedule pattern. + + + Either select the Change Daily Start and End Times field or clear the Flexible End Time field. The work schedule calendar in error is: [wsc] + + + Submit a Flexible End Time or clear the Flexible Start Time and Change Daily Start and End Times fields. The work schedule calendar in error is: [wsc] + + + Enter a Flexible End Time or clear the Flexible Start Time field. The work schedule calendar in error is: [wsc] + + + + + + + Boolean value for allowing Worker to have Meals for schedule pattern. + + + Either select the Enable Worker Editing Options field or clear the Allow Meals field. The work schedule calendar in error is: [wsc] + + + + + + + Boolean value for allowing Worker to Change Meal Start and End Times for schedule pattern. + + + Either select the Allow Meals field or clear the Change Meal Start and End Times field. The work schedule calendar in error is: [wsc] + + + + + + + Numeric value for Minimum Meal Duration in minutes for schedule pattern. + + + Either select the Allow Meals field or clear the Minimum Meal Duration field. The work schedule calendar in error is: [wsc] + + + Submit a Minimum Meal Duration or clear the Maximum Meal Duration and Allow Meals field. The work schedule calendar in error is: [wsc] + + + Enter a Minimum Meal Duration or clear the Maximum Meal Duration field. The work schedule calendar in error is: [wsc] + + + + + + + + + + + + + + Numeric value for Maximum Meal Duration in minutes for schedule pattern. + + + Either select the Allow Meals field or clear the Maximum Meal Duration field. The work schedule calendar in error is: [wsc] + + + Edit the work schedule calendar so that the Maximum Meal Duration is greater than or equal to the Minimum Meal Duration. The work schedule calendar in error is: [wsc] + + + Submit a Maximum Meal Duration or clear the Minimum Meal Duration and Allow Meals field. The work schedule calendar in error is: [wsc] + + + Enter a Maximum Meal Duration or clear the Minimum Meal Duration field. The work schedule calendar in error is: [wsc] + + + + + + + + + + + + + + + + Encapsulating element containing all External Disability Self-Identification Record data. + + + Enter both a Record Reference and an Employee Reference to delete the record. + + + Enter a valid Employee Reference for this record. + + + You must enter either an Invitation Date, a Response Date with a Disability Status, or both. + + + + + + + The ID for the External Disability Self-Identification Record. + + + + + The employee for which the External Disability Self-Identification Record refers. + + + + + The disability status of the External Disability Self-Identification Record. + + + + + The invitation date for the External Disability Self-Identification Record. + + + You can't enter a date that is in the future. + + + + + + + The response date for External Disability Self-Identification Record. + + + You can't enter a date that is in the future. + + + + + + + + + Request element for Put External Disability Self-Identification Record + + + + + A unique identifier used to reference an External Disability Self-Identification Record. + + + + + Encapsulating element containing all External Disability Self-Identification Record data. + + + + + + Flag to delete an existing External Disability Self-Identification Record. + + + + + + + Response element for the Put External Disability Self-Identification Record operation. + + + + + A unique identifier used to reference an External Disability Self-Identification Record. + + + + + + + + Utilize the Request References element to retrieve a specific instance(s) of a Record and its data + + + + + A unique identifier used to reference an External Disability Self-Identification Record + + + + + + + Request element for Get External Disability Self-Identification Record + + + + + + + + + + + + + Reference element representing a unique instance of External Disability Self-Identification Record + + + + + A unique identifier used to reference an External Disability Self-Identification Record + + + + + + + + Encapsulating element containing all External Disability Self-Identification Record data. + + + + + + + + Contains the response elements for the Get External Disability Self-Identification Record + + + + + + + + + + + + + Element containing the request criteria for an External Disability Self-Identification Record + + + + + Eligibility Criteria Data + + + Eligibility Criteria Data Field Reference must be a valid Integration Document Field from a provider specified in the Field_And_Parameter_Criteria_Data element. + Eligibility Criteria Data Field Reference must be a valid Integration Document Field from a provider specified in the Field_And_Parameter_Criteria_Data element. + + + + + + + Integration Document Field Reference + + + + + Indicates the date when application data, such as benefits and compensation, are deemed effective in the Workday system. (Also referred to as the "Effective Moment".) If not specified, this date defaults to TODAY. + + + + + Indicates the date and time that data was entered into the system. (This field is also referred to as the "Entry Moment".) If not specified, defaults to the CURRENT DATE/TIME. + + + + + + + Manage Instructor Eligibility Sub Business Process Data + + + + + Container for the processing options for sub-business processes within a business process. If no options are submitted (or the options are submitted as 'false') then the sub-business process is simply initiated as if it where submitted on-line with approvals, reviews, notifications and to-do's in place. If the Initiator is an Integration System User, any validations you configured on the Initiation step are ignored. + + + + + + + + Contains Instructor Eligibility Line Data + + + + + References the eligible Academic Unit + + + + + References the eligible Academic Levels + + + + + References the eligible Course Subjects + + + + + References the eligible Courses + + + + + References the eligible Delivery Modes + + + Select a Student Specific Delivery Mode. + + + + + + + References the eligible Course Tags + + + + + References the eligible Locations + + + All Locations must be Campus Locations. + + + + + + + References the eligible Taxonomy Codes + + + Select an active Educational Taxonomy Code that is part of an active taxonomy scheme. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The Human Resources Web Service contains operations that expose Workday Human Capital Management Business Services data, including Employee, Contingent Worker and Organization information. This Web Service can be used for integration with enterprise systems including corporate directories, data analysis tools, email or other provisioning sub-systems, or any other systems needing Worker and/or Organization data. + + This operation adds or updates a Location. Location Addresses, Usages, Email Addresses, Phone Numbers, Time Profile data, Location Attributes, Location Superior and Location Hierarchies to include location in can also be added and updated with this operation. Effective date must be blank for new locations to be consistent with new locations created in the UI. When effective date is blank, the value is effective as of the beginning of time. The Effective Date applies to these fields only: Location Name, Inactive, and Location Hierarchy Reference. If Location Hierarchy Reference is left blank for an existing location, location will be removed from all location hierarchies it is included in as of the effective date specified. If these fields are left blank, existing values will be removed: Altitude, Latitude, Longitude, Trade Name, Worksite Identification Code, Locale, User Language, Location Attribute, Location Type, Time Profile, Time Zone, Superior Location. + + + + + + + DEPRECATED: This web service operation is deprecated. Please use the Get Locations web service operation instead. + + This operation responds with a set of references to Business Sites that match the criteria specified in the request element.1 + + + + + + + + This operation retrieves data related to an Organization (e.g. Staffing Configuration, Structure, etc.). + + + + + + + This operation adds a new Organization (or updates an existing Organization) with the supplied information. A new effective-dated organization name is automatically created if any attributes used for organization name are different as of specified effective date. + + + + + + + This operation retrieves data related to an Employee and his/her Personal (e.g. Biographic, Demographic, etc.) information. + + + + + + + This operation retrieves data related to a Contingent Worker and his/her Contract information. + + + + + + + This operation retrieves a subset of data related to a Worker (e.g. Employee and Contingent Worker) and his/her Employment/Contract, Personal and Compensation information. + + + + + + + Loads history for a Worker whose history did not get loaded during the initial implementation period. This operation allows free-form text entry of changes that occurred between the Worker's original hire date and the date that the implementation occurred. Existing entries can be deleted or updated. + + + + + + + This operation will dissolve an Organization structure (e.g. disconnect the subordinate and contained organizations). + + + + + + + This operation responds with a set of references to Organizations that match the criteria specified in the request element. + + + + + + + This operation updates Personal (e.g. Biographic, Demographic, etc.) information related to an Employee.1 + + + + + + + + DEPRECATED: This web service operation is deprecated. Please use the Get Locations web service operation instead. + + This operation retrieves data related to an Business Site.1 + + + + + + + + This operation retrieves data related to an Employee and his/her Employment (e.g. Position, Job, Status, etc.) information. + + + + + + + This operation retrieves data related to a Contingent Worker and his/her Personal (e.g. Biographic, Demographic, etc.) information. + + + + + + + This operation updates Personal (e.g. Biographic, Demographic, etc.) information related to a Contingent Worker.1 + + + + + + + + This operation will inactivate an Organization. If you do not choose to 'Keep in Hierarchy' then the organization being inactivated will be moved out of the hierarchy. Default behavior for inactive subordinates / included organizations is that they remain as is. Default behavior for active subordinates is that they are moved to the superior unless you specify another organization to move them to. If the organization has subordinates or included content that you do not want to move to its superior or another organization, you can use the DISSOLVE_ORGANIZATION_STRUCTURE web service to disconnect it from the hierarchy and remove its subordinates and included organizations. In this web service, the Integration_ID_Reference must be the external system id. + + + + + + + This operation retrieves data related to an Employee's Related Persons (e.g. Dependents, Beneficiaries, etc.) and each of his/her Personal (e.g. Biographic, Demographic, etc.) information. + + + + + + + This operation retrieves data related to a Location for the specified criteria. The request criteria can be for a single entry based on a Reference ID, Location Name or all Locations will be retrieved if no criteria is specified. + + + + + + + Returns a worker's job or position history imported from a previous system; that is, the user's system prior to migrating to Workday. + + + + + + + This operation retrieves Workday's current system datetime. + + + + + + + This operation updates an image (e.g. picture) related to a employee. + + + + + + + This operation retrieves data related to an Employee and his/her Employment, Personal and Compensation. + + + + + + + This operation retrieves data related to a Contingent Worker and his/her Contract and Personal information. + + + + + + + This operation retrieves references to all Events (created through workflow) associated with a Worker based on the Event Type and Date parameters. + + + + + + + This operation updates an existing Workday Account (e.g. User Name / Password) with the supplied information. + + + + + + + This operation adds a new Workday Account (e.g. User Name / Password) with the supplied information. + + + + + + + This operation adds or updates Company Insider Types. + + + + + + + This operation will get Company Insider Types for the specified criteria. The request criteria can be for a single entry based on a Reference ID or all Company Insider Types will be retrieved if no criteria is specified. Company Insider Type data includes the Reference ID, the name and the description. + + + + + + + Get a photographic image of this employee. + + + + + + + DEPRECATED: Put Company web service replaces Add Update Company Tax ID web service. Use the Put Company web service to update the company Tax ID. + + This operation adds (or updates) the Tax ID for a company.1 + + + + + + + + DEPRECATED: Get Workday Companies web service replaces Get Company Tax ID web service. Use the Get Workday Companies web service to retrieve the Tax ID for a company. + + This operation retrieves the Tax ID for a company.1 + + + + + + + + This operation adds or updates a Work Shift. + + + + + + + This operation retrieves data related to a Work Shift. + + + + + + + This operation adds or updates a Job Category. + + + + + + + This operation will get Job Categories for the specified criteria. The request criteria can be for a single entry based on a Reference ID or all Job Categories will be retrieved if no criteria is specified. Job Category data includes the Reference ID, the name and the description and inactive flag. + + + + + + + Returns public and private information for specified workers. + + + + + + + DEPRECATED: Adds or updates a dependent1 + + + + + + + + Returns organization information for a type of organization. If the request does not specify an organization, the operation returns information for all organizations. + + + + + + + This operation adds or updates a Workers' Compensation Code. + + + + + + + This operation will get Workers' Compensation Codes for the specified criteria. The request criteria can be for a single entry based on a Reference ID; a specified country, country region, or business site; or all Workers' Compensation Codes will be retrieved if no criteria is specified. + Workers' Compensation Code data includes the code, name, business site, country, country region and inactive flag. + + + + + + + DEPRECATED: This operation has been replaced by Get Workday Companies. + This operation retrieves Tax ID information for one or more companies.1 + + + + + + + + DEPRECATED: Put Company web service replaces Put Company Tax ID web service. Use the Put Company web service to update the company Tax ID. + This operation adds (or updates) the Tax ID for a company.1 + + + + + + + + Returns Holiday Calendars based on criteria. + + + + + + + Adds or updates Holiday Calendar. + + + + + + + View Work Schedule Calendars. + + + + + + + Adds or updates Work Schedule Calendar + + + + + + + This operation retrieves the Organization Assignment Default Values and Allowed Values for Supervisory Organizations. + + + + + + + This operation updates the Organization Assignment Default Value and Allowed Values for a Supervisory Organization. Updates can be made by organization type. Note, the default value of Replace_All attribute is FALSE. This is different from most other webservices with this attribute because in this case, FALSE is more conservative. Default and allowed values for all organization types are inherited from the superior when no values have been specified for any organization types. Once a default or allowed value is specified for any organization type, the inheritance is severed. In the UI, inherited values are persisted when inheritance is severed. In order to mimic this behavior in the web service, inherited values will be persisted unless the 'Replace All' or 'Delete' options are set to TRUE. + + + + + + + This operation retrieves data related to Frequencies. + + + + + + + This operation adds or updates a Frequency. + + + + + + + This operation retrieves the disabilities that are currently defined. + + + + + + + This operation adds or updates a Disability. + + + + + + + This operations adds or updates a Job Profile. + + + + + + + This operation retrieves data related to a Job Profile for the specified criteria. The request criteria can be for a single entry based on a Reference ID, management level, job level, job family, job category, company insider type, job classification, workers compensation code, pay rate type , Job Exempt location context, work hours profiles or all Job Profiles will be retrieved if no criteria is specified. + The data returned is organized into different response groups which can be include or not. + + + + + + + This operation retrieves data related to Ethnicities. + + + + + + + This operation adds or updates an Ethnicity. + + + + + + + This operation retrieves Training Types defined in the system. + + + + + + + This operation adds or updates a Training Type + + + + + + + Returns job classification group data. + + + + + + + Adds or updates a job classification group and/or job classifications. + + + + + + + Returns job family data. + + + + + + + Adds or updates a job family. + + + + + + + Returns job family and job family group data. + + + + + + + Adds or updates a job family group. Also adds or removes a group's associated job families. + + + + + + + Gets the difficulty level of filling a job profile. + + + + + + + This operation adds or updates a job profile's Difficulty to Fill. + + + + + + + Gets a Photo Image of the Worker + + + + + + + This operation adds or updates a workers photo. + + + + + + + Operation that will add a new worker to a union. Generates a Union Membership Event. + + + + + + + Get Academic Rank Web Service + + + + + + + This operation adds or updates Academic Ranks + + + + + + + This operation will invoke the Business Process to end an Academic Appointment. + + + + + + + This web service operation will get provisioning groups. It will return the provisioning groups and their associated information excluding any provisioning group assignments. The request can be for a single transaction based on reference, or all transactions can be retrieved if no reference is specified. + + + + + + + This operation will invoke the Business Process to add an Academic Appointment. + + + + + + + This operation will invoke the Business Process to update an Academic Appointment. + + + + + + + This web service operation updates an existing provisioning group if a reference is provided on the request, else it creates a new one. The provisioning group data to be specified as part of the request includes the name and description. Assignment information needs to be submitted using the operation Put Provisioning Group Assignment. + + + + + + + This web service operation will get assignments of persons to provisioning groups. For each assignment a reference to the provisioning group, the person, the worker and status information will be returned. The request can be made for a list of persons as specified in the request criteria. Alternatively a list of workers can be specified there. Requests can also be made for individual assignments by specifying an assignment reference. If no request references or criteria are specified, the assignments for all persons will be returned. + + + + + + + This operation creates or updates the assignment of a person to a provisioning group. If the an assignment between the person and the provisioning group exists, it will be updated with the data given in the request, else a new one will be created. The data to be specified include a reference to the person and the provisioning group. + Alternatively to the person a worker can be specified. In this case the operation will retrieve the person for that worker and create or update the assignment between that person and the group. + The assignment status does not have to be specified on the request. If it is omitted, a default status of “Assigned†will be set. + + + + + + + This operation will get information for search settings. + + + + + + + This operation will put search configurations into workday. + + + + + + + Use this operation ONLY for the country format extension and for local script addresses population. + + 1. Country Format Extension + Since many countries require more granular address components than Workday currently supports, the Alternate Address Formats allow Workday customers to define a Basic and an Extended Address Format metadata for these countries. Customers can then control address formats using Tenant Setup - Global when they want to use extended formats for a country. This operation uploads addresses for a specified country after the addresses are modified to fit a new extended format. Note that the attribute use Extended Address Format in Tenant Setup - Global must be enabled for the country beforeusing this operation to uploading addresses. + + 2. Local Script Address Population + Local script address components were added in W18 to allow address input in local script. This operation uploads addresses with new local address components. + + + + + + + Creates or updates contact information for a person. Contact information includes email addresses, physical addresses, phone numbers, web addresses, and instant messenger contact information. Changes are routed through existing Contact Information for Person Event business process for necessary approvals. + Submitted contact information by default replaces existing entries of the same type. For example, submitting a new email address replaces the current email address. Set the Add Only flag to override this default behavior. When this flag is set to true, existing information is not replaced in cases where multiple entries are allowed. + + + + + + + Get Service Center Representatives. + + + + + + + Adds or updates a Service Center Representative. + + + + + + + Get Service Center Representative Workday Accounts. + + + + + + + Adds or updates a Service Center Representative Workday Account. + + + + + + + Updates the employee's background check status by adding a new instance of Background Check Descriptor, which stores Status Date, Status, and Comment. + + + + + + + Returns detailed information for Academic Units. + + + + + + + This operation adds or updates Academic Units + + + + + + + This operation is used to retrieve Academic Unit Hierarchies. + + + + + + + This operation is used to create an Academic Unit Hierarchy. + + + + + + + This operation retrieves the political affiliations that are currently defined. + + + + + + + This operation adds or updates a Political Affiliation. + + + + + + + Sets a worker's personal information. Uses the Personal Information Change business process. + + + + + + + This web service allows the updating of Government IDs for a worker. + + + + + + + Sets a worker's legal name. Uses the Legal Name Change business process. + + + + + + + Sets a worker's preferred name. Uses the Preferred Name Change business process. + + + + + + + Sets a worker's additional names. Does not use an event. + + + + + + + This web service allows the updating of Passports and Visas for a worker. + + + + + + + This web service allows the updating of Licenses for a worker. + + + + + + + This web service allows the updating of Other IDs for a worker. + + + + + + + This operation allows Former Workers to be added and edited. + Former Worker Storage is for tracking data for individuals that have previously been employed but were not included as a Workday worker. Data includes personal details, contact information, and job details as of termination date. + + + + + + + This operation retrieves Former Workers. + Former Worker Storage is for tracking data for individuals that have previously been employed but were not included as a Workday worker. Data includes personal details, contact information, and job details as of termination date. + + + + + + + This operation retrieves the social benefits localities that are currently defined. + + + + + + + This operation adds or updates a Social Benefits Locality. + + + + + + + Adds or updates a former worker document. The operation adds documents not associated with events and those documents are not secured by the events. + + + + + + + Returns former worker document data + + + + + + + This operation will invoke the Business Process to create an Named Professorship. + + + + + + + Put Task for Edit named Professorship + + + + + + + Creates or Updates Collective Agreement for a Worker. The Collective Agreement includes Applicable Factors and Factor options. + + + + + + + This web service allows the updating of emergency contacts for a person. + + + + + + + Provides ability to assign the previous superior to an organization that is currently inactive and does not currently have a superior. + + + + + + + This operation adds, updates, replaces the Organization Assignment Allowed Values for a Location Hierarchy + + + + + + + Returns Organization Assignments for Location Hierarchies. + + + + + + + This task can be used to retrieve Organization Reference ID for an Organization. + + + + + + + This task allows changing Organization Reference ID for an Organization. For Supervisory Organizations + - if a valid sequence generator is defined, and the Organization Reference ID field is set to empty, then ID will be replaced with an automatically generated ID + - if no sequence generator is defined, and the Organization Reference ID field is set to empty, then ID will be generated follow default pattern (SUPERVISORY_ORGANIZATION_XX_YY) + - an option 'Include Organization ID in Name' can be set. + A new effective-dated organization name is automatically created if any attributes used for organization name are different as of specified effective date. + + + + + + + This operation adds or updates Committee Types + + + + + + + This operation retrieves Committee Types + + + + + + + This operation adds or updates Committee Classification Groups + + + + + + + This operation retrieves Committee Classification Groups + + + + + + + This operation adds or updates Committee Classification + + + + + + + This operation retrieves Committee Classifications + + + + + + + This operation retrieves Committee Member Types. + + + + + + + This operation adds or updates Committee Member Type. + + + + + + + This operation invokes the Manage Committee Membership business process. + + + + + + + Creates or Updates Probation Periods for a Worker. + + + + + + + This operation adds or updates a Committee Definition + + + + + + + This operation gets the current committee(s) definition + + + + + + + This operation retrieves the LGBT Identifications that are currently defined. + + + + + + + This operation adds or updates a LGBT Identification + + + + + + + This operation adds or updates Appointment Specialty. + + + + + + + This operation retrieves Appointment Specialties. + + + + + + + Ends the Collective Agreement Assignment for a ~Worker~ as of the effective data. + + + + + + + This operation retrieves data about existing committee meetings. + + + + + + + This operation adds or updates a new Committee Meeting. + + + + + + + Get Establishments Data. + + + + + + + Loads Establishment Data. + + + + + + + Manually assign establishments to workers' positions + + + + + + + Get Workday Accounts for a user or set of users + + + + + + + This operation reactivates an organization based on the specified reference ID or WID. The organization must already be inactive or be inactive in the future. The system automatically sets the reactivation effective date to the same date as the date of the last inactivation so that there are no gaps when an active organization was inactive. This web service can currently be used to reactivate these organization types: Supervisory, Company, Cost Center, Region, Matrix, Pay Group, Retiree, Custom Org, Company Hierarchy, Cost Center Hierarchy, Location Hierarchy, Region Hierarchy. + + + + + + + Manually assign Veteran Status Identifications for an Employee. + + + + + + + Directly assign or unassign worker positions as members to a custom organization. The custom organization type must be configured in 'Maintain Organization Types' as 'Allow Reorganization Tasks (like Move Workers, Assign Workers)' = Y and 'Position Unique' = N. The Reorganization determines the effective date that a position is added as a member. In the UI, the equivalent task is executed via related action off the custom organization: Reorganization > Assign Workers > Select Workers by Individual. + + + + + + + Create/Edit a Work Status Rule Set via Web Services + + + + + + + Retrieves existing Work Status Rule Sets via Web Service + + + + + + + This operation adds or updates a Period Reporting Calendar + + + + + + + Retrieves the information about the Period Reporting Calendars requested + + + + + + + Public Web Service Operation for Adding/Editing Location Attributes + + + + + + + Public Web Service Operation for Retrieving Location Attributes + + + + + + + Web service task to add, delete, or edit external disability self-identification records + + + + + + + This operation retrieves the External Disability Self-Identification Records that are currently defined + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/multipart-output/Multipart.wsdl b/src/test/resources/wsdl/multipart-output/Multipart.wsdl new file mode 100755 index 00000000..34da6b79 --- /dev/null +++ b/src/test/resources/wsdl/multipart-output/Multipart.wsdl @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/multipart-output/claim/ClaimTypes-v1.4.xsd b/src/test/resources/wsdl/multipart-output/claim/ClaimTypes-v1.4.xsd new file mode 100755 index 00000000..5a016e44 --- /dev/null +++ b/src/test/resources/wsdl/multipart-output/claim/ClaimTypes-v1.4.xsd @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + ITS Specific - Claim Format Type from the ITS Formats Database. +Values: +'SF' - Submission Format +'DF' - Disposition Format +'RF' - Reconciliation Format +'NF' - Notification Format + + + + + + + + + + + + + Unique number used to identify claims for detail requests. +Note: PayerClaimControlNumber is a data element returned by the LocateClaimsService (eg. 99999999999, 999999999999), will be ICN for NASCO + + + + + Will be populated only for Facility Finalized Claims - FIF = ClaimControlNumber, FOF = ClaimControlDigit + + + + + Adjusted Claim Control Number + + + + + SCCF Number - 17 digit - For ITS Claims (both NASCO and Local) Indicates the SCCF number on the claim: On an original claim, this is the SCCF number of the submission format (SF) record that created it. On an adjustment claim, this is the SCCF number of the adjustment SF record that created it + + + + + Cross Reference SCCF Number - same as SCCF Number. This Cross Reference SCCFNumber is used in SF and DF for adjusted and closed-out/rejected claims. + + + + + Will be populated only for Facility Finalized Claims + + + + + + + This field is used for searching claims based on the status - In Process, Finalized or All + + + + + + + + + + + + + Common Contract And Member Types: + + + + + + + + + This element represents the amounts specific to the claim. + + + + + Copay Amount. Total Claim copayment amount applied to this claim based on the subscriber's contract. All Copay for all services + + + + + The amount of money BCBSM approved for payment after any reductions in payment have been applied, but before any cost sharing was approved. + + + + + A generic term referring to any cost a subscriber is liable for (for example, a deductible, copayment or amount owed for a noncovered service). Returned at the Claim Level. + + + + + Sum of all the service paid amount. + + + + + Total Claim Deductible Amount. All deductible for all services. + + + + + + The difference of the amount chanrged and the amount of money BCBSM approved for payment after any reductions in payment have been applied, but before any cost sharing was approved. + + + + + The amount of money BCBSM approved for payment after any reductions in payment have been applied, but before any cost sharing was approved. + + + + + + + Contract ID that is used to identify a contract. It can be upto 14 character length. + + + + + + + + Contract ID that is used to identify a contract. It consists of and 3 character prefix, 9 character contract number, and possibly a 4 character extent. + + + + + + + + + + + + + + + + + + + + + + + + + Diag Code Grouping + + + + + Diagnosis Code + + + + + Present On Admission Indicator - POA + + + + + + + Claim's Billing Disposition Info. LOCAL. + + + + + Claims Billing Disposition Code + + + + + Claims Billing Disposition Date + + + + + + + + + Indicates the surgical procedure that was performed + + + + + + + + Indicates the date on which the patient was admitted to the hospital + + + + + Indicates the date on which the patient was discharged from the hospital + + + + + + + + Indicates the method in which the facility is reimbursed + + + + + Indicates the percentage factor applied to the approved-to-pay amount for payments to the hospital + + + + + Indicates the date on which the surgical procedure was performed + + + + + + + Indicates where and why a claim record or detail line was rejected or suspended in processing. Available from NASCO and LOCAL. + + + + + + + + + + + + Information about the member for whom the claim was submitted + + + + + + + Account number for NASCO. Facility-Case for LOCAL + + + + + + + + + + + + + + + + + + + + + + + Identifies the services performed for the subscriber and/or the subscriber's dependents. Stands for HCFA Common Procedure Coding System, where HCFA is the Health Care Financing Administration. This procedure coding system is used by BCBSM for "professional" and outpatient facility claims to identify services performed. + + + + + + + + + Defines the meaning of the procedure code on a claim line. NASCO currently supports only upto 3 occurences. + + + + + Indicates the number of services allowed for the procedure code on the claim line. Note: Units may represent days, pills, etc., depending on the procedure code + + + + + Indicates the Health Care Procedure Coding System code used for pricing outpatient and ambulatory surgical facility claims at a lower cost than traditional, non-HCPCS claims + + + + + + + + + Represents the following: • First three digits are the code of the Home Plan that submitted the claim (a.k.a. servicing Plan) • Fourth digit is the line of business code • Last ten digits are the provider number assigned and maintained by the Plan. + + + + + + + + + + + + + Indicates the relationship the servicing provider has with the network in the Administration system + + + + + Indicates the provider's participation status; denotes the type of agreement a provider has with a Plan for a specified line of business + + + + + + + + + Provider's Federal Tax ID. This generic type can represent the TaxID specific to the Claim and the base Tax ID attached to the Provider. + + + + + + Status Code + + + + diff --git a/src/test/resources/wsdl/multipart-output/common/CommonTypes-v2.0.xsd b/src/test/resources/wsdl/multipart-output/common/CommonTypes-v2.0.xsd new file mode 100755 index 00000000..3ef4994c --- /dev/null +++ b/src/test/resources/wsdl/multipart-output/common/CommonTypes-v2.0.xsd @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + +Possible values are: LOCAL, NPS, MTV, BCN, PGBA, MA, DENTEMAX +Business channel is an abstract concept for backend system, which enables services to group backend systems in logical units. This is used by consumers to specify where to retrieve data from or where to change data. +Common interface systems identified in information layer [UC:SOAs] across services and service candidates. +If a service has multiple information layer components/UC: SOAs, business channel allows consumers to specify information layer channel. Most of the cases consumer already has this information before calling the service +Usage: If service needs to accept multiple values for business channel e.g. getting data from both Local and Nasco then have definition with maxOccurs=n (n can be a predefined number or unbound) +E.g. element name="BusinessChannel" type="common:BusinessChannelEnumEnum" minOccurs="0" maxOccurs="3" + + + + + + + + + Informational element that is used to provide information about the state of the information retrieved, significant messages (info and error level) from the back-end systems, service level validation status, status about relevant components of the service, etc + + + + + Code representation of the message + + + + + Descriptive represntation of the message + + + + + + + + + + + + + + + + 10-digit phone number and 4-digit extension + + + + + + + + + + + + + + Indicates a start and end date of a period. + + + + + Indicates the first date services were performed. Beginning of date range. + + + + + Indicates the last date services were performed. End of date range. + + + + + + + Indicates the effective and expiration dates. + + + + + + + + + For matching two string values there are various options, including Exact, Partial, and Phonetic. This type defines these math types + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3 digit prefix to number + + + + + Number of 4 digits + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/multipart-output/common/MetaTypes-v1.1.xsd b/src/test/resources/wsdl/multipart-output/common/MetaTypes-v1.1.xsd new file mode 100755 index 00000000..e17eb247 --- /dev/null +++ b/src/test/resources/wsdl/multipart-output/common/MetaTypes-v1.1.xsd @@ -0,0 +1,249 @@ + + + + + + + + Identifies the End consumer of message. + + + + + Unique id that is used to identify the consuming application. The id will be assigned to the consumer by the Services COE and used as specified by the Service Consumer Guide. This should be the end consumer ID, i.e the actual consuming appliation that requested the information + + + + + + + + + + + Additional information about the consuming application (i.e. name of the application). This should be the end consumer name, i.e the actual consuming appliation that requested the information + + + + + + + + + + + + + + + + is the date time stamp that the given instance of the Business Object Document was created. This date must not be modified during the life of the message. + + + + + +The MessageId provides a place to carry a Globally Unique Identifier (GUID) that will make each Schema instance uniquely identifiable. +This is a critical success factor to enable software developers to use the Globally Unique Identifier (GUID) to build the following services or capabilities: +1. Legally binding transactions, +2. Transaction logging, +3. Exception handling, +4. Re-sending, +5. Reporting, +6. Confirmations, +7. Security. + + + + + + + + + Informational element that is used to provide an indication toward the effectiveness of the request processing. + + + + + + + Name of the back-end system, which is the source of information + + + + + Code from any other system + + + + + Additional technical information. This field should be used instead of appending information to the general Description associated with the Code. + + + + + + + + + + + + + Identifies characteristics and control identifiers that relate to the application that created the message. + + + + + + + + + Is the schema based inheritance for all service schemas. The logical model would also include the Payload. + + + + + Provides the information that an application may need to know in order to communicate in an integration of two or more business applications. The HeaderArea is used at the applications layer of communication. While the integration frameworks web services and middleware provide the communication layer that message operates on top of. + + + + + + + This is used for large messages where response is broken down into multiple responces. + + + + + + + + + + + + + + Used to communicate results of component systems that are consumed by the request's processing. + + + + + + + + + Is the schema based inheritance for all service schemas. The logical model would also include the Payload. + + + + + Provides the information that an application may need to know in order to communicate in an integration of two or more business applications. The HeaderArea is used at the applications layer of communication. While the integration frameworks web services and middleware provide the communication layer that message operates on top of. + + + + + + + This is used for long messages where response is broken down into multiple responces. + + + + + + Number of contracts returned in the response + + + + + Maximum number of rows that can be returned in one response/page. + + + + + + + + Indicates the overall status of the service response to the consumer (possible statuses include successful, partial data, failure, etc). + + + + + + + + + + + Indicates the environment in which to run the operation through. + This has multiple values to cover current and future TERI runways. + Promotions normally move from TEST to SIT to QA/E2E to PROD. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Indicates the service version. + + + + + Indicates the schema version. + + + + + diff --git a/src/test/resources/wsdl/multipart-output/mbr/MbrTypes-v2.1.xsd b/src/test/resources/wsdl/multipart-output/mbr/MbrTypes-v2.1.xsd new file mode 100755 index 00000000..dfa586a8 --- /dev/null +++ b/src/test/resources/wsdl/multipart-output/mbr/MbrTypes-v2.1.xsd @@ -0,0 +1,436 @@ + + + + + + Primary AddressType extended for status and identifier information. + + + + + + + Valid Values are : MA - Mailing, MR - Rating, RA - Residential, SA - Student, ZO - Other + + + + + User defined code; selected when the Address Type is ZO + + + + + Unique identifier; used to associate a member on the same contract to an existing address. For example, this is normally the AddressIdentifier of the subscriber's address. If not shared (ShareAddrFlag="N", then set to "0" (zero). + + + + + Indicator whether this address is primary. Valid Values are : Y - for primary; N or Spaces - for not primary + + + + + Indicator whether other members share this address. Valid Values are : Y - shared; N - not shared + + + + + Status code (still active) of the Address + + + + + Date this address becomes effective to use. User can edit for valid date + + + + + Date this address may no longer be available User can edit for valid date + + + + + Date of the request to add this address information. User can edit for valid date + + + + + + + + + Standard lookup and code categories, normally two or four byte code (Reason Codes, Status Codes, Condition Codes, Explanation Codes, etc.) + + + + + + + + + + + Up to four addresses supported for each member. + + + + + + + Cross Reference + + + + + New Contract Number + + + + + Reason for cross reference. String of length 3 for NASCO + + + + + + String of length 4 on NASCO + + + + + + + Contract Information + + + + + + + + + Contract ID that can be used to identify a contract. This field generically specifies the contract number and may be used in various forms. Specific format should be presented by the elements realizing this type. + + + + + + + + Contract ID that can be used to identify a contract. It consists of and 3 character prefix, 9 character contract number, and possibly a 4 character extent. + + + + + + + + + + + + + + + + + + + + + + + + + Descriptions are Planspecific, for example: 1 (Group), 2 (Non-group), 3 (Workers' compensation), 4 (Accidental injury). Note: Value is required with OtherCoverageIndicator of Y and DetailActionCode of A + + + + + + + + + + Identifier associated with other carrier company + + + + + + + + + This defines the timespan for which the contract is active; there MAY be multiple (upto 5) spanTypes per contract. One of the required elements for creating, updating, reinstating and voiding a contract in Metavance. Metavance CoverageTypeSpan has Action field which has values A, C, V, and R. CreateContract would call backend with Action of A and updateContact would call with action of C... + + + + + + + + + Rate Package identifier; currently defined as string of length 4 for NASCO systems. + + + + + This defines employer group and Division (Number+Division) with which the coverage contract is associated (Number+Section). + + + + + Business Level 4, 5, 6, and 7 ID. Metavance required this field for creating contract. + + + + + This is the date when contract was requested. It may be different from current date. + + + + + + Reason code for end date; currently defined as string of length 4 for NASCO systems. + + + + + + + + + Employment information + + + + + Current values for NASCO used in COB services are A: Active, R: Retired, L: Laid Off. + Currently for CreateContract service it's a string of length 4 for NASCO + + + + + Date range represents start and end date for employment. For COB services it may mean effective and cancel date for other coverage. + + + + + + + + + External contract numbers of may have length greater than 9. Contract ID that is used to identify a contract. It can be upto 14 character length. + + + + + + + + External contract numbers of may have length greater than 9. In conjunction with ExternalContractIdentifier this is used to further identify a contract. It consists of and 3 character prefix, a greater than 9 character contract number, and possibly a 4 character extent. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Group suffix number the contract is associated with. For NASCO this is equivalent section number. + + + + + + + + + + + + + + + + + + + + + + + + + + + + System's Deidentified Number + + + + + + Member Information. Subscriber is a member so this can be used as subscriber too. + + + + + Indicates the unique number of the member within the contract + + + + + + + + + System's sequence number for the member. e.g. 01, 02, 03, etc. For some systems leading zeroes are dropped. Also referred to as Member ID + + + + + + + + Social Security Number (no hyphens or spaces) + + + + + + + + Primary information to identify a person or human being. Not necessarily a member. + + + + + + + Indicator of whether a name history record should be created for this name change. Valid values are Y, N or spaces. This is for auditing purposes. + + + + + Date of Death of the person. + + + + + Social Security Number of the person. + + + + + Person's Marital Status + + + + + Original date the personl had coverage or some type of service. + + + + + + + + + NASCO plan code; also known as control plan code + + + + + + + + + + Identifies the condition, the member is totally disabled, or is in waiting period at the Division level regarding pre-existing conditions. Valid values are M, T, D + + + + + User defined code indicationing a category/classification of the pre-existing condition. + + + + + When the precondition is acknowledged as current with the system. + + + + + This is conditionally required based on the ConditionType + + + + + Explanation category of the pre-existing condition. A user defined code; for adding a member, this field is required for ConditionType=T + + + + + Identifies whether the investigation is based on a disability that began prior to enrollment, during coverage while coverage is in effect or during coverage and coverage is no longer in effectConditionally required; Required when Condition Type is T. Values are: (B)efore Enrollment, (D)uring Coverage, (U)pon Termination. + + + + + Date when the member's disability began; Required when ConditionType is T + + + + + + + + + + User defined status code + + + + + Member status type either: Claims, Billing, Underwriting or Other. + + + + + + + + + Transaction indicator type for backend, normally (A)dd, (C)hange, (V)oid. Others include (T)erminate and (R)einstate. These values could change at any time, so enumeration is not used. + + + + + + diff --git a/src/test/resources/wsdl/multipart-output/util/DMTypes-v2.1.xsd b/src/test/resources/wsdl/multipart-output/util/DMTypes-v2.1.xsd new file mode 100755 index 00000000..bb707581 --- /dev/null +++ b/src/test/resources/wsdl/multipart-output/util/DMTypes-v2.1.xsd @@ -0,0 +1,615 @@ + + + + + + + + + + + + + + + + Is where the information that the message carries is provided + + + + + + + + + + + + + + + Is where the information that the message carries is provided + + + + + + + + + + + + + + + Is where the information that the message carries is provided + + + + + + + + + + + + + + + + + + + + Is where the information that the message carries is provided + + + + + + + + + + Required attribute associated to the content. e.g.: Attachment_ID = "98765432123457689" + + + + + Represents a name of the property of content [eg: Attachment_ID] + + + + + Represents a value of the property of content [eg: "98765432123457689"] + + + + + Represents a date value of the property of content [eg: "2012-11-01"] + + + + + + + Claim information + + + + + + + + + + + + + + + Document type - eg: pdf, word etc + + + + + XML payload will used to getnerate actual document + + + + + Document name + + + + + + + Metadata about a material (document) + + + + + The Material ID or code used to identify a document. Required by BCN and IKA. On IKA side, this is called CategoryID. and currently available values in IKA : FULFIL, ENROLL, CLMCL + + + + + The date the material was requested to be processed by the Consumer. Not all materials have a request date. Required by IKA. + + + + + Indicates if the material (i.e. a form) was received by the business from the member. A Y or N value. + + + + + Available values in IKA : FORMS, IDCARD, IDLOST, IDSTLN, EOB, EOC. Required by IKA. + + + + + If not provided, will be defaulted to 'Phone'. Required by IKA. + + + + + If not provided, will be defaulted to 'M' which indicates Member. Required by IKA. + + + + + Comments. Required by IKA. + + + + + + + Request type for request materials service + + + + + + + + If MemberID is not provided, then must at least provide first, last, DOB, and Gender. + + + + + + + + If MemberID provided, then cannot provide other member information. + + + + + + + + + + If no date provided, the assumes current eligibility. + + + + + + + Response type for request materials document service + + + + + + For BCN, the Suffix is also known as the Group Subcode. + + + + + + + + One business channel (BCN) available at this time. + + + + + + The source system member identification code for a subscriber or member. This is the member the matierial is being requested for. + + + + + Describe the meta data of a material or document. Material ID is required. + + + + + + + + + + + + + + Name of the Data Map in IICE where federated query definition is caputred + + + + + + + + Valid values are: + "EOB" - Explanation of Benefits + "NBR" - Negative Balance Reports + "1095B" - 1095B Tax Statement + "VOUCHER" - to support voucher based search + + + + + + An identifier returned by the source system to identify an artifact. It is NOT necessarily unique. + + + + + + + + + + + + + + Request type for retrieve document service + + + + + + + IICE, NASCO, CMOD, TR etc + + + + + Indicates whether to include document content (attachment) as part of response or not + + + + + Id to access ContentManagement + + + + + password to access ContentManagement + + + + + + + + + Response type for retrieve document service + + + + + + + + Request type for store document service + + + + + Valid values are: + "EOB" - Explanation of Benefits + "NBR" - Negative Balance Reports + "1095B" - 1095B Tax Statement + "VOUCHER" - to support voucher based search + + + + + Used for EOB search + + + + + + + Used for NBR search + + + + + Activity Date Range - Used for NBR search + + + + + When the service was rendered by the provider. Used for EOB search + + + + + Statement date. If it is not provided a two year history window will be defaulted. + Used for EOB search and 1095B statements search. + + + + + + Used for EOB search if provided. + + + + + Recipient Name as appear on tax statements. Used to search 1095B tax statements. + + + + + Tax Identification number as appear on 1095B Tax statements. Used to search 1095B tax statements. + + + + + Document Identification number for PCPPO Letters + + + + + Name of the Data Map in ICI where federated query definition is caputred + + + + + Id to access ContentManagement + + + + + password to access ContentManagement + + + + + AttributeValue will have attribute name, values and operator. Atleast one should be required + + + + + AttributeValueWithLogicalwill have logical operator, attribute name, values and operator. + + + + + Sort Order + + + + + Max Result set size + + + + + Voucher specific elements + + + + + + + + + Comparison,Equality and other operators supported by ICI + + + + + + + + + + + + + + + + + + + + + + + Basic Logical Operator Type supported by ICI + + + + + + + + + + + Basic Sort Order + + + + + + + + + + Basic sort attribute eg: Sort By ContractNumber + + + + + Represents a name of the property of content [eg: Attachment_ID] + + + + + + + + Required attribute associated to the content. e.g.: Attachment_ID = "98765432123457689" + + + + + Represents a name of the property of content [eg: Attachment_ID] + + + + + + Represents a string value of the property of content [eg: "98765432123457689"] + + + + + + + Required attribute associated to the content. e.g.: Attachment_ID = "98765432123457689" + + + + + + + Defaulted to AND operator. + + + + + + + + + Response type for search document service + + + + + + + + + Document Type + + + + + + + + Top level entity for search listing data + + + + + + Valid values are: + "EOB" - Explanation of Benefits + "NBR" - Negative Balance Reports + "1095B" - 1095B Tax Statement + "VOUCHER" - to support voucher based search + + + + + + + An identifer returned by the source system for the artifact. + + + + + + + + + + + + + + + + + + Voucher response type extending voucher type + + + + + + + Paid date + + + + + + + + + Voucher specific elements + + + + + Check Number + + + + + Financial Document Serial Number + + + + + Unique numer given to the Voucher document + + + + + Processing application. Ex CF, Facility, MI, FEP etc + + + + + + + + Parent Folder Search parameters + + + + + + diff --git a/src/test/resources/wsdl/multipart-output/util/harvest.sig b/src/test/resources/wsdl/multipart-output/util/harvest.sig new file mode 100755 index 0000000000000000000000000000000000000000..888faa293939dbcf18aef47b25d56f98e6a7a7d8 GIT binary patch literal 1655 zcmZ=$_HYaea}5rO5B7BTa|{U$a#dzzzy$w+zzsw&j1q%C40Kr;7#K$*YVb$YXdDft zIC2vJ7K|>wA(aKG#kyridWL!x#VMdD#3qhS3{n#2MW z2nh0bF$2;uC^9inMd7JQF+l8`pI4HaR}vHM>ZI%G=N405oRSk$T9TOq)X1PXpMil1 zNE;g1WIbYF2eO>aj13Je%z@*P literal 0 HcmV?d00001 diff --git a/src/test/resources/wsdl/no-schema-location/0.xsd b/src/test/resources/wsdl/no-schema-location/0.xsd new file mode 100644 index 00000000..2df067cf --- /dev/null +++ b/src/test/resources/wsdl/no-schema-location/0.xsd @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/no-schema-location/1.xsd b/src/test/resources/wsdl/no-schema-location/1.xsd new file mode 100644 index 00000000..766096f6 --- /dev/null +++ b/src/test/resources/wsdl/no-schema-location/1.xsd @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/no-schema-location/2.xsd b/src/test/resources/wsdl/no-schema-location/2.xsd new file mode 100644 index 00000000..9b00bdd2 --- /dev/null +++ b/src/test/resources/wsdl/no-schema-location/2.xsd @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/no-schema-location/test.wsdl b/src/test/resources/wsdl/no-schema-location/test.wsdl new file mode 100644 index 00000000..d56bc9a3 --- /dev/null +++ b/src/test/resources/wsdl/no-schema-location/test.wsdl @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/no-style-defined.wsdl b/src/test/resources/wsdl/no-style-defined.wsdl new file mode 100644 index 00000000..f32f722b --- /dev/null +++ b/src/test/resources/wsdl/no-style-defined.wsdl @@ -0,0 +1,62 @@ + + + + + mockable.io generated WSDL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/wsdl/recursive/dir1/dir2/import1.xsd b/src/test/resources/wsdl/recursive/dir1/dir2/import1.xsd new file mode 100644 index 00000000..b7ed8240 --- /dev/null +++ b/src/test/resources/wsdl/recursive/dir1/dir2/import1.xsd @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/recursive/dir1/import0.xsd b/src/test/resources/wsdl/recursive/dir1/import0.xsd new file mode 100644 index 00000000..a33eca3d --- /dev/null +++ b/src/test/resources/wsdl/recursive/dir1/import0.xsd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/recursive/import2.xsd b/src/test/resources/wsdl/recursive/import2.xsd new file mode 100644 index 00000000..41325efd --- /dev/null +++ b/src/test/resources/wsdl/recursive/import2.xsd @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/src/test/resources/wsdl/recursive/import3.xsd b/src/test/resources/wsdl/recursive/import3.xsd new file mode 100644 index 00000000..025931eb --- /dev/null +++ b/src/test/resources/wsdl/recursive/import3.xsd @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/recursive/import4.xsd b/src/test/resources/wsdl/recursive/import4.xsd new file mode 100644 index 00000000..76454247 --- /dev/null +++ b/src/test/resources/wsdl/recursive/import4.xsd @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/recursive/imported.wsdl b/src/test/resources/wsdl/recursive/imported.wsdl new file mode 100644 index 00000000..1a972d66 --- /dev/null +++ b/src/test/resources/wsdl/recursive/imported.wsdl @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/recursive/main.wsdl b/src/test/resources/wsdl/recursive/main.wsdl new file mode 100644 index 00000000..e934a825 --- /dev/null +++ b/src/test/resources/wsdl/recursive/main.wsdl @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/rpc.wsdl b/src/test/resources/wsdl/rpc.wsdl new file mode 100644 index 00000000..3d733c23 --- /dev/null +++ b/src/test/resources/wsdl/rpc.wsdl @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A SOAP service that echoes input parameters in the response + + + + + diff --git a/src/test/resources/wsdl/simple-service.wsdl b/src/test/resources/wsdl/simple-service.wsdl new file mode 100644 index 00000000..be27b5e7 --- /dev/null +++ b/src/test/resources/wsdl/simple-service.wsdl @@ -0,0 +1,413 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/simple-soap12-service.wsdl b/src/test/resources/wsdl/simple-soap12-service.wsdl new file mode 100644 index 00000000..f8012f69 --- /dev/null +++ b/src/test/resources/wsdl/simple-soap12-service.wsdl @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/wsdl/types-multiple-schema.wsdl b/src/test/resources/wsdl/types-multiple-schema.wsdl new file mode 100644 index 00000000..9bcd7418 --- /dev/null +++ b/src/test/resources/wsdl/types-multiple-schema.wsdl @@ -0,0 +1,54 @@ + + + + + + + + 11.2.0.V20141105_0810 + + + + + + + + 11.2.0.V20141105_0810 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +