https://bugs.eclipse.org/bugs/show_bug.cgi?id=279989 - at run time, DBWS ProviderHelper throws away all server-side exceptions
- cut-&-paste error in ProviderHelper.java: carefully managed, caught server-side exceptions, built
SOAPFaultMessage - then dropped it and build a second SOAPMessage with an empty payload - which
for an update, indicates success!
- added testcase: try to put 10-char name into 9-char column - verify SOAPFaultException contains
message "Data too long for column 'NAME'"
diff --git a/dbws/org.eclipse.persistence.dbws/META-INF/MANIFEST.MF b/dbws/org.eclipse.persistence.dbws/META-INF/MANIFEST.MF
index 450d3f4..de8430a 100644
--- a/dbws/org.eclipse.persistence.dbws/META-INF/MANIFEST.MF
+++ b/dbws/org.eclipse.persistence.dbws/META-INF/MANIFEST.MF
@@ -11,9 +11,9 @@
org.eclipse.persistence.internal.dbws;version="1.1.1",
org.eclipse.persistence.internal.xr;version="1.1.1",
org.eclipse.persistence.internal.xr.sxf;version="1.1.1"
-Import-Package: javax.activation;vendor=sun,
+Import-Package: javax.activation,
javax.servlet;version="2.4.0",
javax.xml.soap;version="1.3.0",
- javax.xml.ws;version="2.0.0",
- javax.xml.ws.soap;version="2.0.0"
+ javax.xml.ws,
+ javax.xml.ws.soap
HK2-Bundle-Name: org.eclipse.persistence:org.eclipse.persistence.dbws
diff --git a/dbws/org.eclipse.persistence.dbws/src/org/eclipse/persistence/internal/dbws/ProviderHelper.java b/dbws/org.eclipse.persistence.dbws/src/org/eclipse/persistence/internal/dbws/ProviderHelper.java
index bfd9f9f..1dc8aa4 100644
--- a/dbws/org.eclipse.persistence.dbws/src/org/eclipse/persistence/internal/dbws/ProviderHelper.java
+++ b/dbws/org.eclipse.persistence.dbws/src/org/eclipse/persistence/internal/dbws/ProviderHelper.java
@@ -471,6 +471,10 @@
if (result instanceof ValueObject) {
result = ((ValueObject)result).value;
}
+ response = responseWriter.generateResponse(op, result);
+ }
+ catch (SOAPException se) {
+ throw new WebServiceException(se.getMessage());
}
catch (EclipseLinkException ele) {
try {
@@ -488,20 +492,6 @@
throw new SOAPFaultException(soapFault);
}
}
- try {
- response = responseWriter.generateResponse(op, result);
- }
- catch (Exception e) {
- SOAPFault soapFault = null;
- try {
- soapFault = getSOAPFactory().createFault("SOAPMessage response format error - " +
- e.getMessage(), new QName(URI_NS_SOAP_1_1_ENVELOPE, "Server"));
- }
- catch (SOAPException se) {
- /* safe to ignore */
- }
- throw new SOAPFaultException(soapFault);
- }
return response;
}
diff --git a/utils/eclipselink.utils.dbws.test/build.properties b/utils/eclipselink.utils.dbws.test/build.properties
index eaf7a8f..d316d38 100644
--- a/utils/eclipselink.utils.dbws.test/build.properties
+++ b/utils/eclipselink.utils.dbws.test/build.properties
@@ -33,7 +33,7 @@
# Variable Definitions (execution location dependent)
# -----------------------------------
eclipselink.utils.dbws=../eclipselink.utils.dbws
-eclipselink.dbws.core.depend=javax.activation_1.1.0.v200806101325.jar,javax.mail_1.4.0.v200804091730.jar,javax.xml.soap_1.3.0.jar
+eclipselink.dbws.core.depend=javax.activation_1.1.0.v200806101325.jar,javax.mail_1.4.0.v200804091730.jar,javax.xml.soap_1.3.0.jar,javax.servlet_2.4.0.v200806031604.jar
eclipselink.utils.dbws.depend=javax.wsdl_1.6.2.v200806030405.jar
# Build Artifact Definitions
diff --git a/utils/eclipselink.utils.dbws.test/build.xml b/utils/eclipselink.utils.dbws.test/build.xml
index b88701a..7c6e6c3 100644
--- a/utils/eclipselink.utils.dbws.test/build.xml
+++ b/utils/eclipselink.utils.dbws.test/build.xml
@@ -376,5 +376,6 @@
<SetupCompileRunTeardown testsuite-name="SimpleTable"/>
<SetupCompileRunTeardown testsuite-name="SimpleSP"/>
<SetupCompileRunTeardown testsuite-name="SimpleTableWithNestedSQL"/>
+ <SetupCompileRunTeardown testsuite-name="UpdateFault"/>
</target>
</project>
diff --git a/utils/eclipselink.utils.dbws.test/etc/dbsetup_updatefault.sql b/utils/eclipselink.utils.dbws.test/etc/dbsetup_updatefault.sql
new file mode 100644
index 0000000..b475c81
--- /dev/null
+++ b/utils/eclipselink.utils.dbws.test/etc/dbsetup_updatefault.sql
@@ -0,0 +1,6 @@
+CREATE TABLE IF NOT EXISTS sfault_table (
+ ID NUMERIC NOT NULL,
+ NAME VARCHAR(9),
+ PRIMARY KEY (ID)
+)|
+insert into sfault_table values (1, 'name1')|
\ No newline at end of file
diff --git a/utils/eclipselink.utils.dbws.test/etc/dbteardown_updatefault.sql b/utils/eclipselink.utils.dbws.test/etc/dbteardown_updatefault.sql
new file mode 100644
index 0000000..5b435a15
--- /dev/null
+++ b/utils/eclipselink.utils.dbws.test/etc/dbteardown_updatefault.sql
@@ -0,0 +1 @@
+DROP TABLE sfault_table|
\ No newline at end of file
diff --git a/utils/eclipselink.utils.dbws.test/src/dbws/testing/DBWSTestSuite.java b/utils/eclipselink.utils.dbws.test/src/dbws/testing/DBWSTestSuite.java
index 9f63226..bc3c740 100644
--- a/utils/eclipselink.utils.dbws.test/src/dbws/testing/DBWSTestSuite.java
+++ b/utils/eclipselink.utils.dbws.test/src/dbws/testing/DBWSTestSuite.java
@@ -74,6 +74,13 @@
public final static String DEFAULT_DATABASE_PLATFORM =
"org.eclipse.persistence.platform.database.MySQLPlatform";
+ public static final String SFAULT = "sfault_table";
+ public static final String SFAULT_TEST = SFAULT + "Test";
+ public static final String SFAULT_SERVICE = SFAULT + "Service";
+ public static final String SFAULT_NAMESPACE = "urn:" + SFAULT;
+ public static final String SFAULT_SERVICE_NAMESPACE = "urn:" + SFAULT_SERVICE;
+ public static final String SFAULT_PORT = SFAULT_SERVICE + "Port";
+
// JUnit test fixtures
public static String DBWS_BUILDER_XML_USERNAME;
diff --git a/utils/eclipselink.utils.dbws.test/src/dbws/testing/updatefault/UpdateFaultTestSuite.java b/utils/eclipselink.utils.dbws.test/src/dbws/testing/updatefault/UpdateFaultTestSuite.java
new file mode 100644
index 0000000..a7519b9
--- /dev/null
+++ b/utils/eclipselink.utils.dbws.test/src/dbws/testing/updatefault/UpdateFaultTestSuite.java
@@ -0,0 +1,443 @@
+package dbws.testing.updatefault;
+
+//javase imports
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Vector;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+//java eXtension imports
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.wsdl.WSDLException;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.soap.SOAPPart;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.ws.Dispatch;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.Provider;
+import javax.xml.ws.Service;
+import javax.xml.ws.ServiceMode;
+import javax.xml.ws.WebServiceException;
+import javax.xml.ws.WebServiceProvider;
+import javax.xml.ws.soap.SOAPFaultException;
+import static javax.xml.ws.Service.Mode.MESSAGE;
+import static javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING;
+
+//JUnit4 imports
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.assertTrue;
+
+//EclipseLink imports
+import org.eclipse.persistence.dbws.DBWSModelProject;
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.exceptions.XMLMarshalException;
+import org.eclipse.persistence.internal.databaseaccess.Platform;
+import org.eclipse.persistence.internal.dbws.DBWSAdapter;
+import org.eclipse.persistence.internal.dbws.ProviderHelper;
+import org.eclipse.persistence.internal.dbws.SOAPResponseWriter;
+import org.eclipse.persistence.internal.dynamicpersist.BaseEntityClassLoader;
+import org.eclipse.persistence.internal.helper.ConversionManager;
+import org.eclipse.persistence.internal.oxm.schema.SchemaModelProject;
+import org.eclipse.persistence.internal.oxm.schema.model.Schema;
+import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
+import org.eclipse.persistence.internal.xr.Invocation;
+import org.eclipse.persistence.internal.xr.Operation;
+import org.eclipse.persistence.internal.xr.Parameter;
+import org.eclipse.persistence.internal.xr.ProjectHelper;
+import org.eclipse.persistence.internal.xr.XRServiceModel;
+import org.eclipse.persistence.logging.SessionLog;
+import org.eclipse.persistence.mappings.AttributeAccessor;
+import org.eclipse.persistence.oxm.NamespaceResolver;
+import org.eclipse.persistence.oxm.XMLContext;
+import org.eclipse.persistence.oxm.XMLDescriptor;
+import org.eclipse.persistence.oxm.XMLLogin;
+import org.eclipse.persistence.oxm.XMLRoot;
+import org.eclipse.persistence.oxm.XMLUnmarshaller;
+import org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping;
+import org.eclipse.persistence.platform.xml.XMLComparer;
+import org.eclipse.persistence.platform.xml.XMLParser;
+import org.eclipse.persistence.platform.xml.XMLPlatform;
+import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
+import org.eclipse.persistence.platform.xml.XMLSchemaReference;
+import org.eclipse.persistence.sessions.DatabaseLogin;
+import org.eclipse.persistence.sessions.DatabaseSession;
+import org.eclipse.persistence.sessions.DatasourceLogin;
+import org.eclipse.persistence.sessions.Project;
+import org.eclipse.persistence.sessions.factories.XMLProjectReader;
+import org.eclipse.persistence.tools.dbws.DBWSBuilder;
+import org.eclipse.persistence.tools.dbws.OperationModel;
+import org.eclipse.persistence.tools.dbws.TableOperationModel;
+import org.eclipse.persistence.tools.dbws.WebServicePackager;
+import static org.eclipse.persistence.internal.xr.Util.SERVICE_NAMESPACE_PREFIX;
+import static org.eclipse.persistence.oxm.mappings.UnmarshalKeepAsElementPolicy.KEEP_UNKNOWN_AS_ELEMENT;
+import static org.eclipse.persistence.tools.dbws.DBWSBuilder.NO_SESSIONS_FILENAME;
+import static org.eclipse.persistence.tools.dbws.DBWSBuilder.SESSIONS_FILENAME_KEY;
+import static org.eclipse.persistence.tools.dbws.DBWSPackager.ArchiveUse.noArchive;
+import static org.eclipse.persistence.tools.dbws.XRPackager.__nullStream;
+
+//domain-specific (test) imports
+import static dbws.testing.DBWSTestSuite.DATABASE_PASSWORD_KEY;
+import static dbws.testing.DBWSTestSuite.DATABASE_URL_KEY;
+import static dbws.testing.DBWSTestSuite.DATABASE_USERNAME_KEY;
+import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_DRIVER;
+import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_PASSWORD;
+import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_PLATFORM;
+import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_URL;
+import static dbws.testing.DBWSTestSuite.DEFAULT_DATABASE_USERNAME;
+import static dbws.testing.DBWSTestSuite.SFAULT;
+import static dbws.testing.DBWSTestSuite.SFAULT_NAMESPACE;
+import static dbws.testing.DBWSTestSuite.SFAULT_PORT;
+import static dbws.testing.DBWSTestSuite.SFAULT_SERVICE;
+import static dbws.testing.DBWSTestSuite.SFAULT_SERVICE_NAMESPACE;
+import static dbws.testing.DBWSTestSuite.SFAULT_TEST;
+
+@WebServiceProvider(
+ targetNamespace = SFAULT_SERVICE_NAMESPACE,
+ serviceName = SFAULT_SERVICE,
+ portName = SFAULT_PORT
+)
+@ServiceMode(MESSAGE)
+public class UpdateFaultTestSuite extends ProviderHelper implements Provider<SOAPMessage> {
+
+ public static final String ENDPOINT_ADDRESS = "http://localhost:9999/" + SFAULT;
+ static final String SOAP_UPDATE_REQUEST =
+ "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
+ "<SOAP-ENV:Body>" +
+ "<srvc:update_sfault_tableType xmlns:srvc=\"" + SFAULT_SERVICE_NAMESPACE + "\" xmlns=\"" + SFAULT_NAMESPACE + "\">" +
+ "<srvc:theInstance>" +
+ "<sfault_tableType>" +
+ "<id>1</id>" +
+ // name field is too long for database column
+ "<name>abcdefghij</name>" +
+ "</sfault_tableType>" +
+ "</srvc:theInstance>" +
+ "</srvc:update_sfault_tableType>" +
+ "</SOAP-ENV:Body>" +
+ "</SOAP-ENV:Envelope>";
+
+ // JUnit test fixtures
+ public static ByteArrayOutputStream DBWS_SERVICE_STREAM = new ByteArrayOutputStream();
+ public static ByteArrayOutputStream DBWS_SCHEMA_STREAM = new ByteArrayOutputStream();
+ public static ByteArrayOutputStream DBWS_OR_STREAM = new ByteArrayOutputStream();
+ public static ByteArrayOutputStream DBWS_OX_STREAM = new ByteArrayOutputStream();
+ public static ByteArrayOutputStream DBWS_WSDL_STREAM = new ByteArrayOutputStream();
+ public static XMLComparer comparer = new XMLComparer();
+ public static XMLPlatform xmlPlatform = XMLPlatformFactory.getInstance().getXMLPlatform();
+ public static XMLParser xmlParser = xmlPlatform.newXMLParser();
+ public static Endpoint endpoint = null;
+ public static QName portQName = null;
+ public static Service testService = null;
+ public static DBWSBuilder builder = new DBWSBuilder();
+
+ @BeforeClass
+ public static void setUp() throws WSDLException {
+ String username = System.getProperty(DATABASE_USERNAME_KEY, DEFAULT_DATABASE_USERNAME);
+ String password = System.getProperty(DATABASE_PASSWORD_KEY, DEFAULT_DATABASE_PASSWORD);
+ String url = System.getProperty(DATABASE_URL_KEY, DEFAULT_DATABASE_URL);
+ builder.setProjectName(SFAULT_TEST);
+ builder.setTargetNamespace(SFAULT_NAMESPACE);
+ TableOperationModel sFaultOp = new TableOperationModel();
+ sFaultOp.additionalOperations = new ArrayList<OperationModel>();
+ sFaultOp.setName(SFAULT_TEST);
+ sFaultOp.setTablePattern(SFAULT);
+ builder.getOperations().add(sFaultOp);
+ builder.quiet = true;
+ builder.setLogLevel(SessionLog.FINE_LABEL);
+ builder.setDriver(DEFAULT_DATABASE_DRIVER);
+ builder.setPlatformClassname(DEFAULT_DATABASE_PLATFORM);
+ builder.getProperties().put(SESSIONS_FILENAME_KEY, NO_SESSIONS_FILENAME);
+ builder.setUsername(username);
+ builder.setPassword(password);
+ builder.setUrl(url);
+ builder.setPackager(new WebServicePackager(null, "WebServiceTestPackager", noArchive) {
+ @Override
+ public void start() {
+ }
+ });
+ builder.build(DBWS_SCHEMA_STREAM, __nullStream, DBWS_SERVICE_STREAM, DBWS_OR_STREAM,
+ DBWS_OX_STREAM, __nullStream, __nullStream, DBWS_WSDL_STREAM, __nullStream,
+ __nullStream, null);
+ endpoint = Endpoint.create(new UpdateFaultTestSuite());
+ endpoint.publish(ENDPOINT_ADDRESS);
+ QName serviceQName = new QName(SFAULT_SERVICE_NAMESPACE, SFAULT_SERVICE);
+ portQName = new QName(SFAULT_SERVICE_NAMESPACE, SFAULT_PORT);
+ testService = Service.create(serviceQName);
+ testService.addPort(portQName, SOAP11HTTP_BINDING, ENDPOINT_ADDRESS);
+ }
+
+ @AfterClass
+ public static void teardown() {
+ if (endpoint != null) {
+ endpoint.stop();
+ }
+ }
+
+ @PreDestroy
+ public void destroy() {
+ super.destroy();
+ }
+
+ @PostConstruct
+ @SuppressWarnings("serial")
+ public void init() {
+ parentClassLoader = new BaseEntityClassLoader(Thread.currentThread().getContextClassLoader());
+ InputStream xrServiceStream = new ByteArrayInputStream(DBWS_SERVICE_STREAM.toByteArray());
+ DBWSModelProject xrServiceModelProject = new DBWSModelProject();
+ XMLContext xmlContext = new XMLContext(xrServiceModelProject);
+ XMLUnmarshaller unmarshaller = xmlContext.createUnmarshaller();
+ XRServiceModel dbwsModel = null;
+ try {
+ dbwsModel = (XRServiceModel)unmarshaller.unmarshal(xrServiceStream);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ xrSchemaStream = new ByteArrayInputStream(DBWS_SCHEMA_STREAM.toByteArray());
+ buildService(dbwsModel);
+
+ // the xrService built by 'buildService' above is overridden to produce an
+ // instance of DBWSAdapter (a sub-class of XRService)
+ DBWSAdapter dbwsAdapter = (DBWSAdapter)xrService;
+
+ // get inline schema from WSDL - has additional types for the operations
+ StringWriter sw = new StringWriter();
+ InputStream wsdlInputStream = new ByteArrayInputStream(DBWS_WSDL_STREAM.toByteArray());
+ try {
+ StreamSource wsdlStreamSource = new StreamSource(wsdlInputStream);
+ Transformer t = TransformerFactory.newInstance().newTransformer(new StreamSource(
+ new StringReader(MATCH_SCHEMA)));
+ StreamResult streamResult = new StreamResult(sw);
+ t.transform(wsdlStreamSource, streamResult);
+ sw.toString();
+ wsdlInputStream.close();
+ SchemaModelProject schemaProject = new SchemaModelProject();
+ XMLContext xmlContext2 = new XMLContext(schemaProject);
+ unmarshaller = xmlContext2.createUnmarshaller();
+ Schema extendedSchema = (Schema)unmarshaller.unmarshal(new StringReader(sw.toString()));
+ dbwsAdapter.setExtendedSchema(extendedSchema);
+ }
+ catch (Exception e) {
+ // that's Ok, WSDL may not contain inline schema
+ }
+
+ String tns = dbwsAdapter.getExtendedSchema().getTargetNamespace();
+ Project oxProject = dbwsAdapter.getOXSession().getProject();
+ XMLDescriptor invocationDescriptor = new XMLDescriptor();
+ invocationDescriptor.setJavaClass(Invocation.class);
+ NamespaceResolver nr = new NamespaceResolver();
+ invocationDescriptor.setNamespaceResolver(nr);
+ nr.setDefaultNamespaceURI(tns);
+ nr.put(SERVICE_NAMESPACE_PREFIX, tns);
+ XMLAnyCollectionMapping parametersMapping = new XMLAnyCollectionMapping();
+ parametersMapping.setAttributeName("parameters");
+ parametersMapping.setAttributeAccessor(new AttributeAccessor() {
+ Project oxProject;
+ DBWSAdapter dbwsAdapter;
+ @Override
+ public Object getAttributeValueFromObject(Object object) {
+ return ((Invocation)object).getParameters();
+ }
+ @SuppressWarnings("unchecked")
+ @Override
+ public void setAttributeValueInObject(Object object, Object value) {
+ Invocation invocation = (Invocation)object;
+ Vector values = (Vector)value;
+ for (Iterator i = values.iterator(); i.hasNext();) {
+ /* scan through values:
+ * if XML conforms to something mapped, it an object; else it is a DOM Element
+ * (probably a scalar). Walk through operations for the types, converting
+ * as required. The 'key' is the local name of the element - for mapped objects,
+ * have to get the element name from the schema context for the object
+ */
+ Object o = i.next();
+ if (o instanceof Element) {
+ Element e = (Element)o;
+ String key = e.getLocalName();
+ if ("theInstance".equals(key)) {
+ NodeList nl = e.getChildNodes();
+ for (int j = 0; j < nl.getLength(); j++) {
+ Node n = nl.item(j);
+ if (n.getNodeType() == Node.ELEMENT_NODE) {
+ try {
+ Object theInstance =
+ dbwsAdapter.getXMLContext().createUnmarshaller().unmarshal(n);
+ if (theInstance instanceof XMLRoot) {
+ theInstance = ((XMLRoot)theInstance).getObject();
+ }
+ invocation.setParameter(key, theInstance);
+ break;
+ }
+ catch (XMLMarshalException xmlMarshallException) {
+ throw new WebServiceException(xmlMarshallException);
+ }
+ }
+ }
+ }
+ else {
+ ClassDescriptor desc = null;
+ for (XMLDescriptor xdesc : (Vector<XMLDescriptor>)oxProject.getOrderedDescriptors()) {
+ XMLSchemaReference schemaReference = xdesc.getSchemaReference();
+ if (schemaReference != null &&
+ schemaReference.getSchemaContext().equalsIgnoreCase(key)) {
+ desc = xdesc;
+ break;
+ }
+ }
+ if (desc != null) {
+ try {
+ Object theObject =
+ dbwsAdapter.getXMLContext().createUnmarshaller().unmarshal(e,
+ desc.getJavaClass());
+ if (theObject instanceof XMLRoot) {
+ theObject = ((XMLRoot)theObject).getObject();
+ }
+ invocation.setParameter(key, theObject);
+ }
+ catch (XMLMarshalException xmlMarshallException) {
+ throw new WebServiceException(xmlMarshallException);
+ }
+ }
+ else {
+ String serviceName = e.getParentNode().getLocalName();
+ boolean found = false;
+ for (Operation op : dbwsAdapter.getOperationsList()) {
+ if (op.getName().equals(serviceName)) {
+ for (Parameter p : op.getParameters()) {
+ if (p.getName().equals(key)) {
+ desc = dbwsAdapter.getDescriptorsByQName().get(p.getType());
+ if (desc != null) {
+ found = true;
+ }
+ break;
+ }
+ }
+ }
+ if (found) {
+ break;
+ }
+ }
+ if (found) {
+ Object theObject =
+ dbwsAdapter.getXMLContext().createUnmarshaller().unmarshal(e,
+ desc.getJavaClass());
+ if (theObject instanceof XMLRoot) {
+ theObject = ((XMLRoot)theObject).getObject();
+ }
+ invocation.setParameter(key, theObject);
+ }
+ else {
+ String val = e.getTextContent();
+ invocation.setParameter(key, val);
+ }
+ }
+ }
+ }
+ else {
+ XMLDescriptor descriptor = (XMLDescriptor)oxProject.getDescriptor(o.getClass());
+ String key = descriptor.getDefaultRootElement();
+ int idx = key.indexOf(':');
+ if (idx != -1) {
+ key = key.substring(idx+1);
+ }
+ invocation.setParameter(key, o);
+ }
+ }
+ }
+ public AttributeAccessor setProjectAndAdapter(Project oxProject, DBWSAdapter dbwsAdapter) {
+ this.oxProject = oxProject;
+ this.dbwsAdapter = dbwsAdapter;
+ return this;
+ }
+ }.setProjectAndAdapter(oxProject, dbwsAdapter));
+ parametersMapping.setKeepAsElementPolicy(KEEP_UNKNOWN_AS_ELEMENT);
+ invocationDescriptor.addMapping(parametersMapping);
+ oxProject.addDescriptor(invocationDescriptor);
+ ((DatabaseSessionImpl)dbwsAdapter.getOXSession()).initializeDescriptorIfSessionAlive(invocationDescriptor);
+ dbwsAdapter.getXMLContext().storeXMLDescriptorByQName(invocationDescriptor);
+
+ // create SOAP message response handler
+ responseWriter = new SOAPResponseWriter(dbwsAdapter);
+ responseWriter.initialize();
+ }
+
+ @Override
+ public void logoutSessions() {
+ if (xrService.getORSession() != null) {
+ ((DatabaseSession)xrService.getORSession()).logout();
+ }
+ if (xrService.getOXSession() != null) {
+ ((DatabaseSession)xrService.getOXSession()).logout();
+ }
+ }
+
+ @Override
+ public void buildSessions() {
+ Project oxProject = XMLProjectReader.read(new StringReader(DBWS_OX_STREAM.toString()),
+ parentClassLoader);
+ ((XMLLogin)oxProject.getDatasourceLogin()).setEqualNamespaceResolvers(false);
+ Project orProject = XMLProjectReader.read(new StringReader(DBWS_OR_STREAM.toString()),
+ parentClassLoader);
+ DatasourceLogin login = orProject.getLogin();
+ login.setUserName(builder.getUsername());
+ login.setPassword(builder.getPassword());
+ ((DatabaseLogin)login).setConnectionString(builder.getUrl());
+ ((DatabaseLogin)login).setDriverClassName(DEFAULT_DATABASE_DRIVER);
+ Platform platform = builder.getDatabasePlatform();
+ ConversionManager cm = platform.getConversionManager();
+ cm.setLoader(parentClassLoader);
+ login.setDatasourcePlatform(platform);
+ ((DatabaseLogin)login).bindAllParameters();
+ orProject.setDatasourceLogin(login);
+ ProjectHelper.fixOROXAccessors(orProject, oxProject);
+ DatabaseSession databaseSession = orProject.createDatabaseSession();
+ databaseSession.dontLogMessages();
+ xrService.setORSession(databaseSession);
+ xrService.setXMLContext(new XMLContext(oxProject));
+ xrService.setOXSession(xrService.getXMLContext().getSession(0));
+ }
+
+ @Test
+ public void soapFault() throws SOAPException, IOException, SAXException,
+ ParserConfigurationException, TransformerException {
+ MessageFactory factory = MessageFactory.newInstance();
+ SOAPMessage request = factory.createMessage();
+ SOAPPart part = request.getSOAPPart();
+ DOMSource domSource = new DOMSource(getDocumentBuilder().parse(
+ new InputSource(new StringReader(SOAP_UPDATE_REQUEST))));
+ part.setContent(domSource);
+ Dispatch<SOAPMessage> dispatch = testService.createDispatch(portQName, SOAPMessage.class,
+ Service.Mode.MESSAGE);
+ @SuppressWarnings("unused")
+ SOAPMessage response = null;
+ try {
+ response = dispatch.invoke(request);
+ }
+ catch (SOAPFaultException sfe) {
+ assertTrue("incorrect SOAPFaultException",
+ sfe.getMessage().contains("Data too long for column 'NAME'"));
+ }
+ }
+}
\ No newline at end of file