/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2005 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: SessionResponseParser.java,v 1.3 2008/06/25 05:41:31 qcheng Exp $ * * Portions Copyrighted 2015-2016 ForgeRock AS. */ package com.iplanet.dpro.session.share; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.sun.identity.shared.xml.XMLUtils; import com.iplanet.dpro.session.SessionException; /** * SessionResponseParser parses the SessionResponse * XML document and returns the SessionResponse object * */ class SessionResponseParser { /** * SessionResponse object being returned after parsing the * XML document */ private SessionResponse sessionResponse = null; /** * Document to be parsed */ Document document; /** * Constructs new SessionResponseParser * @param xmlDoc response document to be parsed */ public SessionResponseParser(Document xmlDoc) { document = xmlDoc; } /** * Constructs new SessionResponseParser * @param xmlString string representing the response * @exception RuntimeException when the SessionReponse object cannot be parsed */ public SessionResponseParser(String xmlString) { document = XMLUtils .toDOMDocument(xmlString, SessionRequestParser.debug); } /** * Parses the session reponse element. Please see file * SessionResponse.dtd for the corresponding DTD of the * SessionResponse. * * @return a SessionResponse object. */ public SessionResponse parseXML() throws SessionException { if (document == null) { return null; } // get document element Element elem = document.getDocumentElement(); sessionResponse = new SessionResponse(); // set session response attribute String temp = elem.getAttribute("vers"); sessionResponse.setResponseVersion(temp); // set session reqid temp = elem.getAttribute("reqid"); sessionResponse.setRequestID(temp); // check GetSession element NodeList nodelist = elem.getElementsByTagName("GetSession"); if (nodelist != null && nodelist.getLength() != 0) { sessionResponse.setMethodID(SessionRequest.GetSession); } // check GetActiveSessions element nodelist = elem.getElementsByTagName("GetActiveSessions"); if (nodelist != null && nodelist.getLength() != 0) { sessionResponse.setMethodID(SessionRequest.GetValidSessions); } // check DestroySession element nodelist = elem.getElementsByTagName("DestroySession"); if (nodelist != null && nodelist.getLength() != 0) { sessionResponse.setMethodID(SessionRequest.DestroySession); } // check Logout element nodelist = elem.getElementsByTagName("Logout"); if (nodelist != null && nodelist.getLength() != 0) { sessionResponse.setMethodID(SessionRequest.Logout); } // check AddSessionListener element nodelist = elem.getElementsByTagName("AddSessionListener"); if (nodelist != null && nodelist.getLength() != 0) { sessionResponse.setMethodID(SessionRequest.AddSessionListener); } // check SetProperty element nodelist = elem.getElementsByTagName("SetProperty"); if (nodelist != null && nodelist.getLength() != 0) { sessionResponse.setMethodID(SessionRequest.SetProperty); } // check GetSessionCount element nodelist = elem.getElementsByTagName("GetSessionCount"); if (nodelist != null && nodelist.getLength() != 0) { sessionResponse.setMethodID(SessionRequest.GetSessionCount); } // check COUNT element nodelist = elem.getElementsByTagName("SessionExpirationTimeInfo"); if (nodelist != null && nodelist.getLength() != 0) { parseAllSessionsGivenUUIDElements(nodelist); } // check Session element nodelist = elem.getElementsByTagName("Session"); if (nodelist != null && nodelist.getLength() != 0) { parseSessionElements(nodelist); } // check OK element nodelist = elem.getElementsByTagName("OK"); if (nodelist != null && nodelist.getLength() != 0) { sessionResponse.setBooleanFlag(true); } // check Exception element nodelist = elem.getElementsByTagName("Exception"); if (nodelist != null && nodelist.getLength() != 0) { Element exception = (Element) nodelist.item(0); sessionResponse.setException(SessionRequestParser .parseCDATA(exception)); } // check Status element nodelist = elem.getElementsByTagName("Status"); if (nodelist != null && nodelist.getLength() != 0) { String status = SessionRequestParser.parseCDATA((Element) nodelist .item(0)); try { sessionResponse.setStatus(Integer.parseInt(status)); } catch (NumberFormatException e) { SessionRequestParser.debug.error("SessionResponseParse : ", e); throw new SessionException(e.getMessage()); } } // return session reponse return sessionResponse; } /* * Parses all the Sessions for the given user. * * @param nodelist. */ private void parseAllSessionsGivenUUIDElements(NodeList nodelist) { // parse SessionExpirationTimeInfo one by one int len = nodelist.getLength(); for (int i = 0; i < len; i++) { // get one SessionExpirationTimeInfo element Element sess = (Element) nodelist.item(i); // parse one SessionExpirationTimeInfo element parseSessionExpirationTimeInfo(sess); } } /** * Parses all the Sessions Expiration for the given user. * * @param sess session element. */ private void parseSessionExpirationTimeInfo(Element sess) { String sid = null; Long expTime = null; // parse the attributes String temp = sess.getAttribute("sid"); if (temp != null) { sid = temp; } temp = sess.getAttribute("expTime"); if (temp != null) { expTime = new Long(temp); } // add to sessionResponse sessionResponse.addSessionForGivenUUID(sid, expTime); } /** * Parse Session Elements. * * @param nodelist NodeList of Session element. */ private void parseSessionElements(NodeList nodelist) { // parse session one by one int len = nodelist.getLength(); for (int i = 0; i < len; i++) { // get one Session element Element sess = (Element) nodelist.item(i); // parse one Session element SessionInfo sessionInfo = parseSessionElement(sess); // add to sessionResponse sessionResponse.addSessionInfo(sessionInfo); SessionRequestParser.debug.message("In parse session " + sessionInfo.toString()); } } /** * Parse one Session Element, it contains two attributes and properties. * * @param sess Session Element. * @return SessionInfo */ static SessionInfo parseSessionElement(Element sess) { SessionInfo sessionInfo = new SessionInfo(); // parse Session attributes String temp = sess.getAttribute("sid"); if (temp != null) { sessionInfo.setSessionID(temp); } temp = sess.getAttribute("stype"); if (temp != null) { sessionInfo.setSessionType(temp); } temp = sess.getAttribute("cid"); if (temp != null) { sessionInfo.setClientID(temp); } temp = sess.getAttribute("cdomain"); if (temp != null) { sessionInfo.setClientDomain(temp); } temp = sess.getAttribute("maxtime"); if (temp != null) { sessionInfo.setMaxTime(Long.parseLong(temp)); } temp = sess.getAttribute("maxidle"); if (temp != null) { sessionInfo.setMaxIdle(Long.parseLong(temp)); } temp = sess.getAttribute("maxcaching"); if (temp != null) { sessionInfo.setMaxCaching(Long.parseLong(temp)); } temp = sess.getAttribute("timeleft"); if (temp != null) { sessionInfo.setTimeLeft(Long.parseLong(temp)); } temp = sess.getAttribute("timeidle"); if (temp != null) { sessionInfo.setTimeIdle(Long.parseLong(temp)); } temp = sess.getAttribute("state"); if (temp != null) { sessionInfo.setState(temp); } // parse session properties NodeList properties = sess.getElementsByTagName("Property"); if (properties != null) { // parse all properties int p = properties.getLength(); for (int j = 0; j < p; j++) { // get Property element Element property = (Element) properties.item(j); // get property attributes String name = property.getAttribute("name"); if (name != null) { sessionInfo.getProperties().put(name, property .getAttribute("value")); } } } return sessionInfo; } }