[jboss-cvs] Picketlink SVN: r602 - in federation/trunk: picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata and 7 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Dec 15 17:02:43 EST 2010


Author: anil.saldhana at jboss.com
Date: 2010-12-15 17:02:42 -0500 (Wed, 15 Dec 2010)
New Revision: 602

Added:
   federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java
Modified:
   federation/trunk/picketlink-fed-api/src/main/java/org/picketlink/identity/federation/api/saml/v2/metadata/KeyDescriptorMetaDataBuilder.java
   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/saml/md/providers/MetaDataBuilderDelegate.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/constants/JBossSAMLURIConstants.java
   federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/metadata/store/FileBasedMetadataConfigurationStore.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/SAMLAssertionWriter.java
   federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/idp-entitydescriptor.xml
   federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java
   federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/servlets/saml/MetadataServlet.java
Log:
further metadata writing

Modified: federation/trunk/picketlink-fed-api/src/main/java/org/picketlink/identity/federation/api/saml/v2/metadata/KeyDescriptorMetaDataBuilder.java
===================================================================
--- federation/trunk/picketlink-fed-api/src/main/java/org/picketlink/identity/federation/api/saml/v2/metadata/KeyDescriptorMetaDataBuilder.java	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-api/src/main/java/org/picketlink/identity/federation/api/saml/v2/metadata/KeyDescriptorMetaDataBuilder.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -69,8 +69,9 @@
       if(isEncryptionKey)
          keyDescriptor.setUse(KeyTypes.ENCRYPTION); 
       
-      keyDescriptor.setKeyInfo(keyInfo);
+      throw new RuntimeException( "We need a dom element as key info" );
+      /*keyDescriptor.setKeyInfo(keyInfo);
       
-      return keyDescriptor;
+      return keyDescriptor;*/
    }
 }
\ No newline at end of file

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	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/metadata/SAMLEntityDescriptorParser.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -64,14 +64,10 @@
    { 
       StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
       StaxParserUtil.validate(startElement, EDT );
-      EntityDescriptorType entityDescriptorType = new EntityDescriptorType();
       
       Attribute entityID = startElement.getAttributeByName( new QName( "entityID" ));
       String entityIDValue = StaxParserUtil.getAttributeValue(entityID);
-      if( entityIDValue != null )
-      {
-         entityDescriptorType.setEntityID(entityIDValue);
-      }
+      EntityDescriptorType entityDescriptorType = new EntityDescriptorType( entityIDValue ); 
       
       //Get the Child Elements
       while( xmlEventReader.hasNext() )
@@ -127,9 +123,16 @@
    {
       StartElement startElement = StaxParserUtil.getNextStartElement( xmlEventReader );
       StaxParserUtil.validate(startElement, JBossSAMLConstants.IDP_SSO_DESCRIPTOR.get() );
+      
       List<String> protocolEnum = SAMLParserUtil.parseProtocolEnumeration(startElement);
       IDPSSODescriptorType idpSSODescriptor = new IDPSSODescriptorType( protocolEnum );
       
+      Attribute wantAuthnSigned = startElement.getAttributeByName( new QName( JBossSAMLConstants.WANT_AUTHN_REQUESTS_SIGNED.get() ) );
+      if( wantAuthnSigned != null )
+      {
+         idpSSODescriptor.setWantAuthnRequestsSigned( Boolean.parseBoolean( StaxParserUtil.getAttributeValue( wantAuthnSigned ))); 
+      } 
+      
       while( xmlEventReader.hasNext() )
       {
          XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
@@ -173,20 +176,8 @@
          else if( JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get().equals( localPart ))
          { 
             startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
-            Attribute bindingAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.BINDING.get() ) );
-            String binding = StaxParserUtil.getAttributeValue(bindingAttr);
+            EndpointType endpoint = getEndpointType(startElement); 
             
-            Attribute locationAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.LOCATION.get() ) );
-            String location = StaxParserUtil.getAttributeValue( locationAttr );
-            
-            EndpointType endpoint = new IndexedEndpointType( NetworkUtil.createURI( binding ), 
-                  NetworkUtil.createURI( location ));
-            Attribute responseLocation = startElement.getAttributeByName( new QName( JBossSAMLConstants.RESPONSE_LOCATION.get() ));
-            if( responseLocation != null )
-            {
-               endpoint.setResponseLocation( NetworkUtil.createURI( StaxParserUtil.getAttributeValue( responseLocation )));
-            } 
-            
             EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
             StaxParserUtil.validate( endElement, JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get() );
             
@@ -195,20 +186,8 @@
          else if( JBossSAMLConstants.SINGLE_SIGNON_SERVICE.get().equals( localPart ))
          { 
             startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
-            Attribute bindingAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.BINDING.get() ) );
-            String binding = StaxParserUtil.getAttributeValue(bindingAttr);
+            EndpointType endpoint = getEndpointType(startElement); 
             
-            Attribute locationAttr = startElement.getAttributeByName( new QName( JBossSAMLConstants.LOCATION.get() ) );
-            String location = StaxParserUtil.getAttributeValue( locationAttr );
-            
-            EndpointType endpoint = new IndexedEndpointType( NetworkUtil.createURI( binding ), 
-                  NetworkUtil.createURI( location ));
-            Attribute responseLocation = startElement.getAttributeByName( new QName( JBossSAMLConstants.RESPONSE_LOCATION.get() ));
-            if( responseLocation != null )
-            {
-               endpoint.setResponseLocation( NetworkUtil.createURI( StaxParserUtil.getAttributeValue( responseLocation )));
-            } 
-            
             EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
             StaxParserUtil.validate( endElement, JBossSAMLConstants.SINGLE_SIGNON_SERVICE.get() );
             
@@ -225,11 +204,28 @@
             idpSSODescriptor.addAttribute(attribute);  
          }
          else 
-            throw new RuntimeException( "Unknown " + localPart );
-         
+            throw new RuntimeException( "Unknown " + localPart ); 
       }
       return idpSSODescriptor;
    }
+
+   private EndpointType getEndpointType(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 );
+      
+      EndpointType endpoint = new IndexedEndpointType( NetworkUtil.createURI( binding ), 
+            NetworkUtil.createURI( location ));
+      Attribute responseLocation = startElement.getAttributeByName( new QName( JBossSAMLConstants.RESPONSE_LOCATION.get() ));
+      if( responseLocation != null )
+      {
+         endpoint.setResponseLocation( NetworkUtil.createURI( StaxParserUtil.getAttributeValue( responseLocation )));
+      }
+      return endpoint;
+   }
    
    private AttributeAuthorityDescriptorType parseAttributeAuthorityDescriptor( XMLEventReader xmlEventReader ) throws ParsingException
    {
@@ -316,19 +312,13 @@
          if( JBossSAMLConstants.ORGANIZATION_NAME.get().equals( localPart ))
          { 
             startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
-            Attribute lang = startElement.getAttributeByName( new QName( JBossSAMLURIConstants.XML.get(), "lang" ));
-            String langVal = StaxParserUtil.getAttributeValue(lang);
-            LocalizedNameType localName = new LocalizedNameType(langVal);
-            localName.setValue( StaxParserUtil.getElementText(xmlEventReader));
+            LocalizedNameType localName = getLocalizedName(xmlEventReader, startElement);
             org.addOrganizationName(localName);  
          }  
          else if( JBossSAMLConstants.ORGANIZATION_DISPLAY_NAME.get().equals( localPart ))
          { 
             startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
-            Attribute lang = startElement.getAttributeByName( new QName( JBossSAMLURIConstants.XML.get(), "lang" ));
-            String langVal = StaxParserUtil.getAttributeValue(lang);
-            LocalizedNameType localName = new LocalizedNameType(langVal);
-            localName.setValue( StaxParserUtil.getElementText(xmlEventReader));
+            LocalizedNameType localName = getLocalizedName(xmlEventReader, startElement);
             org.addOrganizationDisplayName( localName ) ;  
          }
          else if( JBossSAMLConstants.ORGANIZATION_URL.get().equals( localPart ))
@@ -341,9 +331,18 @@
             org.addOrganizationURL( localName ) ;  
          } 
          else 
-            throw new RuntimeException( "Unknown " + localPart );
-         
+            throw new RuntimeException( "Unknown " + localPart ); 
       }
       return org;
    }
+
+   private LocalizedNameType getLocalizedName(XMLEventReader xmlEventReader, StartElement startElement)
+         throws ParsingException
+   {
+      Attribute lang = startElement.getAttributeByName( new QName( JBossSAMLURIConstants.XML.get(), "lang" ));
+      String langVal = StaxParserUtil.getAttributeValue(lang);
+      LocalizedNameType localName = new LocalizedNameType(langVal);
+      localName.setValue( StaxParserUtil.getElementText(xmlEventReader));
+      return localName;
+   }
 }
\ No newline at end of file

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/md/providers/MetaDataBuilderDelegate.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/md/providers/MetaDataBuilderDelegate.java	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/md/providers/MetaDataBuilderDelegate.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -115,9 +115,10 @@
       
       EDTChoiceType choiceType = new EDTChoiceType(edtList);
       
-      EntityDescriptorType entity = new EntityDescriptorType();
+      throw new RuntimeException( "Unknown entity id" );
+      /*EntityDescriptorType entity = new EntityDescriptorType( " ");
       entity.addChoiceType(choiceType);
-      return entity; 
+      return entity; */
    }
    
    /**

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	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLConstants.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -54,6 +54,7 @@
    DESTINATION( "Destination" ),
    ENCODING( "Encoding" ),
    ENCRYPTED_ASSERTION( "EncryptedAssertion" ),
+   ENTITY_ID( "entityID" ),
    ENTITY_DESCRIPTOR( "EntityDescriptor" ),
    FORMAT( "Format" ),
    FRIENDLY_NAME( "FriendlyName" ),
@@ -65,6 +66,7 @@
    ISSUE_INSTANT( "IssueInstant" ),
    ISSUER( "Issuer" ),
    KEY_DESCRIPTOR( "KeyDescriptor" ),
+   LANG( "lang" ),
    LANG_EN("en"),
    LOCATION( "Location" ),
    LOGOUT_REQUEST( "LogoutRequest" ),
@@ -107,6 +109,7 @@
    VALUE( "Value" ),
    VERSION( "Version" ),
    VERSION_2_0("2.0"),
+   WANT_AUTHN_REQUESTS_SIGNED( "WantAuthnRequestsSigned" ),
    HTTP_POST_BINDING("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST");
    
    private String val;

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLURIConstants.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLURIConstants.java	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/constants/JBossSAMLURIConstants.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -45,6 +45,7 @@
    
    HOLDER_OF_KEY( "urn:oasis:names:tc:SAML:2.0:cm:holder-of-key" ),
    
+   METADATA_NSURI( "urn:oasis:names:tc:SAML:2.0:metadata" ),
    METADATA_HTTP_REDIRECT_BINDING("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"),
    
    NAMEID_FORMAT_TRANSIENT("urn:oasis:names:tc:SAML:2.0:nameid-format:transient"),

Modified: federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/metadata/store/FileBasedMetadataConfigurationStore.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/metadata/store/FileBasedMetadataConfigurationStore.java	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/metadata/store/FileBasedMetadataConfigurationStore.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -39,10 +39,14 @@
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Marshaller;
 import javax.xml.bind.Unmarshaller;
+import javax.xml.stream.XMLStreamWriter;
 
 import org.apache.log4j.Logger;
 import org.picketlink.identity.federation.core.constants.PicketLinkFederationConstants;
+import org.picketlink.identity.federation.core.exceptions.ProcessingException;
+import org.picketlink.identity.federation.core.saml.v2.writers.SAMLMetadataWriter;
 import org.picketlink.identity.federation.core.util.JAXBUtil; 
+import org.picketlink.identity.federation.core.util.StaxUtil;
 import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
 
 /**
@@ -192,13 +196,26 @@
     */
    public void persist(EntityDescriptorType entity, String id) throws IOException
    {
-      /*boolean isIDP = false;
+      boolean isIDP = false;
       boolean isSP = false;
       
       File persistedFile = validateIdAndReturnMDFile(id);
       
-      ObjectFactory of = new ObjectFactory();
+      try
+      {
+         XMLStreamWriter streamWriter = StaxUtil.getXMLStreamWriter( new FileOutputStream( persistedFile ));
+         SAMLMetadataWriter writer = new SAMLMetadataWriter( streamWriter );
+         
+         writer.writeEntityDescriptor(entity);
+      }
+      catch (ProcessingException e)
+      {
+         throw new RuntimeException( e );
+      }
       
+      
+      /*ObjectFactory of = new ObjectFactory();
+      
       JAXBElement<?> jentity = of.createEntityDescriptor(entity);
       
       Marshaller m;
@@ -212,11 +229,14 @@
          IOException ioe =new IOException(e.getLocalizedMessage());
          ioe.initCause(e);
          throw ioe;
-      } 
+      }*/ 
       if(trace) log.trace("Persisted into " + persistedFile.getPath());
+       
+
+      throw new RuntimeException(); 
       
-      //We need to figure out whether this is sp or idp from the entity data
-      List<RoleDescriptorType> roleDescriptorTypes = entity.getRoleDescriptorOrIDPSSODescriptorOrSPSSODescriptor();
+      /*//We need to figure out whether this is sp or idp from the entity data
+      List<RoleDescriptorType> roleDescriptorTypes = entity..getRoleDescriptorOrIDPSSODescriptorOrSPSSODescriptor();
       for( RoleDescriptorType rdt: roleDescriptorTypes )
       {
          if( rdt instanceof IDPSSODescriptorType )
@@ -238,9 +258,8 @@
       else if( isIDP )
       {
          addIdentityProvider( id);
-      }*/
-      
-      throw new RuntimeException(); 
+      }
+      */ 
    }
 
    /**

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	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/BaseWriter.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -21,15 +21,23 @@
  */
 package org.picketlink.identity.federation.core.saml.v2.writers;
 
+import static org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants.ASSERTION_NSURI;
+
 import java.net.URI;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamWriter;
 
 import org.picketlink.identity.federation.core.exceptions.ProcessingException;
 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.util.StaxUtil;
 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;
 
 /**
@@ -93,4 +101,82 @@
       StaxUtil.writeEndElement( writer); 
       StaxUtil.flush( writer ); 
    }
+   
+   /**
+    * Write an {@code AttributeType} to stream
+    * 
+    * @param attributeType
+    * @param out
+    * @throws ProcessingException
+    */
+   public void write(AttributeType attributeType) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, ASSERTION_PREFIX, JBossSAMLConstants.ATTRIBUTE.get(), ASSERTION_NSURI.get());
+
+      String attributeName = attributeType.getName();
+      if (attributeName != null)
+      {
+         StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME.get(), attributeName);
+      }
+
+      String friendlyName = attributeType.getFriendlyName();
+      if (StringUtil.isNotNull(friendlyName))
+      {
+         StaxUtil.writeAttribute(writer, JBossSAMLConstants.FRIENDLY_NAME.get(), friendlyName);
+      }
+
+      String nameFormat = attributeType.getNameFormat();
+      if (StringUtil.isNotNull(nameFormat))
+      {
+         StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME_FORMAT.get(), nameFormat);
+      }
+
+      // Take care of other attributes such as x500:encoding
+      Map<QName, String> otherAttribs = attributeType.getOtherAttributes();
+      if (otherAttribs != null)
+      {
+         List<String> nameSpacesDealt = new ArrayList<String>();
+
+         Iterator<QName> keySet = otherAttribs.keySet().iterator();
+         while (keySet != null && keySet.hasNext())
+         {
+            QName qname = keySet.next();
+            String ns = qname.getNamespaceURI();
+            if (!nameSpacesDealt.contains(ns))
+            {
+               StaxUtil.writeNameSpace(writer, qname.getPrefix(), ns);
+               nameSpacesDealt.add(ns);
+            }
+            String attribValue = otherAttribs.get(qname);
+            StaxUtil.writeAttribute(writer, qname, attribValue);
+         }
+      }
+
+      List<Object> attributeValues = attributeType.getAttributeValue();
+      if (attributeValues != null)
+      {
+         for (Object attributeValue : attributeValues)
+         {
+            if (attributeValue instanceof String)
+            {
+               writeStringAttributeValue( (String) attributeValue ); 
+            }
+            else
+               throw new RuntimeException("Unsupported attribute value:" + attributeValue.getClass().getName());
+         }
+      }
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);
+   }
+   
+   public void writeStringAttributeValue( String attributeValue ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, ASSERTION_PREFIX, JBossSAMLConstants.ATTRIBUTE_VALUE.get(), ASSERTION_NSURI.get());
+
+      StaxUtil.writeNameSpace(writer, "xsi", JBossSAMLURIConstants.XSI_NSURI.get());
+      StaxUtil.writeNameSpace(writer, "xs", JBossSAMLURIConstants.XMLSCHEMA_NSURI.get());
+      StaxUtil.writeAttribute(writer, JBossSAMLURIConstants.XSI_NSURI.get(), "type", "xs:string");
+      StaxUtil.writeCharacters(writer, attributeValue ); 
+      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/SAMLAssertionWriter.java
===================================================================
--- federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLAssertionWriter.java	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLAssertionWriter.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -20,10 +20,7 @@
 import static org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants.ASSERTION_NSURI;
 
 import java.net.URI;
-import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import javax.xml.datatype.XMLGregorianCalendar;
@@ -32,7 +29,6 @@
 
 import org.picketlink.identity.federation.core.exceptions.ProcessingException;
 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.util.StaxUtil;
 import org.picketlink.identity.federation.core.util.StringUtil;
 import org.picketlink.identity.federation.core.wstrust.WSTrustConstants;
@@ -299,81 +295,8 @@
       StaxUtil.flush(writer);
    }
 
-   /**
-    * Write an {@code AttributeType} to stream
-    * 
-    * @param attributeType
-    * @param out
-    * @throws ProcessingException
-    */
-   public void write(AttributeType attributeType) throws ProcessingException
-   {
-      StaxUtil.writeStartElement(writer, ASSERTION_PREFIX, JBossSAMLConstants.ATTRIBUTE.get(), ASSERTION_NSURI.get());
+   
 
-      String attributeName = attributeType.getName();
-      if (attributeName != null)
-      {
-         StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME.get(), attributeName);
-      }
-
-      String friendlyName = attributeType.getFriendlyName();
-      if (StringUtil.isNotNull(friendlyName))
-      {
-         StaxUtil.writeAttribute(writer, JBossSAMLConstants.FRIENDLY_NAME.get(), friendlyName);
-      }
-
-      String nameFormat = attributeType.getNameFormat();
-      if (StringUtil.isNotNull(nameFormat))
-      {
-         StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME_FORMAT.get(), nameFormat);
-      }
-
-      // Take care of other attributes such as x500:encoding
-      Map<QName, String> otherAttribs = attributeType.getOtherAttributes();
-      if (otherAttribs != null)
-      {
-         List<String> nameSpacesDealt = new ArrayList<String>();
-
-         Iterator<QName> keySet = otherAttribs.keySet().iterator();
-         while (keySet != null && keySet.hasNext())
-         {
-            QName qname = keySet.next();
-            String ns = qname.getNamespaceURI();
-            if (!nameSpacesDealt.contains(ns))
-            {
-               StaxUtil.writeNameSpace(writer, qname.getPrefix(), ns);
-               nameSpacesDealt.add(ns);
-            }
-            String attribValue = otherAttribs.get(qname);
-            StaxUtil.writeAttribute(writer, qname, attribValue);
-         }
-      }
-
-      List<Object> attributeValues = attributeType.getAttributeValue();
-      if (attributeValues != null)
-      {
-         for (Object attributeValue : attributeValues)
-         {
-            if (attributeValue instanceof String)
-            {
-               StaxUtil.writeStartElement(writer, ASSERTION_PREFIX, JBossSAMLConstants.ATTRIBUTE_VALUE.get(),
-                     ASSERTION_NSURI.get());
-
-               StaxUtil.writeNameSpace(writer, "xsi", JBossSAMLURIConstants.XSI_NSURI.get());
-               StaxUtil.writeNameSpace(writer, "xs", JBossSAMLURIConstants.XMLSCHEMA_NSURI.get());
-               StaxUtil.writeAttribute(writer, JBossSAMLURIConstants.XSI_NSURI.get(), "type", "xs:string");
-               StaxUtil.writeCharacters(writer, (String) attributeValue);
-
-               StaxUtil.writeEndElement(writer);
-            }
-            else
-               throw new RuntimeException("Unsupported attribute value:" + attributeValue.getClass().getName());
-         }
-      }
-      StaxUtil.writeEndElement(writer);
-      StaxUtil.flush(writer);
-   }
-
    /**
     * write an {@code SubjectType} to stream
     * 

Added: 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	                        (rev 0)
+++ federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/saml/v2/writers/SAMLMetadataWriter.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -0,0 +1,287 @@
+/*
+ * 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.identity.federation.core.saml.v2.writers;
+
+import static org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants.METADATA_NSURI;
+
+import java.net.URI;
+import java.util.List;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamWriter;
+
+import org.picketlink.identity.federation.core.exceptions.ProcessingException;
+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.util.StaxUtil;
+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.EndpointType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.EntityDescriptorType;
+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.LocalizedNameType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.LocalizedURIType;
+import org.picketlink.identity.federation.newmodel.saml.v2.metadata.OrganizationType;
+import org.w3c.dom.Element;
+
+/**
+ * Write the SAML metadata elements
+ * @author Anil.Saldhana at redhat.com
+ * @since Dec 14, 2010
+ */
+public class SAMLMetadataWriter extends BaseWriter
+{
+   private String METADATA_PREFIX = "md";
+
+   public SAMLMetadataWriter(XMLStreamWriter writer) throws ProcessingException
+   {
+      super(writer); 
+   }
+   
+   public void writeEntityDescriptor( EntityDescriptorType entityDescriptor ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ENTITY_DESCRIPTOR.get(), METADATA_NSURI.get());
+      StaxUtil.writeDefaultNameSpace(writer, JBossSAMLURIConstants.METADATA_NSURI.get() );
+      StaxUtil.writeNameSpace(writer, "saml", JBossSAMLURIConstants.ASSERTION_NSURI.get() );
+
+      StaxUtil.writeNameSpace(writer, "ds", JBossSAMLURIConstants.XMLDSIG_NSURI.get() ); 
+      StaxUtil.writeAttribute(writer, JBossSAMLConstants.ENTITY_ID.get(), entityDescriptor.getEntityID() );
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer); 
+   }
+   
+   public void writeIDPSSODescriptor( IDPSSODescriptorType idpSSODescriptor ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.IDP_SSO_DESCRIPTOR.get(), METADATA_NSURI.get());
+      
+      boolean wantsAuthnRequestsSigned = idpSSODescriptor.isWantAuthnRequestsSigned();
+      StaxUtil.writeAttribute(writer, new QName( JBossSAMLConstants.WANT_AUTHN_REQUESTS_SIGNED.get() ), "" + wantsAuthnRequestsSigned );
+      
+      writeProtocolSupportEnumeration( idpSSODescriptor.getProtocolSupportEnumeration() );
+      
+      List<IndexedEndpointType> artifactResolutionServices = idpSSODescriptor.getArtifactResolutionService();
+      for( IndexedEndpointType indexedEndpoint: artifactResolutionServices )
+      {
+         writeArtifactResolutionService( indexedEndpoint );
+      }
+      
+      List<EndpointType> sloServices = idpSSODescriptor.getSingleLogoutService();
+      for( EndpointType endpoint: sloServices )
+      {
+         writeSingleLogoutService(endpoint);
+      }
+      
+      List<EndpointType> ssoServices = idpSSODescriptor.getSingleSignOnService();
+      for( EndpointType endpoint: ssoServices )
+      {
+         writeSingleSignOnService( endpoint );
+      }
+      
+      List<String> nameIDFormats = idpSSODescriptor.getNameIDFormat();
+      for( String nameIDFormat: nameIDFormats )
+      {
+         writeNameIDFormat( nameIDFormat );
+      }
+      
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);  
+   }
+   
+   public void writeAttributeAuthorityDescriptor( AttributeAuthorityDescriptorType attributeAuthority ) throws ProcessingException
+   { 
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ATTRIBUTE_AUTHORITY_DESCRIPTOR.get(),
+            METADATA_NSURI.get());
+      
+      writeProtocolSupportEnumeration( attributeAuthority.getProtocolSupportEnumeration() );
+      
+      List<KeyDescriptorType> keyDescriptorList = attributeAuthority.getKeyDescriptor();
+      for( KeyDescriptorType keyDescriptor: keyDescriptorList )
+      {
+         writeKeyDescriptor( keyDescriptor );
+      }
+      
+      List<EndpointType> attributeServices = attributeAuthority.getAttributeService();
+      for( EndpointType endpoint : attributeServices )
+      {
+         writeAttributeService( endpoint );
+      }
+      
+      List<String> nameIDFormats = attributeAuthority.getNameIDFormat();
+      for( String nameIDFormat: nameIDFormats )
+      { 
+         writeNameIDFormat( nameIDFormat );
+      }
+      
+      List<AttributeType> attributes = attributeAuthority.getAttribute();
+      for( AttributeType attributeType: attributes )
+      {
+         write( attributeType );
+      }
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);   
+   }
+   
+   public void writeArtifactResolutionService( IndexedEndpointType indexedEndpoint ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get(), METADATA_NSURI.get());
+
+      writeEndpointType( indexedEndpoint ); 
+      
+      StaxUtil.writeAttribute(writer, JBossSAMLConstants.ISDEFAULT.get(), ""+ indexedEndpoint.isIsDefault() );
+      StaxUtil.writeAttribute(writer, JBossSAMLConstants.INDEX.get(), ""+ indexedEndpoint.getIndex() );
+      
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);   
+   }
+   
+   public void writeOrganization( OrganizationType org ) throws ProcessingException
+   { 
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ORGANIZATION.get(),
+            METADATA_NSURI.get());
+      
+      //Write the name
+      List<LocalizedNameType> nameList = org.getOrganizationName();
+      for( LocalizedNameType localName: nameList )
+      {
+         StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ORGANIZATION_NAME.get(),
+               METADATA_NSURI.get());
+         
+         writeLocalizedType( localName ); 
+      }
+      
+      //Write the display name
+      List<LocalizedNameType> displayNameList = org.getOrganizationDisplayName();
+      for( LocalizedNameType localName: displayNameList )
+      {
+         StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ORGANIZATION_DISPLAY_NAME.get(),
+               METADATA_NSURI.get());
+         writeLocalizedType( localName ); 
+      }
+      
+      //Write the url
+      List<LocalizedURIType> uriList = org.getOrganizationURL();
+      for( LocalizedURIType uri: uriList )
+      {
+         StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ORGANIZATION_URL.get(),
+               METADATA_NSURI.get());
+         
+         String lang = uri.getLang();
+         String val = uri.getValue().toString();
+         StaxUtil.writeAttribute(writer, new QName( JBossSAMLURIConstants.XML.get(), JBossSAMLConstants.LANG.get(), "xml" ), lang );
+         
+         StaxUtil.writeCharacters(writer, val );
+         
+         StaxUtil.writeEndElement(writer);
+      }
+
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);
+   }
+   
+   public void writeKeyDescriptor( KeyDescriptorType keyDescriptor ) throws ProcessingException
+   { 
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.KEY_DESCRIPTOR.get(),
+            METADATA_NSURI.get());
+      
+      Element keyInfo = keyDescriptor.getKeyInfo();
+      StaxUtil.writeDOMElement(writer, keyInfo);
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);
+   }
+   
+   public void writeAttributeService( EndpointType endpoint ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.ATTRIBUTE_SERVICE.get(), METADATA_NSURI.get());
+      
+      writeEndpointType( endpoint );
+      
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);
+   }
+   
+   public void writeSingleLogoutService( EndpointType endpoint ) throws ProcessingException
+   {
+     StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.SINGLE_LOGOUT_SERVICE.get(), METADATA_NSURI.get());
+      
+      writeEndpointType( endpoint );
+      
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);
+   }
+   
+   public void writeSingleSignOnService( EndpointType endpoint ) throws ProcessingException
+   {
+     StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.SINGLE_SIGNON_SERVICE.get(), METADATA_NSURI.get());
+      
+      writeEndpointType( endpoint );
+      
+      StaxUtil.writeEndElement(writer);
+      StaxUtil.flush(writer);
+   }
+   
+   private void writeProtocolSupportEnumeration( List<String> protoEnum ) throws ProcessingException
+   {
+      if( protoEnum.size() > 0 )
+      {
+         StringBuilder sb = new StringBuilder();
+         for( String str: protoEnum )
+         {
+            sb.append(str).append(" ");
+         }
+         
+         StaxUtil.writeAttribute(writer, new QName( JBossSAMLConstants.PROTOCOL_SUPPORT_ENUMERATION.get() ), sb.toString().trim() ); 
+      }
+   }
+   
+   private void writeEndpointType( EndpointType endpoint ) throws ProcessingException
+   {
+      StaxUtil.writeAttribute(writer, JBossSAMLConstants.BINDING.get(), endpoint.getBinding().toString() );
+      StaxUtil.writeAttribute(writer, JBossSAMLConstants.LOCATION.get(), endpoint.getLocation().toString() );
+      
+      URI responseLocation = endpoint.getResponseLocation();
+      if( responseLocation != null )
+      {
+         StaxUtil.writeAttribute(writer, JBossSAMLConstants.RESPONSE_LOCATION.get(), responseLocation.toString() );
+      }
+   }
+   
+   private void writeLocalizedType( LocalizedNameType localName ) throws ProcessingException
+   {
+      String lang = localName.getLang();
+      String val = localName.getValue();
+      StaxUtil.writeAttribute(writer, new QName( JBossSAMLURIConstants.XML.get(), JBossSAMLConstants.LANG.get(), "xml" ), lang );
+      
+      StaxUtil.writeCharacters(writer, val );
+      
+      StaxUtil.writeEndElement(writer);
+   }
+   
+   private void writeNameIDFormat( String nameIDFormat ) throws ProcessingException
+   {
+      StaxUtil.writeStartElement(writer, METADATA_PREFIX, JBossSAMLConstants.NAMEID_FORMAT.get(), METADATA_NSURI.get());
+
+      StaxUtil.writeCharacters(writer, nameIDFormat );
+      StaxUtil.writeEndElement(writer);
+   }
+}
\ No newline at end of file

Modified: federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/idp-entitydescriptor.xml
===================================================================
--- federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/idp-entitydescriptor.xml	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-core/src/test/resources/saml2/metadata/idp-entitydescriptor.xml	2010-12-15 22:02:42 UTC (rev 602)
@@ -64,7 +64,8 @@
 
 	</AttributeAuthorityDescriptor>
 
-	<Organization><OrganizationName xml:lang="en">Example
+	<Organization>
+	    <OrganizationName xml:lang="en">Example
 			Organization, Ltd.
 		</OrganizationName>
 		<OrganizationDisplayName xml:lang="en">Example

Modified: federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java
===================================================================
--- federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-fed-model/src/main/java/org/picketlink/identity/federation/newmodel/saml/v2/metadata/EntityDescriptorType.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -162,6 +162,10 @@
 
    protected String id;
 
+   public EntityDescriptorType( String entityID )
+   {
+      this.entityID = entityID;
+   }
 
    /**
     * Gets the value of the signature property.
@@ -298,18 +302,6 @@
    }
 
    /**
-    * Sets the value of the entityID property.
-    * 
-    * @param value
-    *     allowed object is
-    *     {@link String }
-    *     
-    */
-   public void setEntityID(String value) {
-      this.entityID = value;
-   }
-
-   /**
     * Gets the value of the validUntil property.
     * 
     * @return

Modified: federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/servlets/saml/MetadataServlet.java
===================================================================
--- federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/servlets/saml/MetadataServlet.java	2010-12-14 23:10:57 UTC (rev 601)
+++ federation/trunk/picketlink-web/src/main/java/org/picketlink/identity/federation/web/servlets/saml/MetadataServlet.java	2010-12-15 22:02:42 UTC (rev 602)
@@ -193,7 +193,7 @@
    
    private void updateKeyDescriptor(EntityDescriptorType entityD, KeyDescriptorType keyD)
    {
-     List<EDTDescriptorChoiceType> objs = entityD.getChoiceType().getDescriptors();
+     List<EDTDescriptorChoiceType> objs = entityD.getChoiceType().get(0).getDescriptors();
      if(objs != null)
      {
         for(EDTDescriptorChoiceType roleD: objs)



More information about the jboss-cvs-commits mailing list