Getting an EndPoint to Add Interceptor

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Getting an EndPoint to Add Interceptor

George S.
I apologize for the really basic level of my question. I've looked at
the docs and I'm really not figuring out how to do this. I'm adapting
some code:

import javax.xml.ws.Service;

URL wsdlLocation =new  URL(WS_URL);
QName serviceQName =new  QName(namespace, serviceName);
QName portQName =new  QName(namespace, portName);
Service service = Service.create(wsdlLocation, serviceQName);

and I'm desperately trying to figure out how to get an Endpoint so I can
add an Interceptor. If I have the service ( which from looking at the
code for javax.xml.ws.Service is created by a Provider()), how can I get
to the endpoint?

I've looked at:

http://cxf.apache.org/docs/ws-security.html

and in the section labelled "Adding the interceptors via the API", the
example shows passing in a "myServiceImpl".

What are the steps to go through for creation of a "myServiceImpl"? What
are class is "myServiceImpl", and how is one obtained?

Again, I apologize if these questions for the basic nature of my questions.



--
George S.
*MH Software, Inc.*
Voice: 303 438 9585
http://www.mhsoftware.com
Reply | Threaded
Open this post in threaded view
|

Re: Getting an EndPoint to Add Interceptor

coheigea
Administrator
If you want to add an interceptor on the client side, you can do something
like:

Service service = Service.create(wsdlLocation, serviceQName);
PortType port = service.getPort(portQName, PortType.class);
Client cxfClient = ClientProxy.getClient(port);
cxfClient.getOutInterceptors().add(...)

Here's an example:

https://github.com/apache/cxf/blob/dcae47fac2c0e22994572e6744852070737223e5/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/ut/UsernameTokenTest.java#L439

Colm.

On Thu, Feb 1, 2018 at 9:07 PM, George S. <[hidden email]> wrote:

> I apologize for the really basic level of my question. I've looked at the
> docs and I'm really not figuring out how to do this. I'm adapting some code:
>
> import javax.xml.ws.Service;
>
> URL wsdlLocation =new  URL(WS_URL);
> QName serviceQName =new  QName(namespace, serviceName);
> QName portQName =new  QName(namespace, portName);
> Service service = Service.create(wsdlLocation, serviceQName);
>
> and I'm desperately trying to figure out how to get an Endpoint so I can
> add an Interceptor. If I have the service ( which from looking at the code
> for javax.xml.ws.Service is created by a Provider()), how can I get to the
> endpoint?
>
> I've looked at:
>
> http://cxf.apache.org/docs/ws-security.html
>
> and in the section labelled "Adding the interceptors via the API", the
> example shows passing in a "myServiceImpl".
>
> What are the steps to go through for creation of a "myServiceImpl"? What
> are class is "myServiceImpl", and how is one obtained?
>
> Again, I apologize if these questions for the basic nature of my questions.
>
>
>
> --
> George S.
> *MH Software, Inc.*
> Voice: 303 438 9585
> http://www.mhsoftware.com
>



--
Colm O hEigeartaigh

Talend Community Coder
http://coders.talend.com
Reply | Threaded
Open this post in threaded view
|

Re: Getting an EndPoint to Add Interceptor

George S.
Would you mind giving me a few pointers? I'm trying things out. I'm told
(I can't run it myself) that the message is not getting signed. I'm
probably doing something really dumb, but if you could help I would
appreciate it. Here's my code:

try  {
     MessageFactory mf = MessageFactory.newInstance();
     SOAPMessage reqMesg = mf.createMessage();
     SOAPMessage response;// = mf.createMessage();
     toSOAPElement(notifyDocketingCompleteRequest, reqMesg);

     String  namespace = cfgProps.getProperty("efm.namespace","");
     String  serviceName = cfgProps.getProperty("efm.serviceName","");
     String  portName = cfgProps.getProperty("efm.portName","");
     String  methodName = cfgProps.getProperty("efm.methodName.nDC","");
     String  endpointAddress = cfgProps.getProperty("efm.stageEndpointAddress","");
     String  WS_URL = cfgProps.getProperty("efm.stageWS_URL","");

     URL wsdlLocation =new  URL(WS_URL);
     QName serviceQName =new  QName(namespace, serviceName);
     QName portQName =new  QName(namespace, portName);

     Service service = Service.create(wsdlLocation, serviceQName);
     PortType port=service.getPort(portQName,PortType.class);

     Map<String,Object> interceptorProperties=new  HashMap<>();
     interceptorProperties.put(WSHandlerConstants.ACTION,"Signature");
     interceptorProperties.put(WSHandlerConstants.SIG_PROP_FILE,"client_sign.properties");

     WSS4JOutInterceptor interceptor=new  WSS4JOutInterceptor(interceptorProperties);

     Client cxfClient=ClientProxy.getClient(port);
     cxfClient.getOutInterceptors().add(interceptor);

     Dispatch<SOAPMessage> dispatch = service.createDispatch(portQName, SOAPMessage.class, Service.Mode.MESSAGE);

     BindingProvider bp = (BindingProvider) dispatch;
     SOAPBinding binding = (SOAPBinding) bp.getBinding();
     bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointAddress);
     binding.setMTOMEnabled(true);

     List<Handler> handlerChain =new  ArrayList<Handler>();
     p.ClientLogicalHandler cAuth =new  p.ClientLogicalHandler();
     p.EnvelopeLoggingSOAPHandler logging =new  p.EnvelopeLoggingSOAPHandler();
     handlerChain.add(cAuth);
     handlerChain.add(logging);
     binding.setHandlerChain(handlerChain);
     // Put it all in the context object
     Map<String,Object> myContext = bp.getRequestContext();

     response = dispatch.invoke(reqMesg);
     ElementNSImpl myResponseElement = (ElementNSImpl) response.getSOAPBody();

     return  myResponseElement;

}  catch  (SOAPException e1){
     e1.printStackTrace();
}  catch  (SOAPFaultException e1){
     SOAPFault fault = e1.getFault();
     e1.printStackTrace();
     return  fault;
}  catch  (Exception wse){
     String  errResponse = wse.getMessage();
     wse.printStackTrace();
     System.out.println(wse);
     Object  response = errResponse;
     return  response;
}


On 2/2/2018 2:55 AM, Colm O hEigeartaigh wrote:

> If you want to add an interceptor on the client side, you can do something
> like:
>
> Service service = Service.create(wsdlLocation, serviceQName);
> PortType port = service.getPort(portQName, PortType.class);
> Client cxfClient = ClientProxy.getClient(port);
> cxfClient.getOutInterceptors().add(...)
>
> Here's an example:
>
> https://github.com/apache/cxf/blob/dcae47fac2c0e22994572e6744852070737223e5/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/ut/UsernameTokenTest.java#L439
>
> Colm.
>
> On Thu, Feb 1, 2018 at 9:07 PM, George S. <[hidden email]> wrote:
>
>> I apologize for the really basic level of my question. I've looked at the
>> docs and I'm really not figuring out how to do this. I'm adapting some code:
>>
>> import javax.xml.ws.Service;
>>
>> URL wsdlLocation =new  URL(WS_URL);
>> QName serviceQName =new  QName(namespace, serviceName);
>> QName portQName =new  QName(namespace, portName);
>> Service service = Service.create(wsdlLocation, serviceQName);
>>
>> and I'm desperately trying to figure out how to get an Endpoint so I can
>> add an Interceptor. If I have the service ( which from looking at the code
>> for javax.xml.ws.Service is created by a Provider()), how can I get to the
>> endpoint?
>>
>> I've looked at:
>>
>> http://cxf.apache.org/docs/ws-security.html
>>
>> and in the section labelled "Adding the interceptors via the API", the
>> example shows passing in a "myServiceImpl".
>>
>> What are the steps to go through for creation of a "myServiceImpl"? What
>> are class is "myServiceImpl", and how is one obtained?
>>
>> Again, I apologize if these questions for the basic nature of my questions.
>>
>>
>>
>> --
>> George S.
>> *MH Software, Inc.*
>> Voice: 303 438 9585
>> http://www.mhsoftware.com
>>
>
>

--
George S.
*MH Software, Inc.*
Voice: 303 438 9585
http://www.mhsoftware.com
Reply | Threaded
Open this post in threaded view
|

Re: Getting an EndPoint to Add Interceptor

coheigea
Administrator
Using the Dispatch API can be tricky. I haven't tried it with SOAPMessage,
so I'm not sure if WS-Security works there or not. I've added two examples
though to show how to use the Dispatch API with Signature using payload:

https://github.com/apache/cxf/blob/5d67785208334062a950dc7f85ffcb7d52af3db5/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/action/ActionTest.java#L492

and message:

https://github.com/apache/cxf/blob/5d67785208334062a950dc7f85ffcb7d52af3db5/systests/ws-security/src/test/java/org/apache/cxf/systest/ws/action/ActionTest.java#L534

Colm.

On Tue, Feb 6, 2018 at 8:13 PM, George S. <[hidden email]> wrote:

> Would you mind giving me a few pointers? I'm trying things out. I'm told
> (I can't run it myself) that the message is not getting signed. I'm
> probably doing something really dumb, but if you could help I would
> appreciate it. Here's my code:
>
> try  {
>     MessageFactory mf = MessageFactory.newInstance();
>     SOAPMessage reqMesg = mf.createMessage();
>     SOAPMessage response;// = mf.createMessage();
>     toSOAPElement(notifyDocketingCompleteRequest, reqMesg);
>
>     String  namespace = cfgProps.getProperty("efm.namespace","");
>     String  serviceName = cfgProps.getProperty("efm.serviceName","");
>     String  portName = cfgProps.getProperty("efm.portName","");
>     String  methodName = cfgProps.getProperty("efm.methodName.nDC","");
>     String  endpointAddress = cfgProps.getProperty("efm.stag
> eEndpointAddress","");
>     String  WS_URL = cfgProps.getProperty("efm.stageWS_URL","");
>
>     URL wsdlLocation =new  URL(WS_URL);
>     QName serviceQName =new  QName(namespace, serviceName);
>     QName portQName =new  QName(namespace, portName);
>
>     Service service = Service.create(wsdlLocation, serviceQName);
>     PortType port=service.getPort(portQName,PortType.class);
>
>     Map<String,Object> interceptorProperties=new  HashMap<>();
>     interceptorProperties.put(WSHandlerConstants.ACTION,"Signature");
>     interceptorProperties.put(WSHandlerConstants.SIG_PROP_FILE,"
> client_sign.properties");
>
>     WSS4JOutInterceptor interceptor=new  WSS4JOutInterceptor(intercepto
> rProperties);
>
>     Client cxfClient=ClientProxy.getClient(port);
>     cxfClient.getOutInterceptors().add(interceptor);
>
>     Dispatch<SOAPMessage> dispatch = service.createDispatch(portQName,
> SOAPMessage.class, Service.Mode.MESSAGE);
>
>     BindingProvider bp = (BindingProvider) dispatch;
>     SOAPBinding binding = (SOAPBinding) bp.getBinding();
>     bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
> endpointAddress);
>     binding.setMTOMEnabled(true);
>
>     List<Handler> handlerChain =new  ArrayList<Handler>();
>     p.ClientLogicalHandler cAuth =new  p.ClientLogicalHandler();
>     p.EnvelopeLoggingSOAPHandler logging =new
> p.EnvelopeLoggingSOAPHandler();
>     handlerChain.add(cAuth);
>     handlerChain.add(logging);
>     binding.setHandlerChain(handlerChain);
>     // Put it all in the context object
>     Map<String,Object> myContext = bp.getRequestContext();
>
>     response = dispatch.invoke(reqMesg);
>     ElementNSImpl myResponseElement = (ElementNSImpl)
> response.getSOAPBody();
>
>     return  myResponseElement;
>
> }  catch  (SOAPException e1){
>     e1.printStackTrace();
> }  catch  (SOAPFaultException e1){
>     SOAPFault fault = e1.getFault();
>     e1.printStackTrace();
>     return  fault;
> }  catch  (Exception wse){
>     String  errResponse = wse.getMessage();
>     wse.printStackTrace();
>     System.out.println(wse);
>     Object  response = errResponse;
>     return  response;
> }
>
>
> On 2/2/2018 2:55 AM, Colm O hEigeartaigh wrote:
>
>> If you want to add an interceptor on the client side, you can do something
>> like:
>>
>> Service service = Service.create(wsdlLocation, serviceQName);
>> PortType port = service.getPort(portQName, PortType.class);
>> Client cxfClient = ClientProxy.getClient(port);
>> cxfClient.getOutInterceptors().add(...)
>>
>> Here's an example:
>>
>> https://github.com/apache/cxf/blob/dcae47fac2c0e22994572e674
>> 4852070737223e5/systests/ws-security/src/test/java/org/apach
>> e/cxf/systest/ws/ut/UsernameTokenTest.java#L439
>>
>> Colm.
>>
>> On Thu, Feb 1, 2018 at 9:07 PM, George S. <[hidden email]> wrote:
>>
>> I apologize for the really basic level of my question. I've looked at the
>>> docs and I'm really not figuring out how to do this. I'm adapting some
>>> code:
>>>
>>> import javax.xml.ws.Service;
>>>
>>> URL wsdlLocation =new  URL(WS_URL);
>>> QName serviceQName =new  QName(namespace, serviceName);
>>> QName portQName =new  QName(namespace, portName);
>>> Service service = Service.create(wsdlLocation, serviceQName);
>>>
>>> and I'm desperately trying to figure out how to get an Endpoint so I can
>>> add an Interceptor. If I have the service ( which from looking at the
>>> code
>>> for javax.xml.ws.Service is created by a Provider()), how can I get to
>>> the
>>> endpoint?
>>>
>>> I've looked at:
>>>
>>> http://cxf.apache.org/docs/ws-security.html
>>>
>>> and in the section labelled "Adding the interceptors via the API", the
>>> example shows passing in a "myServiceImpl".
>>>
>>> What are the steps to go through for creation of a "myServiceImpl"? What
>>> are class is "myServiceImpl", and how is one obtained?
>>>
>>> Again, I apologize if these questions for the basic nature of my
>>> questions.
>>>
>>>
>>>
>>> --
>>> George S.
>>> *MH Software, Inc.*
>>> Voice: 303 438 9585
>>> http://www.mhsoftware.com
>>>
>>>
>>
>>
> --
> George S.
> *MH Software, Inc.*
> Voice: 303 438 9585
> http://www.mhsoftware.com
>



--
Colm O hEigeartaigh

Talend Community Coder
http://coders.talend.com