package org.apereo.cas.support.saml.util;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apereo.cas.support.saml.OpenSamlConfigBean;
import org.opensaml.saml.common.xml.SAMLConstants;
import org.opensaml.saml.saml2.core.Response;
import org.opensaml.saml.saml2.core.Status;
import org.opensaml.saml.saml2.core.StatusCode;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import java.lang.reflect.Field;
/**
* This is {@link GoogleSaml20ObjectBuilder} that
* attempts to build the saml response. QName based on the spec described here:
* https://developers.google.com/google-apps/sso/saml_reference_implementation_web#samlReferenceImplementationWebSetupChangeDomain
*
* @author Misagh Moayyed mmoayyed@unicon.net
* @since 4.1.0
*/
public class GoogleSaml20ObjectBuilder extends AbstractSaml20ObjectBuilder {
private static final long serialVersionUID = 2979638064754730668L;
public GoogleSaml20ObjectBuilder(final OpenSamlConfigBean configBean) {
super(configBean);
}
@Override
public QName getSamlObjectQName(final Class objectType) throws RuntimeException {
try {
final Field f = objectType.getField(DEFAULT_ELEMENT_LOCAL_NAME_FIELD);
final String name = f.get(null).toString();
if (objectType.equals(Response.class) || objectType.equals(Status.class)
|| objectType.equals(StatusCode.class)) {
return new QName(SAMLConstants.SAML20P_NS, name, "samlp");
}
return new QName(SAMLConstants.SAML20_NS, name, XMLConstants.DEFAULT_NS_PREFIX);
} catch (final Exception e) {
throw new IllegalStateException("Cannot access field " + objectType.getName() + '.' + DEFAULT_ELEMENT_LOCAL_NAME_FIELD);
}
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
return new EqualsBuilder().isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder().toHashCode();
}
}