Sunday, November 15, 2009

groovyws with soap header mods for security


import groovyx.net.ws.WSClient
import groovyx.net.ws.cxf.SoapVersion
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import javax.xml.namespace.QName;

String WSDL_URL ="file:///C:/project/wsdl/CU_SCHOOL_COURSES_CI%20WSDL.xml";

@Grab(group='org.codehaus.groovy.modules', module='groovyws', version='0.5.0-SNAPSHOT')
def getProxy(wsdl, classLoader) {
  new WSClient(wsdl, classLoader)
}

proxy = getProxy( WSDL_URL, this.class.classLoader)
proxy.initialize()
proxy.setPreferredSoapVersion(SoapVersion.SOAP_1_1)

def ci =  proxy.create("com.peoplesoft.cu_school_courses_ci.FindCompIntfcCUSCHOOLCOURSESCITypeShape")
def orgId = proxy.create("com.peoplesoft.cu_school_courses_ci.EXTORGIDTypeShape")
def subj = proxy.create("com.peoplesoft.cu_school_courses_ci.SCHOOLSUBJECTTypeShape")

subj.value="ADM";
orgId.value="1132700";
ci.EXTORGID=orgId;
ci.SCHOOLSUBJECT=subj;

proxy.client.getInInterceptors().add(new LoggingInInterceptor())
proxy.client.getOutInterceptors().add(new HeaderInInterceptor(proxy))
proxy.client.getOutInterceptors().add(new LoggingOutInterceptor())

QName q = new  QName("http://peoplesoft.com/CU_SCHOOL_COURSES_CI","Find__CompIntfc__CU_SCHOOL_COURSES_CI");
result = proxy.client.invokeWrapped(q,ci)
println result.length




//////////////////////////////////



import java.util.List;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;
import org.apache.cxf.headers.Header;
import javax.xml.namespace.QName;
import org.apache.cxf.jaxb.JAXBDataBinding;


public class HeaderInInterceptor extends SoapPreProtocolOutInterceptor {
    Object security;

    public HeaderInInterceptor(Object proxy) {
        super();//Phase.POST_LOGICAL);
       
        def security = proxy.create("org.xmlsoap.schemas.ws._2002.xx.secext.SecurityTypeShape");
        def usernameToken = proxy.create("org.xmlsoap.schemas.ws._2002.xx.secext.UsernameTokenTypeShape");
        def username = proxy.create("org.xmlsoap.schemas.ws._2002.xx.secext.UsernameTypeShape");
        def password = proxy.create("org.xmlsoap.schemas.ws._2002.xx.secext.PasswordTypeShape");

        password.value="myPassword";
        username.value="myUser";
        usernameToken.username=username;
        usernameToken.password=password;
        security.usernameToken=usernameToken;
        this.security= security;
       
    }

   
/*
 <scx:Security xmlns:scx="http://schemas.xmlsoap.org/ws/2002/xx/secext">
      <scx:UsernameToken>
        <scx:Username>USERNAME</scx:Username>
        <scx:Password>PASSWORD</scx:Password>
      </scx:UsernameToken>
    </scx:Security>
*/

    public void handleMessage(SoapMessage message) throws Fault {
       
        def list =message.getHeaders();
       
        QName q = new  QName("http://schemas.xmlsoap.org/ws/2002/xx/secext","Security","scx");
         
        Header hdr = new Header( q,   security,  new JAXBDataBinding(security.getClass()));

        list.add(hdr)
           
    }
   
   
}

1 comment:

Unknown said...

I continually receive an exception at the following line:

def security = proxy.create("org.xmlsoap.schemas.ws._2002.xx.secext.SecurityTypeShape");


java.lang.NullPointerException
at groovyx.net.ws.AbstractCXFWSClient.create(AbstractCXFWSClient.java:164)
at groovyx.net.ws.AbstractCXFWSClient$create.call(Unknown Source)
at HeaderInInterceptor.(HeaderInInterceptor.groovy:16)
at RmsWebServiceClient.rmsAccountSearch(RmsWebServiceClient.groovy:52)
at RmsWebServiceClient$rmsAccountSearch.call(Unknown Source)
at TradingPartnerProfileController$_closure12.doCall(TradingPartnerProfileController:141)
at TradingPartnerProfileController$_closure12.doCall(TradingPartnerProfileController)
at java.lang.Thread.run(Thread.java:619)


Ideas