/** * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2006 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: Status.java,v 1.2 2008/06/25 05:47:37 qcheng Exp $ * */ package com.sun.identity.saml.protocol; import com.sun.identity.shared.xml.XMLUtils; import com.sun.identity.saml.common.SAMLConstants; import com.sun.identity.saml.common.SAMLException; import com.sun.identity.saml.common.SAMLRequesterException; import com.sun.identity.saml.common.SAMLUtils; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * This class represents the Status element. It corresponds to * <samlp:StatusType> in SAML protocol schema. * * @supported.all.api */ public class Status { private StatusCode statusCode = null; private String statusMessage = null; private Element statusDetail = null; /** * This is the default constructor of Status. */ Status() { } /** * This constructor is used to construct a Status from a DOM element. * @param status An DOM Element that's rooted by <Status>. * @exception SAMLException when an error occurs. */ public Status(Element status) throws SAMLException { String tag = null; if (status == null) { SAMLUtils.debug.message("Status: null input."); throw new SAMLRequesterException( SAMLUtils.bundle.getString("nullInput")); } if (((tag = status.getLocalName()) == null) || (!tag.equals("Status"))) { SAMLUtils.debug.message("Status: wrong input."); throw new SAMLRequesterException( SAMLUtils.bundle.getString("wrongInput")); } NodeList nl = status.getChildNodes(); Node child; String childName; String message; int length = nl.getLength(); for (int k = 0; k < length; k++) { child = nl.item(k); if ((childName = child.getLocalName()) != null) { if (childName.equals("StatusCode")) { if (statusCode != null) { if (SAMLUtils.debug.messageEnabled()) { SAMLUtils.debug.message("Status: contained more" + " than one "); } throw new SAMLRequesterException( SAMLUtils.bundle.getString("moreElement")); } statusCode = new StatusCode((Element) child); } else if (childName.equals("StatusMessage")) { message = XMLUtils.getElementValue((Element) child); if ((message == null) || (message.length() == 0)) { SAMLUtils.debug.message("Status: Empty StatusMessage."); throw new SAMLRequesterException( SAMLUtils.bundle.getString("emptyElement")); } if (statusMessage != null) { if (SAMLUtils.debug.messageEnabled()) { SAMLUtils.debug.message("Status: included more " + "than one "); } throw new SAMLRequesterException( SAMLUtils.bundle.getString("moreElement")); } statusMessage = message; } else if (childName.equals("StatusDetail")) { if (statusDetail != null) { if (SAMLUtils.debug.messageEnabled()) { SAMLUtils.debug.message("Status: included more " + "than one "); } throw new SAMLRequesterException( SAMLUtils.bundle.getString("moreElement")); } // set statusDetail statusDetail = (Element) child; } else { if (SAMLUtils.debug.messageEnabled()) { SAMLUtils.debug.message("Status: contained wrong" + " element:" + childName); } throw new SAMLRequesterException( SAMLUtils.bundle.getString("wrongInput")); } } // if childName != null } // end for loop if (statusCode == null) { SAMLUtils.debug.message("Status: missing ."); throw new SAMLRequesterException( SAMLUtils.bundle.getString("missingElement")); } } /** * Constructor. * @param code StatusCode. * @param message A String that is the StatusMessage of the * response. It could be null when there is no * StatusMessage. * @param detail A DOM tree element that is the StatusDetail * of the response. It could be null when there is no * StatusDetail. * @throws SAMLException */ public Status(StatusCode code, String message, Element detail) throws SAMLException { if (code == null) { SAMLUtils.debug.message("Status: null input."); throw new SAMLRequesterException( SAMLUtils.bundle.getString("nullInput")); } statusCode = code; if ((message != null) && (message.length() == 0)) { SAMLUtils.debug.message("Status: Empty StatusMessage."); throw new SAMLRequesterException( SAMLUtils.bundle.getString("emptyElement")); } statusMessage = message; statusDetail = detail; } /** * Constructs a Status object from a StatusCode. * @param code StatusCode. * @throws SAMLException */ public Status(StatusCode code) throws SAMLException { if (code == null) { SAMLUtils.debug.message("Status: null input."); throw new SAMLRequesterException( SAMLUtils.bundle.getString("nullInput")); } statusCode = code; } /** * Gets the StatusCode of the Response. * @return StatusCode of the response. */ public StatusCode getStatusCode() { return statusCode; } /** * Returns the StatusMessage of the Response. * @return A String that represents the StatusMessage of the * response. null is returned when there is no * StatusMessage in the response. */ public String getStatusMessage() { return statusMessage; } /** * Gets the StatusDetail of the Response. * @return A DOM tree element that represents the StatusDetail * of the response. Null is returned if no StatusDetail * in the response. */ public Element getStatusDetail() { return statusDetail; } /** * This method translates the AssertionArtifact to an XML * document String based on the SAML schema. * * @return An XML String representing the AssertionArtifact. */ public String toString() { return toString(true, false); } /** * Creates a String representation of the <samlp:Status> * element. * @param includeNS Determines whether or not the namespace qualifier * is prepended to the Element when converted * @param declareNS Determines whether or not the namespace is declared * within the Element. * @return A string containing the valid XML for this element */ public String toString(boolean includeNS, boolean declareNS) { StringBuffer xml = new StringBuffer(200); String prefix = ""; String uri = ""; if (includeNS) { prefix = SAMLConstants.PROTOCOL_PREFIX; } if (declareNS) { uri = SAMLConstants.PROTOCOL_NAMESPACE_STRING; } xml.append("<").append(prefix).append("Status").append(uri). append(">\n").append(statusCode.toString(includeNS, false)); if (statusMessage != null) { xml.append("<").append(prefix).append("StatusMessage>"). append(statusMessage).append("\n"); } if (statusDetail != null) { xml.append("<").append(prefix).append("StatusDetail>\n"); NodeList nl = statusDetail.getChildNodes(); int len = nl.getLength(); for (int i = 0; i < len; i++) { xml.append(XMLUtils.print(nl.item(i))); } xml.append("\n"); } xml.append("\n"); return xml.toString(); } }