[jboss-cvs] Picketlink SVN: r749 - in federation/trunk/picketlink-fed-core/src: main/java/org/picketlink/identity/federation/core/parsers/util and 5 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Feb 11 15:08:04 EST 2011


Author: anil.saldhana at jboss.com
Date: 2011-02-11 15:08:03 -0500 (Fri, 11 Feb 2011)
New Revision: 749

Added:
   federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java
Modified:
   federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java
   federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAMLParserUtil.java
   federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java
   federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/util/XMLTimeUtil.java
   federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java
   federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java
   federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescriptor.xml
Log:
some more metadata parsing and writing

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java	2011-02-10 17:03:12 UTC (rev 748)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java	2011-02-11 20:08:03 UTC (rev 749)
@@ -36,9 +36,11 @@
 import org.picketlink.identity.federation.core.parsers.util.SAMLParserUtil;
 import org.picketlink.identity.federation.core.parsers.util.StaxParserUtil;
 import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLConstants;
-import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants; 
+import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants;
+import org.picketlink.identity.federation.core.saml.v2.util.XMLTimeUtil;
 import org.picketlink.identity.federation.newmodel.saml.v2.assertion.AttributeType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.AttributeAuthorityDescriptorType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.AttributeConsumingServiceType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EndpointType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType.EDTChoiceType;
@@ -50,6 +52,8 @@
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedNameType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedURIType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.OrganizationType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.RequestedAttributeType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.SPSSODescriptorType;
 import org.w3c.dom.Element;
 
 /**
@@ -66,10 +70,29 @@
       StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
       StaxParserUtil.validate(startElement, EDT );
       
-      Attribute entityID = startElement.getAttributeByName( new QName( "entityID" ));
+      Attribute entityID = startElement.getAttributeByName( new QName( JBossSAMLConstants.ENTITY_ID.get() ));
       String entityIDValue = StaxParserUtil.getAttributeValue(entityID);
       EntityDescriptorType entityDescriptorType = new EntityDescriptorType( entityIDValue ); 
       
+      Attribute validUntil = startElement.getAttributeByName( new QName( JBossSAMLConstants.VALID_UNTIL.get() ));
+      if( validUntil != null )
+      {
+         String validUntilValue = StaxParserUtil.getAttributeValue(validUntil);
+         entityDescriptorType.setValidUntil( XMLTimeUtil.parse(validUntilValue)); 
+      } 
+      
+      Attribute id = startElement.getAttributeByName( new QName( JBossSAMLConstants.ID.get() ));
+      if( id != null )
+      {
+         entityDescriptorType.setID( StaxParserUtil.getAttributeValue(id));  
+      } 
+      
+      Attribute cacheDuration = startElement.getAttributeByName( new QName( JBossSAMLConstants.CACHE_DURATION.get() ));
+      if( cacheDuration != null )
+      {
+         entityDescriptorType.setCacheDuration( XMLTimeUtil.parseAsDuration( StaxParserUtil.getAttributeValue( cacheDuration )) );  
+      } 
+      
       //Get the Child Elements
       while( xmlEventReader.hasNext() )
       {
@@ -91,6 +114,14 @@
             EDTChoiceType edtChoice = EDTChoiceType.oneValue( edtDescChoice );
             entityDescriptorType.addChoiceType(edtChoice);
          }
+         else if( JBossSAMLConstants.SP_SSO_DESCRIPTOR.get().equals( localPart ))
+         { 
+            SPSSODescriptorType spSSO = parseSPSSODescriptor(xmlEventReader);
+            
+            EDTDescriptorChoiceType edtDescChoice = new EDTDescriptorChoiceType( spSSO );
+            EDTChoiceType edtChoice = EDTChoiceType.oneValue( edtDescChoice );
+            entityDescriptorType.addChoiceType(edtChoice);
+         }
          else if( JBossSAMLConstants.ATTRIBUTE_AUTHORITY_DESCRIPTOR.get().equals( localPart ))
          {   
             AttributeAuthorityDescriptorType attrAuthority = parseAttributeAuthorityDescriptor( xmlEventReader );
@@ -120,6 +151,99 @@
            && localPart.equals( JBossSAMLConstants.ENTITY_DESCRIPTOR.get() ); 
    } 
    
+   
+   private SPSSODescriptorType parseSPSSODescriptor( XMLEventReader xmlEventReader ) throws ParsingException
+   {
+      StartElement startElement = StaxParserUtil.getNextStartElement( xmlEventReader );
+      StaxParserUtil.validate(startElement, JBossSAMLConstants.SP_SSO_DESCRIPTOR.get() );
+      
+      List<String> protocolEnum = SAMLParserUtil.parseProtocolEnumeration(startElement);
+      SPSSODescriptorType spSSODescriptor = new SPSSODescriptorType( protocolEnum );
+      
+      Attribute wantAssertionsSigned = startElement.getAttributeByName( new QName( JBossSAMLConstants.WANT_ASSERTIONS_SIGNED.get() ) );
+      if( wantAssertionsSigned != null )
+      {
+         spSSODescriptor.setWantAssertionsSigned( Boolean.parseBoolean( StaxParserUtil.getAttributeValue( wantAssertionsSigned ))); 
+      } 
+      Attribute wantAuthnSigned = startElement.getAttributeByName( new QName( JBossSAMLConstants.AUTHN_REQUESTS_SIGNED.get() ) );
+      if( wantAuthnSigned != null )
+      {
+         spSSODescriptor.setAuthnRequestsSigned( Boolean.parseBoolean( StaxParserUtil.getAttributeValue( wantAuthnSigned ))); 
+      } 
+      
+      while( xmlEventReader.hasNext() )
+      {
+         XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+         if( xmlEvent instanceof EndElement )
+         {
+            EndElement end = StaxParserUtil.getNextEndElement(xmlEventReader); 
+            StaxParserUtil.validate( end , JBossSAMLConstants.SP_SSO_DESCRIPTOR.get() ); 
+            break;
+         }
+         
+         startElement = (StartElement) xmlEvent; 
+         String localPart = startElement.getName().getLocalPart();
+         
+         if( JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get().equals( localPart ))
+         { 
+            IndexedEndpointType endpoint = parseArtifactResolutionService(xmlEventReader, startElement); 
+            spSSODescriptor.addArtifactResolutionService(endpoint);
+         }
+         else if( JBossSAMLConstants.ASSERTION_CONSUMER_SERVICE.get().equals( localPart ))
+         { 
+            IndexedEndpointType endpoint = parseAssertionConsumerService( xmlEventReader, startElement); 
+            spSSODescriptor.addAssertionConsumerService( endpoint );
+         }
+         else if( JBossSAMLConstants.ATTRIBUTE_CONSUMING_SERVICE.get().equals( localPart ))
+         { 
+            AttributeConsumingServiceType attributeConsumer = parseAttributeConsumingService(xmlEventReader, startElement);
+            spSSODescriptor.addAttributeConsumerService(attributeConsumer);
+         }
+         else if( JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get().equals( localPart ))
+         { 
+            startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+            EndpointType endpoint = getEndpointType(startElement); 
+            
+            EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+            StaxParserUtil.validate( endElement, JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get() );
+            
+            spSSODescriptor.addSingleLogoutService( endpoint );
+         } 
+         else if( JBossSAMLConstants.MANAGE_NAMEID_SERVICE.get().equals( localPart ))
+         { 
+            startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+            EndpointType endpoint = getEndpointType(startElement); 
+            
+            EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+            StaxParserUtil.validate( endElement, JBossSAMLConstants.MANAGE_NAMEID_SERVICE.get() );
+            
+            spSSODescriptor.addManageNameIDService( endpoint );
+         } 
+         else if (JBossSAMLConstants.NAMEID_FORMAT.get().equalsIgnoreCase( localPart ))
+         {
+            startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+            spSSODescriptor.addNameIDFormat( StaxParserUtil.getElementText(xmlEventReader) ); 
+         } 
+         else if (JBossSAMLConstants.KEY_DESCRIPTOR.get().equalsIgnoreCase( localPart ))
+         {
+            KeyDescriptorType keyDescriptor = new KeyDescriptorType();
+            String use = StaxParserUtil.getAttributeValue(startElement, "use" );
+            if( use != null )
+               keyDescriptor.setUse( KeyTypes.fromValue(use) );
+            
+            Element key = StaxParserUtil.getDOMElement(xmlEventReader);
+            keyDescriptor.setKeyInfo(key);
+            spSSODescriptor.addKeyDescriptor(keyDescriptor);
+         }
+         else
+            throw new RuntimeException( "Unknown " + localPart ); 
+      }
+      return spSSODescriptor;
+   }
+   
+   
+   
+   
    private IDPSSODescriptorType parseIDPSSODescriptor( XMLEventReader xmlEventReader ) throws ParsingException
    {
       StartElement startElement = StaxParserUtil.getNextStartElement( xmlEventReader );
@@ -149,29 +273,7 @@
          
          if( JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get().equals( localPart ))
          { 
-            startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
-            Attribute bindingAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.BINDING.get() ) );
-            String binding = StaxParserUtil.getAttributeValue(bindingAttr);
-            
-            Attribute locationAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.LOCATION.get() ) );
-            String location = StaxParserUtil.getAttributeValue( locationAttr );
-            
-            IndexedEndpointType endpoint = new IndexedEndpointType( URI.create( binding ), 
-                  URI.create( location ));
-            Attribute isDefault = startElement.getAttributeByName( new QName( JBossSAMLConstants.ISDEFAULT.get() ));
-            if( isDefault != null )
-            {
-               endpoint.setIsDefault( Boolean.parseBoolean( StaxParserUtil.getAttributeValue( isDefault )));
-            }
-            Attribute index = startElement.getAttributeByName( new QName( JBossSAMLConstants.INDEX.get() ));
-            if( index != null )
-            {
-               endpoint.setIndex( Integer.parseInt( StaxParserUtil.getAttributeValue( index )));
-            }
-            
-            EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
-            StaxParserUtil.validate( endElement, JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get() );
-            
+            IndexedEndpointType endpoint = parseArtifactResolutionService(xmlEventReader, startElement);
             idpSSODescriptor.addArtifactResolutionService(endpoint);
          }
          else if( JBossSAMLConstants.ASSERTION_ID_REQUEST_SERVICE.get().equals( localPart ))
@@ -386,4 +488,116 @@
       localName.setValue( StaxParserUtil.getElementText(xmlEventReader));
       return localName;
    }
+   
+   private IndexedEndpointType parseAssertionConsumerService( XMLEventReader xmlEventReader, StartElement startElement ) throws ParsingException
+   {
+      startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+      IndexedEndpointType endpoint = parseIndexedEndpoint(xmlEventReader, startElement);
+      
+      EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+      StaxParserUtil.validate( endElement, JBossSAMLConstants.ASSERTION_CONSUMER_SERVICE.get() );
+      
+      return endpoint;
+   }
+   
+   private IndexedEndpointType parseArtifactResolutionService( XMLEventReader xmlEventReader, StartElement startElement ) throws ParsingException
+   {
+      startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+      IndexedEndpointType endpoint = parseIndexedEndpoint(xmlEventReader, startElement);
+      
+      EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+      StaxParserUtil.validate( endElement, JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get() );
+      
+      return endpoint;
+   }
+   
+   private IndexedEndpointType parseIndexedEndpoint( XMLEventReader xmlEventReader, StartElement startElement )
+   {
+      Attribute bindingAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.BINDING.get() ) );
+      String binding = StaxParserUtil.getAttributeValue(bindingAttr);
+      
+      Attribute locationAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.LOCATION.get() ) );
+      String location = StaxParserUtil.getAttributeValue( locationAttr );
+      
+      IndexedEndpointType endpoint = new IndexedEndpointType( URI.create( binding ), 
+            URI.create( location ));
+      Attribute isDefault = startElement.getAttributeByName( new QName( JBossSAMLConstants.ISDEFAULT.get() ));
+      if( isDefault != null )
+      {
+         endpoint.setIsDefault( Boolean.parseBoolean( StaxParserUtil.getAttributeValue( isDefault )));
+      }
+      Attribute index = startElement.getAttributeByName( new QName( JBossSAMLConstants.INDEX.get() ));
+      if( index != null )
+      {
+         endpoint.setIndex( Integer.parseInt( StaxParserUtil.getAttributeValue( index )));
+      }
+      return endpoint;
+   }
+   
+   private AttributeConsumingServiceType parseAttributeConsumingService( XMLEventReader xmlEventReader, StartElement startElement ) throws ParsingException
+   { 
+      startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+      
+      Attribute indexAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.INDEX.get() ) );
+      if( indexAttr == null )
+         throw new ParsingException( "attribute index required" );
+      
+      AttributeConsumingServiceType attributeConsumer = new AttributeConsumingServiceType( Integer.parseInt( StaxParserUtil.getAttributeValue(indexAttr)));
+      while( xmlEventReader.hasNext() )
+      {
+         XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+         if( xmlEvent instanceof EndElement )
+         {
+            EndElement end = StaxParserUtil.getNextEndElement(xmlEventReader); 
+            StaxParserUtil.validate( end , JBossSAMLConstants.ATTRIBUTE_CONSUMING_SERVICE.get() );
+            break;
+         }
+         
+         startElement = (StartElement) xmlEvent; 
+         String localPart = startElement.getName().getLocalPart();
+         
+         if( JBossSAMLConstants.SERVICE_NAME.get().equals( localPart ))
+         { 
+            startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+            LocalizedNameType localName = getLocalizedName(xmlEventReader, startElement);
+            attributeConsumer.addServiceName(localName);
+         }  
+         else if( JBossSAMLConstants.SERVICE_DESCRIPTION.get().equals( localPart ))
+         { 
+            startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+            LocalizedNameType localName = getLocalizedName(xmlEventReader, startElement);
+            attributeConsumer.addServiceDescription(localName);
+         }
+         else if( JBossSAMLConstants.REQUESTED_ATTRIBUTE.get().equals( localPart ))
+         { 
+            RequestedAttributeType attType = parseRequestedAttributeType(xmlEventReader, startElement);
+            attributeConsumer.addRequestedAttribute(attType);
+         } 
+         else 
+            throw new RuntimeException( "Unknown " + localPart ); 
+      }
+      
+      return attributeConsumer;
+   }
+   
+   private RequestedAttributeType parseRequestedAttributeType( XMLEventReader xmlEventReader, StartElement startElement ) throws ParsingException 
+   {
+      startElement = StaxParserUtil.getNextStartElement(xmlEventReader); 
+      StaxParserUtil.validate( startElement, JBossSAMLConstants.REQUESTED_ATTRIBUTE.get() );
+      RequestedAttributeType attributeType = null;
+       
+      Attribute name = startElement.getAttributeByName( new QName( JBossSAMLConstants.NAME.get() ));
+      if( name == null )
+         throw new RuntimeException( "Required attribute Name in Attribute" );
+      attributeType = new RequestedAttributeType( StaxParserUtil.getAttributeValue( name ));
+      
+      Attribute isRequired = startElement.getAttributeByName( new QName( JBossSAMLConstants.IS_REQUIRED.get() ));
+      if( isRequired != null )
+      {
+         attributeType.setIsRequired( Boolean.parseBoolean( StaxParserUtil.getAttributeValue(isRequired) ));
+      }
+      
+      SAMLParserUtil.parseAttributeType(xmlEventReader, startElement, JBossSAMLConstants.REQUESTED_ATTRIBUTE.get(), attributeType);
+      return attributeType;
+   }
 }
\ No newline at end of file

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAMLParserUtil.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAMLParserUtil.java	2011-02-10 17:03:12 UTC (rev 748)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAMLParserUtil.java	2011-02-11 20:08:03 UTC (rev 749)
@@ -107,8 +107,11 @@
       if( name == null )
          throw new RuntimeException( "Required attribute Name in Attribute" );
       attributeType = new AttributeType( StaxParserUtil.getAttributeValue( name ));
+      
+      parseAttributeType(xmlEventReader, startElement, JBossSAMLConstants.ATTRIBUTE.get(), attributeType);
+      
 
-      //Look for X500 Encoding
+      /*//Look for X500 Encoding
       QName x500EncodingName = new QName( JBossSAMLURIConstants.X500_NSURI.get(), 
             JBossSAMLConstants.ENCODING.get(), JBossSAMLURIConstants.X500_PREFIX.get() );
       Attribute x500EncodingAttr = startElement.getAttributeByName( x500EncodingName );
@@ -150,12 +153,64 @@
             attributeType.addAttributeValue( attributeValue ); 
          }
          else throw new RuntimeException( "Unknown tag:" + tag );
-      }
+      }*/
       
       return attributeType; 
    }
    
    /**
+    * Parse an {@code AttributeType}
+    * @param xmlEventReader 
+    * @throws ParsingException
+    */
+   public static void parseAttributeType( XMLEventReader xmlEventReader,
+         StartElement startElement, String rootTag, AttributeType attributeType ) throws ParsingException
+   {  
+      //Look for X500 Encoding
+      QName x500EncodingName = new QName( JBossSAMLURIConstants.X500_NSURI.get(), 
+            JBossSAMLConstants.ENCODING.get(), JBossSAMLURIConstants.X500_PREFIX.get() );
+      Attribute x500EncodingAttr = startElement.getAttributeByName( x500EncodingName );
+      
+      if( x500EncodingAttr != null )
+      {   
+         attributeType.getOtherAttributes().put( x500EncodingAttr.getName(), StaxParserUtil.getAttributeValue( x500EncodingAttr ));
+      } 
+      
+      Attribute friendlyName = startElement.getAttributeByName( new QName( JBossSAMLConstants.FRIENDLY_NAME.get() ));
+      if( friendlyName != null ) 
+         attributeType.setFriendlyName( StaxParserUtil.getAttributeValue( friendlyName ));
+      
+      Attribute nameFormat = startElement.getAttributeByName( new QName( JBossSAMLConstants.NAME_FORMAT.get() ));
+      if( nameFormat != null ) 
+         attributeType.setNameFormat( StaxParserUtil.getAttributeValue( nameFormat ));
+      
+      while( xmlEventReader.hasNext() )
+      {
+         XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+         if( xmlEvent instanceof EndElement )
+         {
+            EndElement end = StaxParserUtil.getNextEndElement(xmlEventReader);
+            if( StaxParserUtil.matches( end, rootTag ))
+               break;
+         }
+         startElement = StaxParserUtil.peekNextStartElement(xmlEventReader);
+         if( startElement == null )
+            break;
+         String tag = StaxParserUtil.getStartElementName(startElement);
+         
+         if( JBossSAMLConstants.ATTRIBUTE.get().equals( tag ))
+            break;
+         
+         if( JBossSAMLConstants.ATTRIBUTE_VALUE.get().equals( tag ) )
+         {
+            Object attributeValue = parseAttributeValue(xmlEventReader);
+            attributeType.addAttributeValue( attributeValue ); 
+         }
+         else throw new RuntimeException( "Unknown tag:" + tag );
+      }
+   }
+   
+   /**
     * Parse Attribute value
     * @param xmlEventReader
     * @return

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java	2011-02-10 17:03:12 UTC (rev 748)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java	2011-02-11 20:08:03 UTC (rev 749)
@@ -32,10 +32,12 @@
    ALLOW_CREATE( "AllowCreate" ),
    ARTIFACT_RESOLUTION_SERVICE( "ArtifactResolutionService" ),
    ASSERTION( "Assertion" ),
+   ASSERTION_CONSUMER_SERVICE( "AssertionConsumerService" ),
    ASSERTION_CONSUMER_SERVICE_URL( "AssertionConsumerServiceURL" ),
    ASSERTION_ID_REQUEST_SERVICE( "AssertionIDRequestService" ),
    ATTRIBUTE( "Attribute" ),
    ATTRIBUTE_AUTHORITY_DESCRIPTOR( "AttributeAuthorityDescriptor" ),
+   ATTRIBUTE_CONSUMING_SERVICE( "AttributeConsumingService" ),
    ATTRIBUTE_SERVICE( "AttributeService" ),
    ATTRIBUTE_STATEMENT( "AttributeStatement" ),
    ATTRIBUTE_VALUE( "AttributeValue" ),
@@ -49,7 +51,9 @@
    AUTHN_INSTANT( "AuthnInstant" ),
    AUTHN_REQUEST( "AuthnRequest" ),
    AUTHN_STATEMENT( "AuthnStatement" ),
+   AUTHN_REQUESTS_SIGNED( "AuthnRequestsSigned" ),
    BINDING( "Binding" ),
+   CACHE_DURATION( "cacheDuration" ),
    CONDITIONS( "Conditions" ),
    CONSENT( "Consent" ),
    DESTINATION( "Destination" ),
@@ -66,6 +70,7 @@
    INPUT_CONTEXT_ONLY( "InputContextOnly" ),
    IN_RESPONSE_TO( "InResponseTo" ),
    ISDEFAULT( "isDefault" ),
+   IS_REQUIRED( "isRequired" ),
    ISSUE_INSTANT( "IssueInstant" ),
    ISSUER( "Issuer" ),
    KEY_DESCRIPTOR( "KeyDescriptor" ),
@@ -95,13 +100,17 @@
    REQUESTED_AUTHN_CONTEXT( "RequestedAuthnContext" ),
    RECIPIENT( "Recipient" ),
    REQUEST( "Request" ),
+   REQUESTED_ATTRIBUTE( "RequestedAttribute" ),
    REQUEST_ABSTRACT( "RequestAbstract" ),
    RESPONSE( "Response" ),
    RESPONSE_LOCATION( "ResponseLocation" ),
    RETURN_CONTEXT( "ReturnContext" ),
    SESSION_INDEX( "SessionIndex" ),
+   SERVICE_NAME( "ServiceName" ),
+   SERVICE_DESCRIPTION( "ServiceDescription" ),
    SP_PROVIDED_ID( "SPProvidedID" ),
    SP_NAME_QUALIFIER( "SPNameQualifier" ),
+   SP_SSO_DESCRIPTOR( "SPSSODescriptor" ),
    SIGNATURE( "Signature" ),
    SIGNATURE_SHA1_WITH_DSA("http://www.w3.org/2000/09/xmldsig#dsa-sha1"),
    SIGNATURE_SHA1_WITH_RSA("http://www.w3.org/2000/09/xmldsig#rsa-sha1"),
@@ -117,10 +126,13 @@
    SUBJECT_CONFIRMATION( "SubjectConfirmation" ),
    SUBJECT_CONFIRMATION_DATA( "SubjectConfirmationData" ),
    TYPE( "type" ),
+   USE( "use" ),
    VALUE( "Value" ),
+   VALID_UNTIL( "validUntil" ),
    VERSION( "Version" ),
    VERSION_2_0("2.0"),
    WANT_AUTHN_REQUESTS_SIGNED( "WantAuthnRequestsSigned" ),
+   WANT_ASSERTIONS_SIGNED( "WantAssertionsSigned" ),
    XACML_AUTHZ_DECISION_QUERY( "XACMLAuthzDecisionQuery" ),
    XACML_AUTHZ_DECISION_QUERY_TYPE( "XACMLAuthzDecisionQueryType" ),
    XACML_AUTHZ_DECISION_STATEMENT_TYPE( "XACMLAuthzDecisionStatementType" ),

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/util/XMLTimeUtil.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/util/XMLTimeUtil.java	2011-02-10 17:03:12 UTC (rev 748)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/util/XMLTimeUtil.java	2011-02-11 20:08:03 UTC (rev 749)
@@ -152,6 +152,26 @@
    }
    
    /**
+    * Given a string, get the Duration object
+    * @param timeValue
+    * @return
+    * @throws ParsingException
+    */
+   public static Duration parseAsDuration( String timeValue ) throws ParsingException
+   {
+      DatatypeFactory factory = null;
+      try
+      {
+         factory = DatatypeFactory.newInstance();
+      }
+      catch (DatatypeConfigurationException e)
+      {
+         throw new ParsingException( e );
+      }
+      return factory.newDuration( Long.parseLong(timeValue));
+   }
+   
+   /**
     * Given a string representing xml time, parse into {@code XMLGregorianCalendar}
     * @param timeString
     * @return

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java	2011-02-10 17:03:12 UTC (rev 748)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java	2011-02-11 20:08:03 UTC (rev 749)
@@ -39,6 +39,7 @@
 import org.picketlink.identity.federation.core.util.StringUtil; 
 import org.picketlink.identity.federation.newmodel.saml.v2.assertion.AttributeType;
 import org.picketlink.identity.federation.newmodel.saml.v2.assertion.NameIDType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedNameType;
 
 /**
  * Base Class for the Stax writers for SAML
@@ -116,6 +117,14 @@
    {
       StaxUtil.writeStartElement(writer, ASSERTION_PREFIX, JBossSAMLConstants.ATTRIBUTE.get(), ASSERTION_NSURI.get());
 
+      writeAttributeTypeWithoutRootTag(attributeType); 
+      
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);
+   }
+   
+   public void writeAttributeTypeWithoutRootTag( AttributeType attributeType ) throws ProcessingException
+   {
       String attributeName = attributeType.getName();
       if (attributeName != null)
       {
@@ -168,8 +177,6 @@
                throw new RuntimeException("Unsupported attribute value:" + attributeValue.getClass().getName());
          }
       }
-      StaxUtil.writeEndElement(writer);
-      StaxUtil.flush(writer);
    }
    
    public void writeStringAttributeValue( String attributeValue ) throws ProcessingException
@@ -182,4 +189,14 @@
       StaxUtil.writeCharacters(writer, attributeValue ); 
       StaxUtil.writeEndElement(writer);
    }
+   
+
+   
+   public void writeLocalizedNameType( LocalizedNameType localizedNameType, QName startElement ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, startElement.getPrefix(), startElement.getLocalPart(), startElement.getNamespaceURI() );
+      StaxUtil.writeAttribute(writer,  new QName( JBossSAMLURIConstants.XML.get(), "lang", "xml" ),  localizedNameType.getLang() );
+      StaxUtil.writeCharacters(writer, localizedNameType.getValue() );
+      StaxUtil.writeEndElement(writer);
+   }
 }
\ No newline at end of file

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java	2011-02-10 17:03:12 UTC (rev 748)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java	2011-02-11 20:08:03 UTC (rev 749)
@@ -36,6 +36,7 @@
 import org.picketlink.identity.federation.newmodel.saml.v2.assertion.AttributeType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.AffiliationDescriptorType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.AttributeAuthorityDescriptorType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.AttributeConsumingServiceType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.AuthnAuthorityDescriptorType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EndpointType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
@@ -44,9 +45,11 @@
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.IDPSSODescriptorType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.IndexedEndpointType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.KeyDescriptorType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.KeyTypes;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedNameType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedURIType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.OrganizationType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.RequestedAttributeType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.SPSSODescriptorType;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.SSODescriptorType;
 import org.w3c.dom.Element;
@@ -74,6 +77,14 @@
       StaxUtil.writeNameSpace(writer, "ds", JBossSAMLURIConstants.XMLDSIG_NSURI.get() ); 
       
       StaxUtil.writeAttribute(writer, JBossSAMLConstants.ENTITY_ID.get(), entityDescriptor.getEntityID() );
+      if( entityDescriptor.getValidUntil() != null )
+      {
+         StaxUtil.writeAttribute(writer, JBossSAMLConstants.VALID_UNTIL.get(), entityDescriptor.getValidUntil().toString() );
+      }
+      if( entityDescriptor.getID() != null )
+      {
+         StaxUtil.writeAttribute(writer, JBossSAMLConstants.ID.get(), entityDescriptor.getID() );
+      }
       
       List<EDTChoiceType> choiceTypes = entityDescriptor.getChoiceType();
       for( EDTChoiceType edtChoice : choiceTypes )
@@ -91,7 +102,7 @@
             
             SPSSODescriptorType spSSO = edtDescChoice.getSpDescriptor();
             if( spSSO != null )
-               throw new RuntimeException( "NYI" );
+               write( spSSO );
             
             AttributeAuthorityDescriptorType attribAuth = edtDescChoice.getAttribDescriptor();
             if( attribAuth != null )
@@ -102,6 +113,8 @@
                throw new RuntimeException( "NYI" );
          }
       }
+      OrganizationType organization = entityDescriptor.getOrganization();
+      writeOrganization(organization);
       
       StaxUtil.writeEndElement(writer);
       StaxUtil.flush(writer); 
@@ -111,9 +124,53 @@
    {
       throw new RuntimeException( "should not called" );
    }
+   
    public void write( SPSSODescriptorType spSSODescriptor ) throws ProcessingException
    {
-      throw new RuntimeException( "NYI" );
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.SP_SSO_DESCRIPTOR.get(), METADATA_NSURI.get());
+      StaxUtil.writeAttribute(writer, new QName( JBossSAMLConstants.PROTOCOL_SUPPORT_ENUMERATION.get())
+      , spSSODescriptor.getProtocolSupportEnumeration().get(0) );
+
+      //Get the key descriptors
+      List<KeyDescriptorType> keyDescriptors = spSSODescriptor.getKeyDescriptor();
+      for( KeyDescriptorType keyDescriptor  :keyDescriptors )
+      { 
+         writeKeyDescriptor(keyDescriptor); 
+      }
+      
+      List<EndpointType> sloServices = spSSODescriptor.getSingleLogoutService();
+      for( EndpointType endpoint: sloServices )
+      {
+         writeSingleLogoutService(endpoint);
+      }
+      
+      
+      List<IndexedEndpointType> artifactResolutions = spSSODescriptor.getArtifactResolutionService();
+      for( IndexedEndpointType artifactResolution: artifactResolutions )
+      { 
+         writeArtifactResolutionService( artifactResolution );   
+      }
+      
+      List<String> nameIDFormats = spSSODescriptor.getNameIDFormat();
+      for( String nameIDFormat : nameIDFormats )
+      {
+         writeNameIDFormat(nameIDFormat);
+      }
+      
+      List<IndexedEndpointType> assertionConsumers = spSSODescriptor.getAssertionConsumerService();
+      for( IndexedEndpointType assertionConsumer: assertionConsumers )
+      { 
+         writeAssertionConsumerService( assertionConsumer );   
+      }
+      
+      List<AttributeConsumingServiceType> attributeConsumers = spSSODescriptor.getAttributeConsumingService();
+      for( AttributeConsumingServiceType attributeConsumer : attributeConsumers )
+      {
+         writeAttributeConsumingService(attributeConsumer);
+      }
+      
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer); 
    }
    
    public void write( IDPSSODescriptorType idpSSODescriptor ) throws ProcessingException
@@ -197,13 +254,65 @@
    {
       StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get(), METADATA_NSURI.get());
 
+      writeIndexedEndpointType(indexedEndpoint);  
+   }
+   
+   public void writeAssertionConsumerService( IndexedEndpointType indexedEndpoint ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ASSERTION_CONSUMER_SERVICE.get(), METADATA_NSURI.get());
+      writeIndexedEndpointType(indexedEndpoint);      
+   }
+   
+   public void writeIndexedEndpointType( IndexedEndpointType indexedEndpoint ) throws ProcessingException
+   {
       writeEndpointType( indexedEndpoint ); 
+      if( indexedEndpoint.isIsDefault() != null )
+         StaxUtil.writeAttribute(writer, JBossSAMLConstants.ISDEFAULT.get(), ""+ indexedEndpoint.isIsDefault() );
+
+      StaxUtil.writeAttribute(writer, JBossSAMLConstants.INDEX.get(), ""+ indexedEndpoint.getIndex() ); 
+
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);
+   }
+   
+   public void writeAttributeConsumingService( AttributeConsumingServiceType attributeConsumer ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ATTRIBUTE_CONSUMING_SERVICE.get(), METADATA_NSURI.get());
+ 
       
-      StaxUtil.writeAttribute(writer, JBossSAMLConstants.ISDEFAULT.get(), ""+ indexedEndpoint.isIsDefault() );
-      StaxUtil.writeAttribute(writer, JBossSAMLConstants.INDEX.get(), ""+ indexedEndpoint.getIndex() );
+      StaxUtil.writeAttribute(writer, JBossSAMLConstants.ISDEFAULT.get(), ""+ attributeConsumer.isIsDefault() );
+      StaxUtil.writeAttribute(writer, JBossSAMLConstants.INDEX.get(), ""+ attributeConsumer.getIndex() ); 
       
+      //Service Name 
+      List<LocalizedNameType> serviceNames = attributeConsumer.getServiceName();
+      for( LocalizedNameType serviceName: serviceNames )
+      { 
+         writeLocalizedNameType( serviceName, new QName(METADATA_NSURI.get(), JBossSAMLConstants.SERVICE_NAME.get(), 
+               METADATA_PREFIX )); 
+      }
+      
+      List<LocalizedNameType> serviceDescriptions = attributeConsumer.getServiceDescription();
+      for( LocalizedNameType serviceDescription:  serviceDescriptions )
+      { 
+         writeLocalizedNameType( serviceDescription, new QName(METADATA_NSURI.get(), JBossSAMLConstants.SERVICE_DESCRIPTION.get(), 
+               METADATA_PREFIX )); 
+      }
+      
+      List<RequestedAttributeType> requestedAttributes = attributeConsumer.getRequestedAttribute();
+      for( RequestedAttributeType requestedAttribute : requestedAttributes )
+      {
+         StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.REQUESTED_ATTRIBUTE.get(), METADATA_NSURI.get());
+         Boolean isRequired = requestedAttribute.isIsRequired();
+         if( isRequired != null )
+         {
+            StaxUtil.writeAttribute(writer, new QName( JBossSAMLConstants.IS_REQUIRED.get()), isRequired.toString() );
+         }
+         writeAttributeTypeWithoutRootTag(requestedAttribute);
+         StaxUtil.writeEndElement(writer);   
+      }
+      
       StaxUtil.writeEndElement(writer);
-      StaxUtil.flush(writer);   
+      StaxUtil.flush(writer); 
    }
    
    public void writeOrganization( OrganizationType org ) throws ProcessingException
@@ -255,6 +364,10 @@
       StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.KEY_DESCRIPTOR.get(),
             METADATA_NSURI.get());
       
+      KeyTypes keyTypes = keyDescriptor.getUse();
+      if( keyTypes != null )
+         StaxUtil.writeAttribute(writer, new QName( JBossSAMLConstants.USE.get()), keyTypes.toString() );
+      
       Element keyInfo = keyDescriptor.getKeyInfo();
       StaxUtil.writeDOMElement(writer, keyInfo);
       StaxUtil.writeEndElement(writer);

Added: federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java	                        (rev 0)
+++ federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/saml/v2/metadata/SAMLMetadataWriterUnitTestCase.java	2011-02-11 20:08:03 UTC (rev 749)
@@ -0,0 +1,65 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors. 
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.picketlink.test.identity.federation.core.saml.v2.metadata;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+
+import javax.xml.stream.XMLStreamWriter;
+
+import org.junit.Test;
+import org.picketlink.identity.federation.core.parsers.saml.SAMLParser;
+import org.picketlink.identity.federation.core.saml.v2.writers.SAMLMetadataWriter;
+import org.picketlink.identity.federation.core.util.StaxUtil;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
+
+
+/**
+ * Unit test the {@code SAMLMetadataWriter}
+ * @author Anil.Saldhana at redhat.com
+ * @since Feb 11, 2011
+ */
+public class SAMLMetadataWriterUnitTestCase
+{
+   @Test
+   public void testWriteSPSSODescriptor() throws Exception
+   {
+      String fileName = "saml2/metadata/sp-entitydescriptor.xml";
+      InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( fileName );
+      assertNotNull( is );
+      
+      SAMLParser parser = new SAMLParser();
+      EntityDescriptorType entityDesc = (EntityDescriptorType) parser.parse(is);
+      
+      ByteArrayOutputStream baos = new ByteArrayOutputStream();
+      
+      XMLStreamWriter  writer = StaxUtil.getXMLStreamWriter( baos );
+      
+      //write it back
+      SAMLMetadataWriter mdWriter = new SAMLMetadataWriter( writer );
+      mdWriter.writeEntityDescriptor( entityDesc ) ; 
+      
+      System.out.println( new String( baos.toByteArray() ));
+   }
+}
\ No newline at end of file

Modified: federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescriptor.xml
===================================================================
--- federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescriptor.xml	2011-02-10 17:03:12 UTC (rev 748)
+++ federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/sp-entitydescriptor.xml	2011-02-11 20:08:03 UTC (rev 749)
@@ -1,4 +1,8 @@
-<md:EntityDescriptor entityID="https://service.example.org/shibboleth" validUntil="2010-01-01T00:00:00Z">
+<md:EntityDescriptor entityID="https://service.example.org/shibboleth" validUntil="2010-01-01T00:00:00Z"
+    xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd"
+	>
 
   <md:SPSSODescriptor protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
 



More information about the jboss-cvs-commits mailing list