SAMLPropertyXMLBuilder.java revision 4a2f0f0be43dfd4c1b490cbf3cc48b6ba6084b1c
/**
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2007 Sun Microsystems Inc. All Rights Reserved
*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* https://opensso.dev.java.net/public/CDDLv1.0.html or
* opensso/legal/CDDLv1.0.txt
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at opensso/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id: SAMLPropertyXMLBuilder.java,v 1.7 2009/10/15 00:02:02 asyhuang Exp $
*
*/
package com.sun.identity.console.federation;
import com.sun.identity.saml.common.SAMLConstants;
import com.sun.identity.console.base.model.AMAdminUtils;
import com.sun.identity.console.property.PropertyTemplate;
import com.sun.identity.console.property.PropertyXMLBuilderBase;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SAMLPropertyXMLBuilder
implements PropertyTemplate {
private static SAMLPropertyXMLBuilder instance =
new SAMLPropertyXMLBuilder ();
private static Map profiles = new HashMap (10);
private static List profileList = new ArrayList (5);
public static final String DESTINATION_ARTIFACT = "destinationArtifact";
public static final String DESTINATION_POST = "destinationPost";
public static final String SOURCE_ARTIFACT = "sourceArtifact";
public static final String SOURCE_POST = "sourcePost";
public static final String DESTINATION_SOAP = "destinationSoap";
private boolean allAttributesReadonly;
static {
String[] attrs = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.TARGET,
SAMLConstants.SAMLURL,
SAMLConstants.HOST_LIST,
SAMLConstants.SITEATTRIBUTEMAPPER,
SAMLConstants.NAMEIDENTIFIERMAPPER,
SAMLConstants.VERSION
};
String[] mand = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.TARGET,
SAMLConstants.SAMLURL,
SAMLConstants.HOST_LIST
};
SAMLProperty samlProp = new SAMLProperty (
DESTINATION_ARTIFACT, SAMLProperty.ROLE_DESTINATION,
SAMLProperty.METHOD_ARTIFACT, attrs, mand);
profiles.put (DESTINATION_ARTIFACT, samlProp);
profileList.add (samlProp);
}
static {
String[] attrs = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.TARGET,
SAMLConstants.POSTURL,
SAMLConstants.SITEATTRIBUTEMAPPER,
SAMLConstants.NAMEIDENTIFIERMAPPER,
SAMLConstants.VERSION
};
String[] mand = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.TARGET,
SAMLConstants.POSTURL
};
SAMLProperty samlProp = new SAMLProperty(
DESTINATION_POST, SAMLProperty.ROLE_DESTINATION,
SAMLProperty.METHOD_POST, attrs, mand);
profiles.put(DESTINATION_POST, samlProp);
profileList.add (samlProp);
}
static {
String[] attrs = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.SOAPUrl,
SAMLConstants.AUTHTYPE,
SAMLConstants.AUTH_UID,
SAMLConstants.AUTH_PASSWORD,
SAMLConstants.AUTH_PASSWORD + SAMLPropertyTemplate.CONFIRM_SUFFIX,
SAMLConstants.CERTALIAS,
SAMLConstants.ACCOUNTMAPPER,
SAMLConstants.VERSION
};
String[] mand = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.SOAPUrl
};
SAMLProperty samlProp = new SAMLProperty (
SOURCE_ARTIFACT, SAMLProperty.ROLE_SOURCE,
SAMLProperty.METHOD_ARTIFACT, attrs, mand);
profiles.put (SOURCE_ARTIFACT, samlProp);
profileList.add (samlProp);
}
static {
String[] attrs = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.ISSUER,
SAMLConstants.ACCOUNTMAPPER,
SAMLConstants.CERTALIAS
};
String[] mand = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.ISSUER
};
SAMLProperty samlProp = new SAMLProperty (
SOURCE_POST, SAMLProperty.ROLE_SOURCE,
SAMLProperty.METHOD_POST, attrs, mand);
profiles.put (SOURCE_POST, samlProp);
profileList.add (samlProp);
}
static {
String[] attrs = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.HOST_LIST,
SAMLConstants.ATTRIBUTEMAPPER,
SAMLConstants.ACTIONMAPPER,
SAMLConstants.CERTALIAS,
SAMLConstants.ISSUER,
SAMLConstants.VERSION
};
String[] mand = {
SAMLConstants.PARTNERNAME,
SAMLConstants.SOURCEID,
SAMLConstants.HOST_LIST
};
SAMLProperty samlProp = new SAMLProperty (
DESTINATION_SOAP, SAMLProperty.ROLE_DESTINATION,
SAMLProperty.METHOD_SOAP, attrs, mand);
profiles.put (DESTINATION_SOAP, samlProp);
profileList.add (samlProp);
}
/**
* get samlv1.x Instance.
*
* @return samlv1.x instance
*/
public static SAMLPropertyXMLBuilder getInstance() {
return instance;
}
/**
* get samlv1.x Property.
*
* @param name
* @return samlv1.x Property
*/
public static SAMLProperty getSAMLProperty(String name) {
return (SAMLProperty)profiles.get (name);
}
/**
* get samlv1.x attribute names
*
* @param samlProperties a list of saml properties
* @return Set a set of attributes
*/
public Set getAttributeNames (List samlProperties) {
Set attributes = new HashSet ();
for (Iterator i = samlProperties.iterator (); i.hasNext (); ) {
SAMLProperty p = (SAMLProperty)i.next ();
attributes.addAll (p.getAttributeNames ());
}
return attributes;
}
/**
* get samlv1.x Properties
*
* @param values a Map of attribute values
* @return List a list of SAMLProperty
*/
public List getSAMLProperties (Map values) {
List list = new ArrayList (values.size()*2);
Set attributeNames = AMAdminUtils.lowerCase (values.keySet ());
// for upgrade case, the old value won't have PARTNERNAME
// if we don't add PARTNERNAME to attributeNames, this function
// will return empty List.
attributeNames.add(SAMLConstants.PARTNERNAME.toLowerCase());
for (Iterator i = profileList.iterator (); i.hasNext (); ) {
SAMLProperty p = (SAMLProperty)i.next ();
if (attributeNames.containsAll (
AMAdminUtils.lowerCase (
p.getMandatoryAttributeNames ())))
{
list.add (p);
}
}
return list;
}
/**
* get samlv1.x Properties
*
* @param samlProperties a Map of attribute values.
* @return a set of SAMLProperty.
*/
public Set getMandatoryAttributeNames(List samlProperties) {
Set attributes = new HashSet ();
for (Iterator i = samlProperties.iterator (); i.hasNext (); ) {
SAMLProperty p = (SAMLProperty)i.next ();
attributes.addAll (p.getMandatoryAttributeNames ());
}
return attributes;
}
/**
* get samlv1.x trusted partner properties sheet, xml format.
*
* @param samlProperties a List of samlv1.x Properties
* @param edit boolean for readonly or editable
* @return String a string of saml trusted partner properties
*/
public String getXML (List samlProperties, boolean edit) {
StringBuffer buff = new StringBuffer ();
List commonAttributes = new ArrayList ();
List attributes = new ArrayList ();
if ((samlProperties != null) && !samlProperties.isEmpty ()) {
buff.append (PropertyXMLBuilderBase.getXMLDefinitionHeader())
.append (START_TAG);
getAttributes (samlProperties, commonAttributes, attributes);
buff.append (SAMLPropertyTemplate.getSection (
SAMLProperty.COMMON_SETTINGS));
if (edit && !allAttributesReadonly) {
buff.append (SAMLPropertyTemplate.EDIT_SETTING_XML);
}
for (Iterator i = commonAttributes.iterator (); i.hasNext (); ) {
buff.append (SAMLPropertyTemplate.getAttribute (
(String)i.next (), allAttributesReadonly));
}
buff.append (SECTION_END_TAG);
appendAttributes (buff, SAMLProperty.ROLE_DESTINATION,
samlProperties, attributes);
appendAttributes (buff, SAMLProperty.ROLE_SOURCE,
samlProperties, attributes);
buff.append (END_TAG);
}
return buff.toString ();
}
private void addAttributeForEachProfile (
StringBuffer buff,
SAMLProperty p,
List attributes
) {
List pAttributes = p.getAttributeNames ();
boolean isEmpty = true;
for (Iterator i = pAttributes.iterator (); i.hasNext (); ) {
String attrName = (String)i.next ();
if (attributes.contains (attrName)) {
isEmpty = false;
if (attrName.equals (SAMLConstants.ISSUER) &&
(p == profiles.get (DESTINATION_SOAP))
) {
buff.append ((allAttributesReadonly) ?
SAMLPropertyTemplate.DESTINATION_SOAP_ISSUER_XML_READONLY :
SAMLPropertyTemplate.DESTINATION_SOAP_ISSUER_XML);
} else {
buff.append (SAMLPropertyTemplate.getAttribute (attrName,
allAttributesReadonly));
}
}
}
if (isEmpty) {
buff.append (SAMLPropertyTemplate.NO_ATTRIBUTE_CC);
}
}
private void appendAttributes (
StringBuffer buff,
String role,
List samlProperties,
List attributes
) {
List selected = getSAMLProperty(role, samlProperties);
if (!selected.isEmpty ()) {
buff.append (SAMLPropertyTemplate.getSection (role));
for (Iterator i = selected.iterator (); i.hasNext (); ) {
SAMLProperty p = (SAMLProperty)i.next ();
buff.append (SAMLPropertyTemplate.getSection (
p.getBindMethod ()));
addAttributeForEachProfile (buff, p, attributes);
buff.append (SUBSECTION_END_TAG);
}
buff.append (SECTION_END_TAG);
}
}
private List getSAMLProperty(String role, List samlProperties) {
List selected = new ArrayList ();
for (Iterator iter = samlProperties.iterator (); iter.hasNext (); ) {
SAMLProperty p = (SAMLProperty)iter.next ();
if (p.getRole ().equals (role)) {
selected.add (p);
}
}
return selected;
}
private void getAttributes (
List samlProperties,
List common,
List allAttributes
) {
for (Iterator iter = samlProperties.iterator (); iter.hasNext (); ) {
SAMLProperty p = (SAMLProperty)iter.next ();
if (allAttributes.isEmpty ()) {
allAttributes.addAll (p.getAttributeNames ());
allAttributes.remove (SAMLConstants.PARTNERNAME);
common.add (SAMLConstants.PARTNERNAME);
allAttributes.remove (SAMLConstants.SOURCEID);
common.add (SAMLConstants.SOURCEID);
} else {
List pList = p.getAttributeNames ();
getCommonAttributes (pList, allAttributes, common);
}
}
}
private void getCommonAttributes (List list1, List master, List common) {
for (Iterator iter = list1.iterator (); iter.hasNext (); ) {
Object e = iter.next ();
if (!common.contains (e)) {
if (master.contains (e)) {
common.add (e);
master.remove (e);
} else {
master.add (e);
}
}
}
}
/**
* Set all all attribute values read only.
*
* @param flag true if all attribute values are read only.
*/
public void setAllAttributeReadOnly (boolean flag) {
allAttributesReadonly = flag;
}
}