On Thu February 25 2010 2:57:19 pm James Carr wrote:
> Actually, I can't get this work... on the client side it's unable to
> deserialize the abstract class.... I thought there was someway to have
> CXF create a dynamic proxy for it?

No, this is really a JAXB thing.    You would need to create a concrete 
subclass for it and register an XmlJavaTypeAdapter thing to do the conversion 
to/from.  

See the java_first_jaxws sample in the CXF distribution.   It shows exactly 
this.

Dan



> 
> Thanks,
> James
> 
> On Wed, Feb 24, 2010 at 1:56 PM, James Carr <[email protected]> wrote:
> > nvm... figured it out
> > 
> > On Wed, Feb 24, 2010 at 1:38 PM, James Carr <[email protected]> 
wrote:
> >> I want to return objects that have JPA annotations on them from a
> >> service, but dont want the JPA annotations in the client object
> >> (stored in a shared module). Is there a way to use an abstrac class or
> >> interface?
> >> 
> >> Thanks,
> >> James
> >> 
> >> On Wed, Feb 24, 2010 at 1:33 PM, PrSd <[email protected]> wrote:
> >>> Hello,
> >>> 
> >>> I am injecting a SAML Assertion in a SOAP Header from the SOAPClient
> >>> and then issuing a service request to a CXF webservice. On the service
> >>> end I have a JAX WS SOAP Handler that intercepts and unmarshals the
> >>> header. The client and service handlers are from Glen Mazza's weblog.
> >>> http://www.jroller.com/gmazza/entry/using_the_opensaml_library_in
> >>> 
> >>> I am still including them incase any customary changes I may have made
> >>> messed up something. So here it is
> >>> 
> >>> -----------------------------------------------------------------------
> >>> ------------------------------- SOAPClient:
> >>> -----------------------------------------------------------------------
> >>> ------------------------------- package com.hsc.security.saml.soap;
> >>> 
> >>> import java.io.IOException;
> >>> import java.net.MalformedURLException;
> >>> import java.net.URL;
> >>> 
> >>> import java.util.ArrayList;
> >>> import java.util.List;
> >>> import java.util.Map;
> >>> import java.util.Properties;
> >>> import java.util.Set;
> >>> import javax.xml.namespace.QName;
> >>> import javax.xml.soap.SOAPElement;
> >>> import javax.xml.soap.SOAPEnvelope;
> >>> import javax.xml.soap.SOAPHeader;
> >>> import javax.xml.soap.SOAPMessage;
> >>> import javax.xml.ws.BindingProvider;
> >>> import javax.xml.ws.Service;
> >>> import javax.xml.ws.handler.MessageContext;
> >>> import javax.xml.ws.handler.soap.SOAPHandler;
> >>> import javax.xml.ws.handler.soap.SOAPMessageContext;
> >>> import javax.xml.ws.soap.SOAPBinding;
> >>> 
> >>> import com.syscom.hsc.web.IBpmService;
> >>> 
> >>> public class SpringWSClient {
> >>> 
> >>>        String wsdlString =
> >>> "http://localhost:9088/bpm-servicesCXF/services/IBpmService";;
> >>>         //String wsdlString =
> >>> "http://localhost:9088/bpm-servicesCXF/services/IBpmService?wsdl=IBpmSe
> >>> rvice.wsdl"; private static final QName SERVICE_NAME
> >>>      = new QName("http://web.hsc.syscom.com";, "BPMWebService");
> >>> 
> >>>           private static final QName PORT_NAME
> >>>       = new QName("http://web.hsc.syscom.com";, "BpmServicePort");
> >>> 
> >>> 
> >>> 
> >>> 
> >>>        public static String xmlFileNamePath =  "BpmServices.xml";
> >>> 
> >>>        public static void main(String [] args){
> >>> 
> >>>                SpringWSClient ws = new SpringWSClient();
> >>>                System.out.println("Starting SOAP request");
> >>>                Service service = Service.create(SERVICE_NAME);
> >>> 
> >>>                //BPMWebService bpmServices = new
> >>> BPMWebService(SERVICE_NAME); HeaderHandlerResolver handlerResolver =
> >>> new  HeaderHandlerResolver();
> >>> service.setHandlerResolver(handlerResolver);
> >>> 
> >>> 
> >>>                // Endpoint Address
> >>>                String endpointAddress =
> >>> "http://localhost:9088/bpm-servicesCXF/services/IBpmService";;
> >>>                try {
> >>>                        java.net.URL url = new URL(endpointAddress);
> >>>                } catch (MalformedURLException e1) {
> >>>                        // TODO Auto-generated catch block
> >>>                        e1.printStackTrace();
> >>>                }
> >>> 
> >>>                // Add a port to the Service
> >>> 
> >>>                IBpmService client = service.getPort(IBpmService.class);
> >>> 
> >>>                Map<String, Object> requestContext =
> >>> ((BindingProvider)client).getRequestContext();
> >>>              
> >>>  requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
> >>> endpointAddress);
> >>>              
> >>>  requestContext.put(BindingProvider.SESSION_MAINTAIN_PROPERTY,
> >>> Boolean.TRUE);
> >>> 
> >>>                String username = "kpham";
> >>>         String password = "hdfuhgdg";
> >>>         String category = "GETFULLEOPINWRK";
> >>>                 int max = -1;
> >>>                 Properties arguments = null;
> >>>                String response =null;
> >>>                try {
> >>>                        response =
> >>> client.findTaskListUsingLoginCreds(username, password, category,
> >>> arguments, max);
> >>>                        //response = client.findTaskList(category,
> >>> arguments, max);
> >>> 
> >>>                        System.out.println("Response: " + response);
> >>>                } catch (Exception e) {
> >>>                        // TODO Auto-generated catch block
> >>>                        e.printStackTrace();
> >>>                }
> >>> 
> >>> 
> >>>        }
> >>> 
> >>> -----------------------------------------------------------------------
> >>> ------------------------------- ClientSAMLHandler
> >>> -----------------------------------------------------------------------
> >>> ------------------------------- public class ClientSAMLHandler
> >>> implements SOAPHandler<SOAPMessageContext> {
> >>> 
> >>>   // change this to redirect output if desired
> >>>   private static PrintStream out = System.out;
> >>> 
> >>>   public static final String WS_SECURITY_NS_URI =
> >>> 
> >>> "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sec
> >>> ext-1.0.xsd";
> >>> 
> >>>   private static final Set<QName> HEADERS = new HashSet<QName>();
> >>> /*   static {
> >>>          HEADERS.add(new QName(WSConstants.WSSE_NS, "Security"));
> >>>          HEADERS.add(new QName(WSConstants.WSSE11_NS, "Security"));
> >>>          HEADERS.add(new QName(WSConstants.ENC_NS, "EncryptedData"));
> >>> 
> >>>      }
> >>> */
> >>>   public Set getHeaders() {
> >>>    //return HEADERS;
> >>>           return null;
> >>>   }
> >>> 
> >>>   public boolean handleMessage(SOAPMessageContext smc) {
> >>>      Boolean outboundProperty = (Boolean)
> >>> smc.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
> >>> 
> >>>      if (outboundProperty.booleanValue()) {
> >>>         out.println("(debug) Adding SAML token to outbound message from
> >>> client");
> >>>         System.out.println("(debug) Adding SAML token to outbound
> >>> message from client");
> >>> 
> >>>         try {
> >>>            DefaultBootstrap.bootstrap();
> >>>            SOAPMessage message = smc.getMessage();
> >>>            SOAPPart soapPart = message.getSOAPPart();
> >>>            SOAPEnvelope soapEnvelope = soapPart.getEnvelope();
> >>>            Name wsseHeaderName = soapEnvelope.createName("Security",
> >>>                  "wsse", WS_SECURITY_NS_URI);
> >>>            if (soapEnvelope.getHeader() == null) {
> >>>               soapEnvelope.addHeader();
> >>>            }
> >>>            SOAPHeaderElement securityElement = soapEnvelope.getHeader()
> >>>                  .addHeaderElement(wsseHeaderName);
> >>> 
> >>>            AssertionBuilder ab = new AssertionBuilder();
> >>>            Assertion assertion = ab.buildObject();
> >>>            assertion.setVersion(SAMLVersion.VERSION_20);
> >>>            assertion.setID("123"); // in reality, must be unique for
> >>> all assertions
> >>>            assertion.setIssueInstant(new DateTime());
> >>> 
> >>>            IssuerBuilder ib = new IssuerBuilder();
> >>>            Issuer myIssuer = ib.buildObject();
> >>>            myIssuer.setValue("http://localhost:9088";);
> >>>            assertion.setIssuer(myIssuer);
> >>> 
> >>>            SubjectBuilder sb = new SubjectBuilder();
> >>>            Subject mySubject = sb.buildObject();
> >>>            NameIDBuilder nb = new NameIDBuilder();
> >>>            NameID myNameID = nb.buildObject();
> >>>            myNameID.setValue("p8admin");
> >>>            myNameID.setFormat(NameIdentifier.X509_SUBJECT);
> >>>            mySubject.setNameID(myNameID);
> >>>            assertion.setSubject(mySubject);
> >>> 
> >>>            // user authenticated via X509 token
> >>>            AuthnStatementBuilder asb = new AuthnStatementBuilder();
> >>>            AuthnStatement myAuthnStatement = asb.buildObject();
> >>>            myAuthnStatement.setAuthnInstant(new DateTime());
> >>>            AuthnContextBuilder acb = new AuthnContextBuilder();
> >>>            AuthnContext myACI = acb.buildObject();
> >>>            AuthnContextClassRefBuilder accrb = new
> >>> AuthnContextClassRefBuilder();
> >>>            AuthnContextClassRef accr = accrb.buildObject();
> >>>            accr.setAuthnContextClassRef(AuthnContext.X509_AUTHN_CTX);
> >>>            myACI.setAuthnContextClassRef(accr);
> >>>            myAuthnStatement.setAuthnContext(myACI);
> >>>            assertion.getAuthnStatements().add(myAuthnStatement);
> >>> 
> >>>            // user can double even numbers
> >>>            AuthzDecisionStatementBuilder adsb = new
> >>> AuthzDecisionStatementBuilder();
> >>>            AuthzDecisionStatement ads = adsb.buildObject();
> >>>            ads.setDecision(DecisionTypeEnumeration.PERMIT);
> >>>            ads.setResource("DoubleIt");
> >>>            ActionBuilder actb = new ActionBuilder();
> >>>            Action act = actb.buildObject();
> >>>            // arbitrary unique tag to define "namespace" of action
> >>>            // note SAML actions not defined in an XSD -- XAMCL normally
> >>> used instead
> >>>            act.setNamespace("urn:doubleit:doubleitactions");
> >>>            act.setAction("DoubleEvenNumbers");
> >>>            ads.getActions().add(act);
> >>>            assertion.getAuthzDecisionStatements().add(ads);
> >>> 
> >>>            // user has math degree
> >>>            AttributeStatementBuilder attstmtb = new
> >>> AttributeStatementBuilder();
> >>>            AttributeStatement attstmt = attstmtb.buildObject();
> >>>            AttributeBuilder attbldr = new AttributeBuilder();
> >>>            Attribute attr = attbldr.buildObject();
> >>>            attr.setName("degree");
> >>>          
> >>>  attr.setNameFormat("http://www.example.org/DoubleIt/Security";);
> >>> XSStringBuilder stringBuilder = (XSStringBuilder) Configuration
> >>> .getBuilderFactory().getBuilder(XSString.TYPE_NAME); XSString
> >>> stringValue = stringBuilder
> >>>                  .buildObject(AttributeValue.DEFAULT_ELEMENT_NAME,
> >>>                        XSString.TYPE_NAME);
> >>>            stringValue.setValue("Mathematics");
> >>>            attr.getAttributeValues().add(stringValue);
> >>>            attstmt.getAttributes().add(attr);
> >>>            assertion.getAttributeStatements().add(attstmt);
> >>> 
> >>>            // marshall Assertion Java class into XML
> >>>            MarshallerFactory marshallerFactory = Configuration
> >>>                  .getMarshallerFactory();
> >>>            Marshaller marshaller = marshallerFactory
> >>>                  .getMarshaller(assertion);
> >>>            Element assertionElement = marshaller.marshall(assertion);
> >>>            securityElement.appendChild(soapPart.importNode(
> >>>                  assertionElement, true));
> >>> 
> >>>            //Print out the outbound SOAP message to System.out
> >>>            message.writeTo(System.out);
> >>>            System.out.println("");
> >>> 
> >>>         } catch (Exception e) {
> >>>            e.printStackTrace();
> >>>         }
> >>>      }
> >>>      else{
> >>>          try {
> >>> 
> >>>              //This handler does nothing with the response from the Web
> >>> Service so
> >>>              //we just print out the SOAP message.
> >>>              SOAPMessage message = smc.getMessage();
> >>>              message.writeTo(System.out);
> >>>              System.out.println("");
> >>> 
> >>>          } catch (Exception ex) {
> >>>              ex.printStackTrace();
> >>>          }
> >>>      }
> >>>      return true;
> >>>   }
> >>> 
> >>>   public boolean handleFault(SOAPMessageContext smc) {
> >>>      out.println("Exception in Client handler: ");
> >>>      SOAPMessage message = smc.getMessage();
> >>>      try {
> >>>         message.writeTo(out);
> >>>         out.println(""); // just to add a newline
> >>>      } catch (Exception e) {
> >>>         out.println("Unable to write exception for exception: "
> >>>            + e.toString());
> >>>      }
> >>>      return true;
> >>>   }
> >>> 
> >>>   // nothing to clean up
> >>>   public void close(MessageContext messageContext) {
> >>>   }
> >>> 
> >>> }
> >>> 
> >>> 
> >>> }
> >>> 
> >>> The SOAP Client then issues the service request, the Service JAX WS
> >>> Handler intercepts the incoming message. The handleMessage is invoked,
> >>> however I see a SOAPFaultException being thrown -
> >>> -----------------------------------------------------------------------
> >>> ------------------------------- [2/24/10 14:10:33:974 EST] 00000022
> >>> HandlerChainI 1   invoking handlers, direction: inbound
> >>> [2/24/10 14:10:33:974 EST] 00000022 HandlerChainI 1   invoking handler
> >>> of type com.syscom.hsc.web.soap.ServiceSAMLHandler
> >>> [2/24/10 14:10:33:974 EST] 00000022 SystemOut     O   Inside
> >>> handleMessage ---->
> >>> [2/24/10 14:10:33:974 EST] 00000022 SystemOut     O   Inside
> >>> handleMessage ----> outboundProperty.booleanValue() false
> >>> [2/24/10 14:10:33:974 EST] 00000022 SystemOut     O   Inside
> >>> handleMessage ----> sh.toString()[soap:Header: null]
> >>> [2/24/10 14:10:33:974 EST] 00000022 SystemOut     O   Inside
> >>> handleMessage ----> wsseElement.getLocalName()Security
> >>> [2/24/10 14:10:33:974 EST] 00000022 SystemOut     O   Inside
> >>> handleMessage ---->
> >>> wsseElement.getNamespaceURI()http://docs.oasis-open.org/wss/2004/01/oas
> >>> is-200401-wss-wssecurity-secext-1.0.xsd [2/24/10 14:10:33:974 EST]
> >>> 00000022 SystemOut     O   Inside handleMessage ---->
> >>> assertionElement.getLocalName()Assertion
> >>> [2/24/10 14:10:33:974 EST] 00000022 SystemOut     O   Inside
> >>> handleMessage ---->
> >>> assertionElement.getNamespaceURI()urn:oasis:names:tc:SAML:2.0:assertion
> >>> [2/24/10 14:10:34:224 EST] 00000022 Configuration W
> >>> org.opensaml.xml.Configuration validateJCEProviders The JCE providers
> >>> currently configured in the JVM do not support
> >>> required capabilities for XML Encryption, either the 'AES' cipher
> >>> algorithm or the 'ISO10126Padding' padding scheme
> >>> 
> >>> handleMessage raised exception
> >>>                                 javax.xml.ws.soap.SOAPFaultException:
> >>> Internal Error: local part cannot be "null" when creating a QName
> >>>        at
> >>> com.syscom.hsc.web.soap.ServiceSAMLHandler.createSOAPFaultException(Ser
> >>> viceSAMLHandler.java:253) at
> >>> com.syscom.hsc.web.soap.ServiceSAMLHandler.handleMessage(ServiceSAMLHan
> >>> dler.java:234) at
> >>> com.syscom.hsc.web.soap.ServiceSAMLHandler.handleMessage(ServiceSAMLHan
> >>> dler.java:1) at
> >>> org.apache.cxf.jaxws.handler.HandlerChainInvoker.invokeHandleMessage(Ha
> >>> ndlerChainInvoker.java:335) at
> >>> org.apache.cxf.jaxws.handler.HandlerChainInvoker.invokeHandlerChain(Han
> >>> dlerChainInvoker.java:253) at
> >>> org.apache.cxf.jaxws.handler.HandlerChainInvoker.invokeProtocolHandlers
> >>> (HandlerChainInvoker.java:131)
> >>> .---------------------------------------------------------------------
> >>> --------------------------------
> >>> 
> >>> 
> >>> 
> >>> 
> >>> Here is the ServiceHandler
> >>> -----------------------------------------------------------------------
> >>> ------------------------------- SAMLServiceHandler
> >>> -----------------------------------------------------------------------
> >>> ------------------------------- package com.syscom.hsc.web.soap;
> >>> import java.io.PrintStream;
> >>> import java.util.HashSet;
> >>> import java.util.Iterator;
> >>> import java.util.List;
> >>> import java.util.Set;
> >>> 
> >>> import javax.annotation.PostConstruct;
> >>> import javax.annotation.PreDestroy;
> >>> import javax.xml.namespace.QName;
> >>> import javax.xml.soap.SOAPBody;
> >>> import javax.xml.soap.SOAPConstants;
> >>> import javax.xml.soap.SOAPException;
> >>> import javax.xml.soap.SOAPFactory;
> >>> import javax.xml.soap.SOAPFault;
> >>> import javax.xml.soap.SOAPHeader;
> >>> import javax.xml.soap.SOAPMessage;
> >>> import javax.xml.ws.handler.MessageContext;
> >>> import javax.xml.ws.handler.soap.SOAPHandler;
> >>> import javax.xml.ws.handler.soap.SOAPMessageContext;
> >>> import javax.xml.ws.soap.SOAPFaultException;
> >>> 
> >>> import org.apache.ws.security.WSConstants;
> >>> import org.opensaml.Configuration;
> >>> import org.opensaml.DefaultBootstrap;
> >>> import org.opensaml.saml2.core.Action;
> >>> import org.opensaml.saml2.core.Assertion;
> >>> import org.opensaml.saml2.core.Attribute;
> >>> import org.opensaml.saml2.core.AttributeStatement;
> >>> import org.opensaml.saml2.core.AuthnContext;
> >>> import org.opensaml.saml2.core.AuthnStatement;
> >>> import org.opensaml.saml2.core.AuthzDecisionStatement;
> >>> import org.opensaml.xml.XMLObject;
> >>> import org.opensaml.xml.io.Unmarshaller;
> >>> import org.opensaml.xml.io.UnmarshallerFactory;
> >>> import org.w3c.dom.Element;
> >>> import org.w3c.dom.Node;
> >>> 
> >>> import org.opensaml.common.xml.SAMLConstants;
> >>> 
> >>> import com.syscom.hsc.web.security.saml.SAMLCredential;
> >>> 
> >>> /*
> >>>  * This sample SOAP Protocol Handler for DoubleIt checks for X.509
> >>> authentication,
> >>>  * attribute of Math degree, and authorization to double even numbers.
> >>>  */
> >>> public class ServiceSAMLHandler implements
> >>> SOAPHandler<SOAPMessageContext> {
> >>> 
> >>>   // change this to redirect output if desired
> >>>   private static PrintStream out = System.out;
> >>> 
> >>>   private static String WS_SECURITY_URI =
> >>> 
> >>> "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sec
> >>> ext-1.0.xsd"; private static final String HANDLER_NAME =
> >>> "ServiceSAMLHandler";
> >>> 
> >>> 
> >>>   private static final Set<QName> HEADERS = new HashSet<QName>();
> >>>  /*  static {
> >>>       HEADERS.add(new QName(WSConstants.WSSE_NS, "Security"));
> >>>       HEADERS.add(new QName(WSConstants.WSSE11_NS, "Security"));
> >>>       HEADERS.add(new QName(WSConstants.ENC_NS, "EncryptedData"));
> >>>   }
> >>> */
> >>>   @PostConstruct
> >>>   public void init() {
> >>>      out.println("------------------------------------");
> >>>      out.println("In Handler " + HANDLER_NAME + ":init()");
> >>>      out.println("Exiting Handler " + HANDLER_NAME + ":init()");
> >>>      out.println("------------------------------------");
> >>>   }
> >>> 
> >>>   @PreDestroy
> >>>   public void destroy() {
> >>>      out.println("------------------------------------");
> >>>      out.println("In Handler " + HANDLER_NAME + ":destroy()");
> >>>      out.println("Exiting Handler " + HANDLER_NAME + ":destroy()");
> >>>      out.println("------------------------------------");
> >>>   }
> >>> 
> >>> 
> >>>   public Set <QName> getHeaders() {
> >>>      //return HEADERS;
> >>>           return null;
> >>>   }
> >>> 
> >>>   public boolean handleMessage(SOAPMessageContext smc) {
> >>>           out.println("Inside handleMessage ----> ");
> >>>           Boolean outboundProperty = (Boolean) smc
> >>>            .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
> >>> 
> >>> 
> >>>      if (!outboundProperty.booleanValue()) {
> >>>           out.println("Inside handleMessage ---->
> >>> outboundProperty.booleanValue() "+outboundProperty.booleanValue());
> >>>           logToSystemOut(smc);
> >>>          Element assertionElement;
> >>> 
> >>>         try {
> >>>            // check for SOAP Header
> >>>            SOAPHeader sh = smc.getMessage().getSOAPHeader();
> >>>            out.println("Inside handleMessage ---->
> >>> sh.toString()"+sh.toString());
> >>>            if (sh == null) {
> >>>               throw createSOAPFaultException("Missing SOAP Header",
> >>> true); }
> >>> 
> >>>            // check for wsse:security element under SOAP Header
> >>>            Node wsseElement = sh.getFirstChild();
> >>>            out.println("Inside handleMessage ---->
> >>> wsseElement.getLocalName()"+wsseElement.getLocalName());
> >>>            out.println("Inside handleMessage ---->
> >>> wsseElement.getNamespaceURI()"+wsseElement.getNamespaceURI());
> >>> 
> >>>            if (wsseElement == null ||
> >>> !"Security".equals(wsseElement.getLocalName())
> >>>                  ||
> >>> !WS_SECURITY_URI.equals(wsseElement.getNamespaceURI())) {
> >>>               throw createSOAPFaultException("Missing or invalid
> >>> WS-Security Header",
> >>>                     true);
> >>>            }
> >>> 
> >>>            // check for SAML assertion under wsse:security element
> >>>            assertionElement = (Element) wsseElement.getFirstChild();
> >>> 
> >>>            out.println("Inside handleMessage ---->
> >>> assertionElement.getLocalName()"+assertionElement.getLocalName());
> >>>            out.println("Inside handleMessage ---->
> >>> assertionElement.getNamespaceURI()"+assertionElement.getNamespaceURI())
> >>> ; if (assertionElement == null
> >>>                  ||
> >>> !"Assertion".equals(assertionElement.getLocalName()) ||
> >>> !SAMLConstants.SAML20_NS.equals(assertionElement.getNamespaceURI())) {
> >>>               throw createSOAPFaultException("Missing or invalid SAML
> >>> Assertion", true);
> >>>            }
> >>> 
> >>>            // Unmarshall SAML Assertion into an OpenSAML Java object.
> >>>            DefaultBootstrap.bootstrap();
> >>>            UnmarshallerFactory unmarshallerFactory = Configuration
> >>>                  .getUnmarshallerFactory();
> >>>            Unmarshaller unmarshaller = unmarshallerFactory
> >>>                  .getUnmarshaller(assertionElement);
> >>>            Assertion samlAssertion = (Assertion) unmarshaller
> >>>                  .unmarshall(assertionElement);
> >>> 
> >>>            /*
> >>>             * Below code works with OpenSAML API to check
> >>> Authentication, * Authorization, and attributes. Using the XPath API
> >>> with the * assertionElement above would probably be an easier and more
> >>> * readable option.
> >>>             */
> >>>            //Check for Subject
> >>>            out.println("Subject from Service
> >>> Handler"+samlAssertion.getSubject().getNameID().getValue());
> >>>            //SAMLCredential samlCred = new
> >>> SAMLCredential(samlAssertion.getSubject().getNameID(), samlAssertion);
> >>> 
> >>> SAMLCredential.setNameID(samlAssertion.getSubject().getNameID());
> >>>            SAMLCredential.setAuthenticationAssertion(samlAssertion);
> >>> 
> >>> 
> >>>            // Check for X509 authentication, error otherwise
> >>>            List authStmtList = samlAssertion.getAuthnStatements();
> >>>            if (authStmtList == null || authStmtList.size() < 1
> >>>                  || authStmtList.size() > 1) {
> >>>               throw createSOAPFaultException("Missing Authentication
> >>> Statement.", true);
> >>>            } else {
> >>>               AuthnStatement authStmt = (AuthnStatement)
> >>> authStmtList.get(0);
> >>>               if
> >>> (!AuthnContext.X509_AUTHN_CTX.equals(authStmt.getAuthnContext()
> >>>                    
> >>> .getAuthnContextClassRef().getAuthnContextClassRef())) {
> >>>                  throw createSOAPFaultException("Only X.509
> >>> authentication supported.",
> >>>                        true);
> >>>               }
> >>>            }
> >>> 
> >>>            // Check if math degree, error otherwise
> >>>            List asList = samlAssertion.getAttributeStatements();
> >>>         /*   if (asList == null || asList.size() == 0) {
> >>>               throw createSOAPFaultException("Degree/Major is
> >>> missing.", true);
> >>>            } else {
> >>>               boolean hasMathDegree = false;
> >>>               for (Iterator it = asList.iterator(); it.hasNext();) {
> >>>                  AttributeStatement as = it.next();
> >>>                  List attList = as.getAttributes();
> >>>                  if (attList == null || attList.size() == 0) {
> >>>                     throw createSOAPFaultException("Degree/major is
> >>> missing.", true);
> >>>                  } else {
> >>>                     for (Iterator it2 = attList.iterator();
> >>> it2.hasNext();) {
> >>>                        Attribute att = it2.next();
> >>>                        if (!att.getName().equals("degree")) {
> >>>                           continue;
> >>>                        } else {
> >>>                           List xoList = att.getAttributeValues();
> >>>                           if (xoList == null || xoList.size() < 1 ||
> >>> xoList.size() > 1) {
> >>>                              throw
> >>> createSOAPFaultException("Degree/major is missing.",
> >>>                                    true);
> >>>                           } else {
> >>>                              XMLObject xmlObj = xoList.get(0);
> >>>                              if
> >>> (xmlObj.getDOM().getFirstChild().getTextContent()
> >>>                                    .equals("Mathematics")) {
> >>>                                 hasMathDegree = true;
> >>>                              }
> >>>                           }
> >>>                        }
> >>>                     }
> >>>                  }
> >>>               }
> >>>               if (hasMathDegree == false) {
> >>>                  throw createSOAPFaultException(
> >>>                        "Must have Mathematics degree to run DoubleIt.",
> >>> true);
> >>>               }
> >>>            }
> >>> *
> >>>            // If even number being doubled, make sure user has
> >>> permission SOAPBody sb = smc.getMessage().getSOAPBody();
> >>> 
> >>>            if (sb.getFirstChild() == null ||
> >>> sb.getFirstChild().getFirstChild() == null) {
> >>>               throw createSOAPFaultException("Invalid SOAP Body",
> >>> true); } else {
> >>>               Integer intValue = new
> >>> Integer(sb.getFirstChild().getFirstChild()
> >>>                     .getTextContent());
> >>>               if ((intValue.intValue() % 2) == 0) { // if even
> >>>                  List adsList = samlAssertion
> >>>                        .getAuthzDecisionStatements();
> >>>                  if (adsList == null || adsList.size() < 1 ||
> >>> adsList.size() > 1) {
> >>>                     throw createSOAPFaultException(
> >>>                           "Missing or invalid Authorization Decision
> >>> Statement", true);
> >>>                  } else {
> >>>                     Boolean canDoubleEven = false;
> >>>                     AuthzDecisionStatement ads =
> >>> (AuthzDecisionStatement) adsList.get(0);
> >>>                     List actList = ads.getActions();
> >>>                     for (Iterator it = actList.iterator();
> >>> it.hasNext();) { Action action = (Action) it.next();
> >>>                        if
> >>> ("DoubleEvenNumbers".equals(action.getAction())) {
> >>>                           canDoubleEven = true;
> >>>                           break;
> >>>                        }
> >>>                     }
> >>>                     if (canDoubleEven == false) {
> >>>                        throw createSOAPFaultException(
> >>>                              "Missing authorization to double even
> >>> numbers.", true);
> >>>                     }
> >>>                  }
> >>>               }
> >>>            }*/
> >>>         } catch (Exception e) {
> >>>            throw createSOAPFaultException("Internal Error: " +
> >>> e.getMessage(), false);
> >>>         }
> >>>      }
> >>>      return true;
> >>>   }
> >>> 
> >>>   /*
> >>>    * Convenience function used to generate a generic SOAPFaultException
> >>>    */
> >>>   private SOAPFaultException createSOAPFaultException(String
> >>> faultString, Boolean clientFault) {
> >>>      try {
> >>>        
> >>>  System.out.println("*********clientFault***********"+clientFault);
> >>> String faultCode = clientFault ? "Client" : "Server";
> >>>         System.out.println("*********faultCode***********"+faultCode);
> >>>         SOAPFault fault = SOAPFactory.newInstance().createFault();
> >>>        
> >>> System.out.println("*********faultString***********"+faultString);
> >>> fault.setFaultString(faultString);
> >>>         fault.setFaultCode(new
> >>> QName(SOAPConstants.URI_NS_SOAP_ENVELOPE, faultCode));
> >>>         return new SOAPFaultException(fault);
> >>>      } catch (SOAPException e) {
> >>>         throw new RuntimeException("Error creating SOAP Fault message,
> >>> faultString: "
> >>>               + faultString);
> >>>      }
> >>>   }
> >>> 
> >>>   public boolean handleFault(SOAPMessageContext smc) {
> >>> 
> >>>           out.println("------------------------------------");
> >>>              out.println("In Handler " + HANDLER_NAME +
> >>> ":handleFault()"); logToSystemOut(smc);
> >>>              out.println("Exiting Handler " + HANDLER_NAME +
> >>> ":handleFault()");
> >>> out.println("------------------------------------");
> >>> 
> >>>      return true;
> >>>   }
> >>> 
> >>>   // nothing to clean up
> >>>   public void close(MessageContext messageContext) {
> >>>           out.println("------------------------------------");
> >>>              out.println("In Handler " + HANDLER_NAME + ":close()");
> >>>              out.println("Exiting Handler " + HANDLER_NAME +
> >>> ":close()"); out.println("------------------------------------");
> >>> 
> >>>   }
> >>> 
> >>>   /*
> >>>    * Check the MESSAGE_OUTBOUND_PROPERTY in the context to see if this
> >>> is an
> >>>    * outgoing or incoming message. Write a brief message to the print
> >>> stream
> >>>    * and output the message. The writeTo() method can throw
> >>> SOAPException or
> >>>    * IOException
> >>>    */
> >>>   private void logToSystemOut(SOAPMessageContext smc) {
> >>>      Boolean outboundProperty = (Boolean) smc
> >>>            .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
> >>> 
> >>>      if (outboundProperty.booleanValue()) {
> >>>         out.println("\nIncoming message to web service provider:");
> >>>      } else {
> >>>         out.println("\nOutgoing message from web service provider:");
> >>>      }
> >>> 
> >>>      SOAPMessage message = smc.getMessage();
> >>>      try {
> >>>         message.writeTo(out);
> >>>         out.println(""); // just to add a newline
> >>>      } catch (Exception e) {
> >>>         out.println("Exception in handler: " + e);
> >>>      }
> >>>   }
> >>> 
> >>> }
> >>> 
> >>> I am not sure what the local part here is and how can I circumvent it
> >>> from being Null. Any clue or suggestions will be well appreciated.
> >>> 
> >>> 
> >>> 
> >>> 
> >>> --
> >>> View this message in context:
> >>> http://old.nabble.com/local-part-cannot-be-%22null%22-when-creating-a-
> >>> QName-tp27714287p27714287.html Sent from the cxf-user mailing list
> >>> archive at Nabble.com.

-- 
Daniel Kulp
[email protected]
http://www.dankulp.com/blog

Reply via email to