8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2005 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The contents of this file are subject to the terms
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * of the Common Development and Distribution License
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * (the License). You may not use this file except in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You can obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If applicable, add the following below the CDDL Header,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * with the fields enclosed by brackets [] replaced by
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * your own identifying information:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: SessionRequest.java,v 1.3 2008/06/25 05:41:31 qcheng Exp $
6c56bf78246f18c9c14c17ef3ed65065ce178ffdTom Rumsey * Portions Copyrighted 2011-2016 ForgeRock AS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This <code>SessionRequest</code> class represents a
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>SessionRequest</code> XML document. The <code>SessionRequest</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DTD is defined as the following:
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <?xml version="1.0">
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !DOCTYPE SessionRequest [
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT SessionRequest (GetSession |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * GetValidSessions |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DestroySession |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * AddSessionListener |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * AddSessionListenerOnAllSessions |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * SetProperty |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * GetSessionCount)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ATTLIST SessionRequest
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * vers CDATA #REQUIRED
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * reqid CDATA #REQUIRED>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !-- This attribute carries the requester identity info -->
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * requester CDATA #IMPLIED>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT GetSession (SessionID)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !-- This attribute indicates whether resets
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the latest access time -->
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * reset CDATA #REQUIRED>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT GetValidSessions (SessionID Pattern?)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT DestroySession (SessionID, DestroySessionID)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT Logout (SessionID)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT AddSessionListener (SessionID, URL)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT AddSessionListenerOnAllSessions (SessionID, URL)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT SetProperty (SessionID, Property)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ATTLIST Property
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * name CDATA #REQUIRED
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * value CDATA #REQUIRED>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT SessionID (#PCDATA)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT DestroySessionID (#PCDATA)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT URL (#PCDATA)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT GetSessionCount (SessionID, UUID)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT UUID (#PCDATA)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * < !ELEMENT Pattern (#PCDATA)>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static final int AddSessionListener = 4;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Constructors
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This constructor shall only be used at the client side to construct a
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>SessionRequest</code> object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param method The method ID of the <code>SessionRequest</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param sid The session ID required by the <code>SessionRequest</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param reset The flag to indicate whether this request needs to update
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the latest session access time.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public SessionRequest(int method, String sid, boolean reset) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster requestID = (new Integer(requestCount++)).toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This constructor is used by <code>SessionRequestParser</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to reconstruct a <code>SessionRequest</code> object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This method is used primarily at the server side to reconstruct a
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>SessionRequest</code> object based on the XML document received
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * from client. The DTD of this XML document is described above.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param xml The <code>SessionRequest</code> XML document String.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return <code>SessionRequest</code> object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static SessionRequest parseXML(String xml) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SessionRequestParser parser = new SessionRequestParser(xml);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the request version.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param version Request version.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the request version.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The request version.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the request ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param id Request ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the request ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The request ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the method ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param id Method ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the method ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The method ID.
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell * @return The method name.
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell return "GetSession";
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell return "GetValidSessions";
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell return "DestroySession";
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell return "Logout";
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell return "AddSessionListener";
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell return "SetProperty";
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell return "GetSessionCount";
786bac66d599daf6355e45e64da84c846a857552Craig McDonnell return "unknown";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the session ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param id Session ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the session ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return Session ID.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the requester.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param requester Session requester.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the requester
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return id Session requester.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the reset flag.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param reset <code>true</code> to update the latest session access time.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the reset flag.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The reset flag.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the ID of the session to be destroyed.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param id The ID of the session to be destroyed.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the ID of the session to be destroyed.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The ID of the session to be destroyed.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the notification URL.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param url The notification URL.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the notification URL.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The notification URL.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the property name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param name The property name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the property name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The property name.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the property value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param value The property value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the property value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The property value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the pattern value. Process escape chars in pattern with
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>CDATA</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param value The pattern value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster data = replaceIllegalChar(data, '&', AMPERSAND);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster data = replaceIllegalChar(data, '\'', APOSTROPHE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster data = replaceIllegalChar(data, '\"', QUOTATION);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster data = replaceIllegalChar(data, '<', LESSTHAN);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster data = replaceIllegalChar(data, '>', GREATERTHAN);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the pattern value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The pattern value.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster data = replaceEntityRef(data, APOSTROPHE, '\'');
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster data = replaceEntityRef(data, QUOTATION, '\"');
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster data = replaceEntityRef(data, GREATERTHAN, '>');
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sets the universal unique identifier.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param id The universal unique identifier.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns the universal unique identifier
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return The universal unique identifier
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Replacing illegal XML char with entity ref
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String replaceIllegalChar(String data, char ch, String replacement)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder buffer = new StringBuilder(data.length() * 4);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ((data != null) && (idx = data.indexOf(ch)) != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Replacing entity ref with original char
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String replaceEntityRef(String data, String ref, char ch) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder buffer = new StringBuilder(data.length());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This method translates the request to an XML document String based on the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>SessionRequest</code> DTD described above. The ID of the session
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to be destroyed has to be set for method <code>DestroySession</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The notification URL has to be set for both methods
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>AddSessionListener</code> and
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>AddSessionListenerOnAllSessions</code>. otherwise, the returns
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>null</code>.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return An XML String representing the request.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<SessionRequest vers=").append(QUOTE).append(requestVersion).
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster append(QUOTE).append(" reqid=").append(QUOTE).append(requestID).append(QUOTE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String data = Base64.encode(requester.getBytes("UTF8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(" requester=").append(QUOTE).append(data).append(QUOTE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (java.io.UnsupportedEncodingException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new IllegalArgumentException(e.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(QUOTE).append("true").append(QUOTE).append('>').append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append(QUOTE).append("false").append(QUOTE).append('>').append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<SessionID>").append(sessionID).append("</SessionID>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<SessionID>").append(sessionID).append("</SessionID>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<Pattern>").append(pattern).append("</Pattern>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<SessionID>").append(sessionID).append("</SessionID>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<DestroySessionID>").append(destroySessionID).append("</DestroySessionID>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<SessionID>").append(sessionID).append("</SessionID>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<SessionID>").append(sessionID).append("</SessionID>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<URL>").append(notificationURL).append("</URL>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("</AddSessionListener>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (propertyName == null || propertyValue == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<SessionID>").append(sessionID).append("</SessionID>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<Property name=").append(QUOTE).append(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster XMLUtils.escapeSpecialCharacters(propertyName)).append(QUOTE).
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster append(" value=").append(QUOTE).append(XMLUtils.escapeSpecialCharacters(propertyValue)).
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster append(QUOTE).append('>').append("</Property>").append(NL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<SessionID>").append(sessionID).append("</SessionID>")
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xml.append("<UUID>").append(uuid).append("</UUID>").append(NL);