### Eclipse Workspace Patch 1.0 #P connector-salesforce Index: src/main/java/org/teiid/resource/adapter/salesforce/SalesforceHandlerResolver.java =================================================================== --- src/main/java/org/teiid/resource/adapter/salesforce/SalesforceHandlerResolver.java (revision 0) +++ src/main/java/org/teiid/resource/adapter/salesforce/SalesforceHandlerResolver.java (revision 0) @@ -0,0 +1,85 @@ +package org.teiid.resource.adapter.salesforce; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import javax.xml.namespace.QName; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPEnvelope; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPHeader; +import javax.xml.soap.SOAPHeaderElement; +import javax.xml.soap.SOAPMessage; +import javax.xml.soap.SOAPPart; +import javax.xml.ws.handler.Handler; +import javax.xml.ws.handler.HandlerResolver; +import javax.xml.ws.handler.MessageContext; +import javax.xml.ws.handler.PortInfo; +import javax.xml.ws.handler.soap.SOAPHandler; +import javax.xml.ws.handler.soap.SOAPMessageContext; + +import com.sforce.soap.partner.SessionHeader; + +/* Handler which adds the SessionId info to the SOAP Header + * + */ +class SalesforceHandlerResolver implements HandlerResolver { + + private SalesforceHeaderHandler headerHandler = null; + + public SalesforceHandlerResolver(SessionHeader sh) { + this.headerHandler = new SalesforceHeaderHandler(sh); + } + + public List getHandlerChain(PortInfo portInfo) { + List handlerChain = new ArrayList(); + + handlerChain.add(this.headerHandler); + + return handlerChain; + } + + class SalesforceHeaderHandler implements SOAPHandler { + + SessionHeader sh = null; + + public SalesforceHeaderHandler(SessionHeader sh) { + this.sh = sh; + } + + public boolean handleMessage(SOAPMessageContext smc) { + QName sessionHeader = new QName("urn:partner.soap.sforce.com", "SessionHeader"); //$NON-NLS-1$ //$NON-NLS-2$ + QName sessionId = new QName("urn:partner.soap.sforce.com", "sessionId"); + try { + // If the SessionHeader is null, or the session id is null - do nothing. + if (sh!=null && sh.getSessionId()!=null) { + SOAPMessage message = smc.getMessage(); + SOAPPart part = message.getSOAPPart(); + SOAPEnvelope envelope = part.getEnvelope(); + SOAPHeader header = envelope.getHeader(); + if (header == null) header = envelope.addHeader(); + SOAPHeaderElement sessionHeaderElement = header.addHeaderElement(sessionHeader); + SOAPElement sessionIdElement = sessionHeaderElement.addChildElement(sessionId); + sessionIdElement.addTextNode(sh.getSessionId()); + } + + } catch (SOAPException e) { + e.printStackTrace(); + return false; + } + return true; + } + + public Set getHeaders() { + return null; + } + + public boolean handleFault(SOAPMessageContext context) { + return true; + } + + public void close(MessageContext context) { + } + } +} Index: src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnectionImpl.java =================================================================== --- src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnectionImpl.java (revision 3443) +++ src/main/java/org/teiid/resource/adapter/salesforce/SalesforceConnectionImpl.java (working copy) @@ -29,6 +29,9 @@ import javax.resource.ResourceException; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.ws.BindingProvider; +import javax.xml.ws.handler.Handler; +import javax.xml.ws.handler.HandlerResolver; +import javax.xml.ws.handler.PortInfo; import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; @@ -82,7 +85,7 @@ String getUserName() throws ResourceException { try { - return sfSoap.getUserInfo(sh).getUserName(); + return sfSoap.getUserInfo().getUserName(); } catch (com.sforce.soap.partner.UnexpectedErrorFault e) { throw new ResourceException(e); } @@ -110,9 +113,17 @@ BusFactory.setThreadDefaultBus(mcf.getBus()); try { sfService = new SforceService(); + sh = new SessionHeader(); + + // Session Id must be passed in soapHeader - add the handler + sfService.setHandlerResolver(new SalesforceHandlerResolver(sh)); + sfSoap = sfService.getSoap(); ((BindingProvider)sfSoap).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toExternalForm()); loginResult = sfSoap.login(username, password); + + // Set the SessionId after login, for subsequent calls + sh.setSessionId(loginResult.getSessionId()); } catch (LoginFault e) { throw new ResourceException(e); } catch (InvalidIdFault e) { @@ -123,9 +134,7 @@ BusFactory.setThreadDefaultBus(bus); } LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Login was successful for username " + username); //$NON-NLS-1$ - - sh = new SessionHeader(); - sh.setSessionId(loginResult.getSessionId()); + // Reset the SOAP endpoint to the returned server URL ((BindingProvider)sfSoap).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,loginResult.getServerUrl()); // or maybe org.apache.cxf.message.Message.ENDPOINT_ADDRESS @@ -136,7 +145,7 @@ // Test the connection. try { - sfSoap.getUserInfo(sh); + sfSoap.getUserInfo(); } catch (com.sforce.soap.partner.UnexpectedErrorFault e) { throw new ResourceException(e); } @@ -150,7 +159,7 @@ result = false; } else { try { - sfSoap.getServerTimestamp(sh); + sfSoap.getServerTimestamp(); } catch (Throwable t) { LogManager.logTrace(LogConstants.CTX_CONNECTOR, "Caught Throwable in isAlive", t); //$NON-NLS-1$ result = false; @@ -171,12 +180,12 @@ qo.setBatchSize(batchSize); try { if(queryAll != null && queryAll) { - qr = sfSoap.queryAll(queryString, sh); + qr = sfSoap.queryAll(queryString); } else { MruHeader mruHeader = partnerFactory.createMruHeader(); mruHeader.setUpdateMru(false); - qr = sfSoap.query(queryString, sh); + qr = sfSoap.query(queryString); } } catch (InvalidFieldFault e) { throw new ResourceException(e); @@ -198,7 +207,7 @@ QueryOptions qo = partnerFactory.createQueryOptions(); qo.setBatchSize(batchSize); try { - return sfSoap.queryMore(queryLocator, sh); + return sfSoap.queryMore(queryLocator); } catch (InvalidFieldFault e) { throw new ResourceException(e); } catch (com.sforce.soap.partner.UnexpectedErrorFault e) { @@ -212,7 +221,7 @@ public int delete(String[] ids) throws ResourceException { List results = null; try { - results = sfSoap.delete(Arrays.asList(ids), sh); + results = sfSoap.delete(Arrays.asList(ids)); } catch (com.sforce.soap.partner.UnexpectedErrorFault e) { throw new ResourceException(e); } @@ -250,7 +259,7 @@ objects.add(toCreate); List result; try { - result = sfSoap.create(objects, sh); + result = sfSoap.create(objects); } catch (InvalidFieldFault e) { throw new ResourceException(e); } catch (com.sforce.soap.partner.InvalidSObjectFault e) { @@ -275,7 +284,7 @@ } List result; try { - result = sfSoap.update(params, sh); + result = sfSoap.update(params); } catch (InvalidFieldFault e) { throw new ResourceException(e); } catch (com.sforce.soap.partner.InvalidSObjectFault e) { @@ -300,7 +309,7 @@ public UpdatedResult getUpdated(String objectType, XMLGregorianCalendar startDate, XMLGregorianCalendar endDate) throws ResourceException { GetUpdatedResult updated; try { - updated = sfSoap.getUpdated(objectType, startDate, endDate, sh); + updated = sfSoap.getUpdated(objectType, startDate, endDate); } catch (com.sforce.soap.partner.InvalidSObjectFault e) { throw new ResourceException(e); } catch (com.sforce.soap.partner.UnexpectedErrorFault e) { @@ -316,7 +325,7 @@ XMLGregorianCalendar endCalendar) throws ResourceException { GetDeletedResult deleted; try { - deleted = sfSoap.getDeleted(objectName, startCalendar, endCalendar, sh); + deleted = sfSoap.getDeleted(objectName, startCalendar, endCalendar); } catch (com.sforce.soap.partner.InvalidSObjectFault e) { throw new ResourceException(e); } catch (com.sforce.soap.partner.UnexpectedErrorFault e) { @@ -342,7 +351,7 @@ public QueryResult retrieve(String fieldList, String sObjectType, List ids) throws ResourceException { try { - List objects = sfSoap.retrieve(fieldList, sObjectType, ids, sh); + List objects = sfSoap.retrieve(fieldList, sObjectType, ids); QueryResult result = new QueryResult(); for (SObject sObject : objects) { if (sObject != null) { @@ -368,7 +377,7 @@ public DescribeGlobalResult getObjects() throws ResourceException { try { - return sfSoap.describeGlobal(sh); + return sfSoap.describeGlobal(); } catch (com.sforce.soap.partner.UnexpectedErrorFault e) { throw new ResourceException(e); } @@ -376,7 +385,7 @@ public DescribeSObjectResult getObjectMetaData(String objectName) throws ResourceException { try { - return sfSoap.describeSObject(objectName, sh); + return sfSoap.describeSObject(objectName); } catch (com.sforce.soap.partner.InvalidSObjectFault e) { throw new ResourceException(e); } catch (com.sforce.soap.partner.UnexpectedErrorFault e) { @@ -392,6 +401,5 @@ @Override public boolean isAlive() { return isValid(); - } - + } }