a4544a5a0e622ef69e38641f87ab1b5685e05911Phill Cunnington/*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
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 *
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 * opensso/legal/CDDLv1.0.txt
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * permission and limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * When distributing Covered Code, include this CDDL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Header Notice in each file and include the License file
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at opensso/legal/CDDLv1.0.txt.
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 *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * $Id: ResourceResultCache.java,v 1.21 2010/01/21 22:18:01 dillidorai Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
a4544a5a0e622ef69e38641f87ab1b5685e05911Phill Cunnington * Portions Copyrighted 2015 ForgeRock AS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.policy.client;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.iplanet.am.util.Cache;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.iplanet.am.util.SystemProperties;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.dpro.session.Session;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.dpro.session.SessionException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.dpro.session.SessionID;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.client.AlreadyRegisteredException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.client.PLLClient;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.client.SendRequestException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.share.Request;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.share.RequestSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.comm.share.Response;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.services.naming.URLNotFoundException;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.iplanet.services.naming.WebtopNaming;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.iplanet.sso.SSOException;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.iplanet.sso.SSOToken;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.iplanet.sso.SSOTokenEvent;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.iplanet.sso.SSOTokenListener;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.iplanet.sso.SSOTokenManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.common.HttpURLConnectionManager;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.idm.AMIdentity;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.idm.IdUtils;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.ActionDecision;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.PolicyDecision;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.PolicyException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.PolicyUtils;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.sun.identity.policy.ResBundleUtils;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.ResourceMatch;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.ResourceResult;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.interfaces.ResourceName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.AdvicesHandleableByAMRequest;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.AdvicesHandleableByAMResponse;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.PolicyChangeNotification;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.sun.identity.policy.remote.PolicyEvaluationException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.PolicyListenerRequest;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.PolicyNotification;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.PolicyRequest;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.PolicyResponse;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.PolicyService;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.RemoveListenerRequest;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.policy.remote.ResourceResultRequest;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.sun.identity.shared.Constants;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.sun.identity.shared.JSONUtils;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.sun.identity.shared.debug.Debug;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport com.sun.identity.shared.encode.Hash;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport org.forgerock.openam.session.SessionCache;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport org.forgerock.openam.session.SessionCookies;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport org.json.JSONArray;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport org.json.JSONException;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport org.json.JSONObject;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.BufferedReader;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.IOException;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport java.io.InputStreamReader;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.OutputStream;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.UnsupportedEncodingException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.net.HttpURLConnection;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.net.URL;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.net.URLEncoder;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport java.util.Collections;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashMap;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport java.util.HashSet;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport java.util.Iterator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Map;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Set;
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshottimport java.util.Vector;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Singleton class that implements client side policy decision cache.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Handles communication with policy service acting
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * as a proxy to policy service. In effect, this is a caching proxy.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterclass ResourceResultCache implements SSOTokenListener {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //service>resource>tokenID>scope>result
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static ResourceResultCache resourceResultCache;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PolicyProperties policyProperties;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set remotePolicyListeners
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = Collections.synchronizedSet(new HashSet(10));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //serviceName -> resourceName -> sessionId -> scope -> result
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Map resultCache = new HashMap(10);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PolicyNotificationHandler notificationHandler;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set tokenRegistry =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Collections.synchronizedSet(new HashSet(10000));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private int cacheTtl;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set advicesHandleableByAM;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static Debug debug = PolicyEvaluator.debug;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String POLICY_SERVICE_ID_FOR_NAMING = "policy";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String POLICY_SERVICE = "policyservice";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_POLICY_SERVICE = "ws/1/entitlement/entitlement";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_POLICY_SERVICE_LISTENER = "ws/1/entitlement/listener";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_LISTENER_NOTIFICATION_URL = "url";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String IPLANET_AM_WEB_AGENT_SERVICE = "iPlanetAMWebAgentService";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_QUERY_REALM = "realm";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_QUERY_APPLICATION = "application";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_QUERY_SUBJECT = "subject";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_QUERY_RESOURCE = "resource";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_QUERY_RESOURCES = "resources";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_QUERY_ACTION = "actionName";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String REST_QUERY_ENV = "env";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String JSON_RESOURCE_NAME = "resourceName";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String JSON_ACTIONS_VALUES = "actionsValues";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String JSON_ADVICES = "advices";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String JSON_ATTRIBUTES = "attributes";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static final String GET_RESPONSE_ATTRIBUTES
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = "Get_Response_Attributes";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott private static final SessionCache sessionCache = SessionCache.getInstance();
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott private static final SessionCookies sessionCookies = SessionCookies.getInstance();
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static long requestID = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static String REQUEST_ID_LOCK = "REQUEST_ID_LOCK";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static String SECRET_MASK = "*********";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Constructs the singleton instance of <code>ResourceResultCache</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param policyProperties object that provides access to configuration
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * properties such as policy service URL, notification URL etc.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This is nice wrapper over
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>com.iplanet.am.util.SystemProperties</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private ResourceResultCache(PolicyProperties policyProperties)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster this.policyProperties = policyProperties;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster notificationHandler = new PolicyNotificationHandler(this);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cacheTtl = policyProperties.getCacheTtl();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott if (policyProperties.notificationEnabled()){
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //register notification handler with PLLClient
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster registerHandlerWithPLLClient(notificationHandler);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message( "RsourceResultCache():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "added policyNotificationHandler "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "with PLLClient");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message( "RsourceResultCache():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Singleton Instance Created");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns reference to the singleton instance of
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>ResourceResultCache</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param policyProperties object that provides access to configuration
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * properties such as policy service URL, notification URL etc.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * This is nice wrapper over
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>com.iplanet.am.util.SystemProperties</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return reference to the singleton instance of
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>ResourceResultCache</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized static ResourceResultCache getInstance(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyProperties policyProperties) throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceResultCache == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResultCache = new ResourceResultCache(policyProperties);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResultCache.policyProperties = policyProperties;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResultCache.cacheTtl = policyProperties.getCacheTtl();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return resourceResultCache;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns reference to the singleton instance of
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>ResourceResultCache</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return reference to the singleton instance of
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>ResourceResultCache</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private synchronized static ResourceResultCache getInstance() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( (resourceResultCache == null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster && debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache.getInstance():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "ResourceResultCache has not been created:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "returning null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return resourceResultCache;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken application sso token to identify the client to policy
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of service for which to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param token session token of user for whom to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName resource name for which to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actionNames action names for which to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param env environment map to use to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param retryCount try this many times before giving up if received policy
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * decision is found to have expired
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if can not get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws SSOException if user session token is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws InvalidAppSSOTokenException if application session token
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyDecision getPolicyDecision(SSOToken appToken, String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken token, String resourceName, Set actionNames,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map env, int retryCount)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws InvalidAppSSOTokenException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int count = 0;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean validTtl = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyDecision pd = getPolicyDecision(appToken, serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster token, resourceName, actionNames,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster env, true); //use cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (pd.getTimeToLive() > System.currentTimeMillis()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster validTtl = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (!validTtl && (count < retryCount)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster count++;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getPolicyDecision():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Received expired decision, "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Getting decision again, repeat attempt="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + count);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd = getPolicyDecision(appToken, serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster token, resourceName, actionNames,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster env, false); //do not use cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (pd.getTimeToLive() > System.currentTimeMillis()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster validTtl = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!validTtl) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache.getPolicyDecision():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Received expired decision from server");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] args = {resourceName};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "received_expired_decision", args, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (actionNames != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyDecision pd1 = new PolicyDecision();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator nameIter = actionNames.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (nameIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String actionName = (String)nameIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map actionDecisions = pd.getActionDecisions();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ActionDecision ad =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (ActionDecision)actionDecisions.get(actionName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ad != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd1.addActionDecision(ad);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map mergedReponseAttrsMap = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyUtils.appendMapToMap(pd.getResponseAttributes(),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mergedReponseAttrsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd1.setResponseAttributes(mergedReponseAttrsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd = pd1;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd = (PolicyDecision)pd.clone();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return pd;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken application sso token to identify the client to policy
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of service for which to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param token session token of user for whom to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName resource name for which to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actionNames action names for which to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param env environment map to use to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param useCache flag indicating whether to return a locally cached
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * policy decision. Locally cached decision is returned only if the
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * value is <code>true</code>. Otherwise, policy decision is fetched
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * from policy service and returned.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if can not get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws SSOException if session token is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PolicyDecision getPolicyDecision(SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, SSOToken token, String resourceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionNames, Map env, boolean useCache)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws InvalidAppSSOTokenException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cacheMode = policyProperties.getCacheMode();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String rootResourceName = resourceName;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (PolicyProperties.SUBTREE.equals(cacheMode)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rootResourceName = getRootResourceName(resourceName, serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getPolicyDecision():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resourceName=" + resourceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":cacheMode=" + cacheMode
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":would get resource results for root resource="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + rootResourceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set resourceResults = getResourceResults(appToken, serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster token, rootResourceName, actionNames, env, cacheMode, useCache);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceName resourceComparator =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (ResourceName)policyProperties.getResourceComparator(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyDecision pd = getPolicyDecisionFromResourceResults(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults, resourceName, resourceComparator, serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getPolicyDecision():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":token=" + token.getPrincipal().getName()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":resourceName=" + resourceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":actionNames=" + actionNames + ":env"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":cacehMode=" + cacheMode
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":useCache=" + useCache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":returning policyDecision:" + pd);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return pd;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a set of <code>ResourceResult</code> objects
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken application sso token to identify the client to policy
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of service for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param token session token of user for whom to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName resource name for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actionNames action names for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param env environment map to use to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param scope the scope to be used while getting resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a set of <code>ResourceResult</code> objects
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if can not get
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws SSOException if session token is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws InvalidAppSSOTokenException if application session token
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set getResourceResults(SSOToken appToken, String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken token, String resourceName, Set actionNames,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map env, String scope)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws InvalidAppSSOTokenException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return getResourceResults(appToken, serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster token, resourceName, actionNames, env, scope,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster true); //useCache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a set of <code>ResourceResult</code> objects
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken application sso token to identify the client to policy
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of service for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param token session token of user for whom to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName resource name for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actionNames action names for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param env environment map to use to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param scope the scope to be used while getting resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param useCache flag indicating whether to return locally cached
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * resource results. Locally cached resource results are
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * returned only if the value is <code>true</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a set of <code>ResourceResult</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if can not get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws SSOException if session token is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws InvalidAppSSOTokenException if application session token
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set getResourceResults(SSOToken appToken, String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken token, String resourceName, Set actionNames,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map env, String scope, boolean useCache)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws InvalidAppSSOTokenException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOTokenManager.getInstance().validateToken(token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cacheMode = policyProperties.getCacheMode();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set resourceResults = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":token=" + token.getPrincipal().getName()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":resourceName=" + resourceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":actionNames=" + actionNames + ":env"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":useCache=" + useCache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":useRESTProtocol()=" + policyProperties.useRESTProtocol()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":entering ");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map resourceTokenIDsMap = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // resultCache -> serviceName -> resourceName -> sessionId -> scope -> result
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(resultCache) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // resourceName -> sessionId -> scope -> result
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceTokenIDsMap = (Map)resultCache.get(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceTokenIDsMap == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // changed to fix 4295 Policy cache causes frequent
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // full gc or out of memory issues
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceTokenIDsMap
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = new Cache(policyProperties.getResultsCacheResourceCap());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resultCache.put(serviceName, resourceTokenIDsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map tokenIDScopesMap = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // resourceTokenIDsMap -> resourceName -> sessionId -> scope -> result
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(resourceTokenIDsMap) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // sessionId -> scope -> result
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tokenIDScopesMap = (Map)resourceTokenIDsMap.get(resourceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tokenIDScopesMap == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // changed to fix 4295 Policy cache causes frequent full
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // gc or out of memory issues
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tokenIDScopesMap
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = new Cache(policyProperties.getResultsCacheSessionCap());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceTokenIDsMap.put(resourceName, tokenIDScopesMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map scopeResultsMap= null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tokenID = token.getTokenID().toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // tokenIDScopesMap -> sessionId -> scope -> result
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(tokenIDScopesMap) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster scopeResultsMap = (Map)tokenIDScopesMap.get(tokenID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (scopeResultsMap == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster scopeResultsMap = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tokenIDScopesMap.put(tokenID, scopeResultsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!tokenRegistry.contains(tokenID)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster token.addSSOTokenListener(this);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tokenRegistry.add(tokenID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object[] results = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean fetchResultsFromServer = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // scopeResultsMap -> scope -> result
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(scopeResultsMap) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster results = (Object[])scopeResultsMap.get(scope);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( results == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //array elements:resourceResults, env, ttl, actionNames
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster results = new Object[4];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster scopeResultsMap.put(scope, results);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( !useCache ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would contact server since useCache is false");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (results[0] == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would contact server "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " since results not in cache");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if ((env == null) && (results[1] != null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would contact server since env does not match");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if ((env != null) && !env.equals(results[1])) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would contact server since env does not Match");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (((Long)results[2]).longValue()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster < System.currentTimeMillis()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would contact server since results ttl has "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " expired");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if ((actionNames == null) && (results[3] != null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would contact server since action names do not "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " match");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if ((actionNames != null) && (results[3] == null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would contact server since action names do not "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " Match");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if ((results[3] !=null) &&!((Set)results[3]).containsAll(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionNames)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would contact server since cached action names "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " do not cover request action names");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (resourceResultsHasAdvices((Set)(results[0]))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster && PolicyProperties.SELF.equals(cacheMode)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //get from server if there were advices in the cached decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster //we do this only if cacheMode is self
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster fetchResultsFromServer = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // changed to fix 4205 Policy client code has bottleneck when processing notificati
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // FIXME: remove the check for service name with the some fix on server
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (fetchResultsFromServer) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if(policyProperties.useRESTProtocol()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster && IPLANET_AM_WEB_AGENT_SERVICE.equalsIgnoreCase(serviceName)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults = getRESTResultsFromServer(appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceName, token, resourceName, scope,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionNames, env);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults = getResultsFromServer(appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceName, token, resourceName, scope,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionNames, env);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster results[0] = resourceResults;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (env != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster env = PolicyUtils.cloneMap(env);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster results[1] = env;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster results[2]
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = new Long(System.currentTimeMillis() + cacheTtl);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (actionNames != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionNames1 = actionNames;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionNames = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionNames.addAll(actionNames1);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster results[3] = actionNames;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "would not contact server, "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " would use results from cache ");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults = (Set)(results[0]);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResourceResults("
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + serviceName + ","
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + token.getPrincipal().getName() + ","
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + resourceName + ","
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + actionNames + ",env)"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ": returning resourceResults");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return resourceResults;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set getRESTResultsFromServer(SSOToken appToken, String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken token, String resourceName, String scope,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionNames, Map env)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws InvalidAppSSOTokenException, SSOException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<ResourceResult> resourceResults = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AMIdentity userIdentity = IdUtils.getIdentity(token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String restUrl = getRESTPolicyServiceURL(token, scope);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String queryString = buildEntitlementRequestQueryString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "/", serviceName, token, resourceName, actionNames, env);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster restUrl = restUrl + "?" + queryString;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getRESTResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":token=" + token.getPrincipal().getName()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":resourceName=" + resourceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":scope=" + scope
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":actionNames=" + actionNames + ":env"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":restUrl=" + restUrl
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":entering");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String jsonString = getResourceContent(appToken, token, restUrl);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getRESTResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":server response jsonString=" + jsonString);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults = jsonResourceContentToResourceResults(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster jsonString, serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (InvalidAppSSOTokenException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw e;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] args = {e.getMessage()};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "rest_policy_request_exception",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args, e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getRESTResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "returning");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return resourceResults;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a set of <code>ResourceResult</code> objects from server.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Fresh resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * are fetched from policy server and returned.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken application sso token to identify the client to policy
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName name of service for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param token session token of user for whom to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName resource name for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param scope the scope to be used while getting resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param actionNames action names for which to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param env environment map to use to get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a set of <code>ResourceResult</code> objects
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if can not get resource results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws SSOException if session token is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws InvalidAppSSOTokenException if application session token
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is not valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set getResultsFromServer(SSOToken appToken, String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken token, String resourceName, String scope,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionNames, Map env)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws InvalidAppSSOTokenException, SSOException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set resourceResults = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Response response = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL policyServiceUrl = getPolicyServiceURL(token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":token=" + token.getPrincipal().getName()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":resourceName=" + resourceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":scope=" + scope
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":actionNames=" + actionNames + ":env"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":policyServiceURL=" + policyServiceUrl
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":entering");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResultRequest rrRequest = new ResourceResultRequest();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rrRequest.setServiceName(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rrRequest.setResourceName(resourceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rrRequest.setResourceScope(scope);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rrRequest.setUserSSOToken(token.getTokenID().toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set responseAttributes = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (env != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rrRequest.setEnvParms(env);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster responseAttributes = getResponseAttributes(env);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "responseAttributes to get="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + responseAttributes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (responseAttributes != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rrRequest.setResponseAttributes(responseAttributes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest policyRequest = new PolicyRequest();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyRequest.setAppSSOToken(appToken.getTokenID().toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyRequest.setMethodID(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest.POLICY_REQUEST_GET_RESOURCE_RESULTS);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyRequest.setRequestId(newRequestID());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyRequest.setResourceResultRequest(rrRequest);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyService ps = sendPLLRequest(policyServiceUrl, policyRequest);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ps != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyResponse pr = ps.getPolicyResponse();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String exceptionMessage = pr.getExceptionMsg();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (exceptionMessage != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if(exceptionMessage.indexOf(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyResponse.APP_SSO_TOKEN_INVALID) >= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "getResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " response exception " + exceptionMessage);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "getResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " appSSOToken is invalid");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "throwing InvalidAppSSOTokenException");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] args = {exceptionMessage};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new InvalidAppSSOTokenException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "server_reported_invalid_app_sso_token",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "getResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "response exception message="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + exceptionMessage);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] args = {exceptionMessage};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "server_reported_exception",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults = pr.getResourceResults();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SendRequestException sre) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] args = {sre.getMessage()};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "pll_send_request_exception",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args, sre);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getResultsFromServer():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "returning");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return resourceResults;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns policy decision computed from a set of
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>ResourceResult</code> objects
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceResults resource results used to compute policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName resource name for which to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceComparator <code>ResourceName</code>, resource
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * comparison algorithm used to compare resources
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return computed policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if can not get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PolicyDecision getPolicyDecisionFromResourceResults(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set resourceResults, String resourceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceName resourceComparator,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName) throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyDecision pd = new PolicyDecision();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator resultsIter = resourceResults.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean processed = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (!processed && resultsIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult resourceResult
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = (ResourceResult)resultsIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster processed = mergePolicyDecisions(pd, resourceResult,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceName, resourceComparator, serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return pd;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Merges policy decisions applicable to a resource
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * from a <code>ResourceResult</code> object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pd a collector for merged policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceResult <code>ResourceResult</code> from which
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to find applicable policy decisions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceName resource name for which to get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resourceComparator <code>ResourceName</code>, resource
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * comparison algorithm used to compare resources
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a flag indicating whether more <code>ResourceResult</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * objects need to be visited to to compute the policy decision.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * <code>true</code> is returned if no more <code>ResourceResult</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * objects need to be visited
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * a <code>ResourceResult</code> object.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if can not get policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean mergePolicyDecisions(PolicyDecision pd,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult resourceResult, String resourceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceName resourceComparator, String serviceName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean processed = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.mergePolicyDecisions():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resourceName=" + resourceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":resourceResultResourceName="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + resourceResult.getResourceName());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceMatch result = resourceComparator.compare(resourceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResult.getResourceName(), true); //wild card compare
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (result.equals(ResourceMatch.EXACT_MATCH)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resetPolicyDecision(resourceResult.getPolicyDecision(), pd,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster processed = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (result.equals(ResourceMatch.WILDCARD_MATCH)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mergePolicyDecisions(resourceResult.getPolicyDecision(), pd,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (pd.getTimeToLive() < System.currentTimeMillis()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster processed = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!processed) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set resourceResults = resourceResult.getResourceResults();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator resultsIter = resourceResults.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (!processed && resultsIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult subResult
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = (ResourceResult)resultsIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster processed = mergePolicyDecisions(pd, subResult,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceName, resourceComparator, serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (result.equals(ResourceMatch.SUPER_RESOURCE_MATCH)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set resourceResults = resourceResult.getResourceResults();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator resultsIter = resourceResults.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (!processed && resultsIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult subResult
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = (ResourceResult)resultsIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster processed = mergePolicyDecisions(pd, subResult,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceName, resourceComparator, serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } // else NO_MATCH or SUBRESOURCE_MATCH nothing to do
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return processed;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Merges two policy decisions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pd1 policy decision to be merged
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pd2 policy decision to be merged into
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return merged policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PolicyDecision mergePolicyDecisions(PolicyDecision pd1,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyDecision pd2, String serviceName) { //pd2 is collector
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map actionDecisions1 = pd1.getActionDecisions();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actions = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actions.addAll(actionDecisions1.keySet());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator iter = actions.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ( iter.hasNext() ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String action = (String) iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ActionDecision ad1 = (ActionDecision) actionDecisions1.get(action);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd2.addActionDecision(ad1,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyProperties.getTrueValue(serviceName, action),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyProperties.getFalseValue(serviceName, action));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map mergedReponseAttrsMap = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyUtils.appendMapToMap(pd1.getResponseAttributes(),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mergedReponseAttrsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyUtils.appendMapToMap(pd2.getResponseAttributes(),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mergedReponseAttrsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd2.setResponseAttributes(mergedReponseAttrsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return pd2;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Merges two policy decisions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pd1 policy decision to be merged
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pd2 policy decision to be merged into. Action decisions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * present in the policy decision are cleared before merging
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return merged policy decision
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private PolicyDecision resetPolicyDecision(PolicyDecision pd1,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyDecision pd2, String serviceName) { //pd2 is collector
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map actionDecisions1 = pd1.getActionDecisions();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map actionDecisions2 = pd2.getActionDecisions();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actionDecisions2.clear();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actions = new HashSet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actions.addAll(actionDecisions1.keySet());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator iter = actions.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ( iter.hasNext() ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String action = (String) iter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ActionDecision ad1 = (ActionDecision) actionDecisions1.get(action);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd2.addActionDecision(ad1,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyProperties.getTrueValue(serviceName, action),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyProperties.getFalseValue(serviceName, action));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map mergedReponseAttrsMap = new HashMap();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyUtils.appendMapToMap(pd1.getResponseAttributes(),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mergedReponseAttrsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyUtils.appendMapToMap(pd2.getResponseAttributes(),
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster mergedReponseAttrsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd2.setResponseAttributes(mergedReponseAttrsMap);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return pd2;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Registers a listener with policy service to recieve
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications on policy changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken session token identifying the client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param notificationURL end point on the client that listens for
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster void addRemotePolicyListener(SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, String notificationURL) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addRemotePolicyListener(appToken, serviceName, notificationURL,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Registers a listener with policy service to recieve
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications on policy changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken session token identifying the client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param notificationURL end point on the client that listens for
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param reRegister flag indicating whether to register listener
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * even if it was already registered. <code>true</code> indicates
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to register listener again even if it was previously registered
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean addRemotePolicyListener(SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, String notificationURL,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean reRegister) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean status = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.addRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":notificationURL=" + notificationURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (remotePolicyListeners.contains(serviceName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster && !reRegister) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.addRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":notificationURL=" + notificationURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":is already registered");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return status;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } //else do the following
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL policyServiceURL = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (appToken != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyServiceURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = getPolicyServiceURL(appToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (PolicyException pe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.addRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not add policy listner", pe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((appToken != null) && (policyServiceURL != null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyListenerRequest listenerReq = new PolicyListenerRequest();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listenerReq.setServiceName(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster listenerReq.setNotificationURL(notificationURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest policyReq = new PolicyRequest();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setAppSSOToken(appToken.getTokenID().toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setMethodID(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest.POLICY_REQUEST_ADD_POLICY_LISTENER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setPolicyListenerRequest(listenerReq);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyService ps = sendPLLRequest(policyServiceURL, policyReq);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ps != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "addRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "result=" + ps.toXMLString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyResponse psres = ps.getPolicyResponse();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (psres.getMethodID()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster == PolicyResponse.POLICY_ADD_LISTENER_RESPONSE) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster status = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster remotePolicyListeners.add(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "addRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":notificationURL=" + notificationURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":policyServiceURL=" + policyServiceURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":add succeeded");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.addRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " no result");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.addRemotePolicyListener():",e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return status;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Removes a listener registered with policy service to recieve
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications on policy changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken session token identifying the client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param notificationURL end point on the client that listens for
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public boolean removeRemotePolicyListener(SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, String notificationURL) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean status = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL policyServiceURL = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster remotePolicyListeners.remove(notificationURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (appToken != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyServiceURL = getPolicyServiceURL(appToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (PolicyException pe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.removeRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not remove policy listner:", pe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((appToken != null) && (policyServiceURL != null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster RemoveListenerRequest rmReq = new RemoveListenerRequest();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rmReq.setServiceName(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rmReq.setNotificationURL(notificationURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest policyReq = new PolicyRequest();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setAppSSOToken(appToken.getTokenID().toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setMethodID(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest.POLICY_REQUEST_REMOVE_POLICY_LISTENER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setRemoveListenerRequest(rmReq);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyService ps = sendPLLRequest(policyServiceURL, policyReq);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ps != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "removeRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "result=" + ps.toXMLString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyResponse psres = ps.getPolicyResponse();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (psres.getMethodID()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster == PolicyResponse.POLICY_REMOVE_LISTENER_RESPONSE) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster status = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "removeRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "no result");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.removeRemotePolicyListener():",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return status;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Processes policy notifications forwarded from listener end
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * point of policy client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pn policy notification
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static void processPolicyNotification(PolicyNotification pn)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws PolicyEvaluationException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (pn != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache:processPolicyNotification():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + pn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResultCache cache = ResourceResultCache.getInstance();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyChangeNotification pcn = pn.getPolicyChangeNotification();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName = pcn.getServiceName();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (serviceName != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (cache.remotePolicyListeners.contains(serviceName)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set affectedResourceNames = pcn.getResourceNames();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "processPolicyNotification():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":affectedResourceNames="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + affectedResourceNames
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":clearing cache for affected "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resource names");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster clearCacheForResourceNames(serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster affectedResourceNames);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "processPolicyNotification():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName not registered"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":no resource names cleared from cache");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "processPolicyNotification():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName is null"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":no resource names cleared from cache");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.processPolicyNotification()"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "PolicyNotification is null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Registers policy notification handler with <code>PLLClient</code>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param handler policy notification handler
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void registerHandlerWithPLLClient(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyNotificationHandler handler) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PLLClient.addNotificationHandler(POLICY_SERVICE_ID_FOR_NAMING,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster handler);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "registerHandlerWithPLLClient():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "registered notification handler");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (AlreadyRegisteredException ae) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "registerHandlerWithPLLClient():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "AlreadyRegisteredException", ae);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns policy service URL based on session token
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param token session token of user
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return policy service URL based on session token
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if can not get policy service URL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static URL getPolicyServiceURL(SSOToken token) throws
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL policyServiceURL = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String ssoTokenID = token.getTokenID().toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SessionID sid = new SessionID(ssoTokenID);
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott Session session = sessionCache.getSession(sid);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL sessionServiceURL = session.getSessionServiceURL();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String protocol = sessionServiceURL.getProtocol();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String host = sessionServiceURL.getHost();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int port = sessionServiceURL.getPort();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String uri = sessionServiceURL.getPath();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String portString = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( port == -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster portString = "";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster portString = Integer.toString(port);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyServiceURL = WebtopNaming.getServiceURL(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster POLICY_SERVICE_ID_FOR_NAMING,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protocol, host, portString, uri);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SessionException se) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.getPolicyServiceURL():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not find policy service URL", se);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "policy_service_url_not_found",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster null, se);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (URLNotFoundException ue) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.getPolicyServiceURL():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not find policy service URL", ue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "policy_service_url_not_found",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster null, ue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return policyServiceURL;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Processes session token change ntofication
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param tokenEvent session token change notification event
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void ssoTokenChanged(SSOTokenEvent tokenEvent) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tokenID = tokenEvent.getToken().getTokenID().toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.ssoTokenChanged():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "for tokenID=" + SECRET_MASK); //mask tokenID
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(resultCache) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set services = (Set)resultCache.keySet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator serviceIter = services.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (serviceIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName = (String)serviceIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map resourceTokenIDsMap = (Map)resultCache.get(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(resourceTokenIDsMap) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set resources = (Set)resourceTokenIDsMap.keySet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator resourceIter = resources.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (resourceIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resource = (String)resourceIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map tokenIDScopesMap
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = (Map)resourceTokenIDsMap.get(resource);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (tokenIDScopesMap != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tokenIDScopesMap.remove(tokenID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean tokenPresent = tokenRegistry.remove(tokenID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( (tokenPresent == false) &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (debug.messageEnabled()) ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache. tokenID= "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + SECRET_MASK
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " not found in Token Registry.");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "ssoTokenChanged():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "removing cache results for "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "tokenID=" + SECRET_MASK //mask tokenID
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":resource=" + resource);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Throwable t) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache.ssoTokenChanged():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Exception caught", t);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Clears cached decisions for a set of resources
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param affectedResourceNames affected resource names
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static void clearCacheForResourceNames(String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set affectedResourceNames) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((affectedResourceNames == null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster || affectedResourceNames.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map resourceTokenIDsMap
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = (Map)(resourceResultCache.resultCache).get(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((resourceTokenIDsMap == null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster || resourceTokenIDsMap.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceName resourceComparator
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = resourceResultCache.policyProperties
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster .getResourceComparator(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator arIter = affectedResourceNames.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (arIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String affectedRN = (String)arIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "clearCacheForResourceNames():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "affectedResourceName=" + affectedRN);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (resourceTokenIDsMap) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set cachedResourceNames = resourceTokenIDsMap.keySet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator crIter = cachedResourceNames.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (crIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cachedRN = (String)crIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "clearCacheForResourceNames():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "affectedResourceName=" + affectedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":cachedResourceName=" + cachedRN);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (affectedRN.equals(cachedRN)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster crIter.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "clearCacheForResourceNames():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "cleared cached results for "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resourceName=" + cachedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":affectedResourceName=" + affectedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":match=SAME RESOURCE NAME");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceMatch rm
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = resourceComparator.compare( cachedRN,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster affectedRN, true); //wildcard compare
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (rm.equals(ResourceMatch.EXACT_MATCH)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster crIter.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "clearCacheForResourceNames():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "cleared cached results for "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resourceName=" + cachedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":affectedResourceName=" + affectedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":match=EXACT_MATCH");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (rm.equals(ResourceMatch.WILDCARD_MATCH)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster crIter.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "clearCacheForResourceNames():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "cleared cached results for "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resourceName=" + cachedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":affectedResourceName=" + affectedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":match=WILD_CARD_MATCH");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (rm.equals(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceMatch.SUB_RESOURCE_MATCH)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster crIter.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "clearCacheForResourceNames():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "cleared cached results for "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resourceName=" + cachedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":affectedResourceName=" + affectedRN
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":match=SUB_RESOURCE_MACTH");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns response attribute names specified in environment map
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param env environment map
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Set getResponseAttributes(Map env) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set responseAttributes = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( env != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster responseAttributes = (Set) env.get(GET_RESPONSE_ATTRIBUTES);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return responseAttributes;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns a new request ID. Used in identifying request messages
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * sent to policy service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return a new request ID. Used in identifying request messages
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * sent to policy service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String newRequestID() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String requestIDString = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(REQUEST_ID_LOCK) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster requestIDString = String.valueOf(requestID++);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return requestIDString;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns root resource name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param resource resource name from which to compute root resource name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return root resource name computed from resource name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String getRootResourceName(String resource, String serviceName) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceName resourceComparator
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = policyProperties.getResourceComparator(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String rootResource = "";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((resource != null) && (resource.length() != 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] resources = resourceComparator.split(resource);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rootResource = resources[0];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int index = resource.indexOf(rootResource);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( index > 0 ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster rootResource = resource.substring(0, index) + rootResource;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return rootResource;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8d3140b524c0e28c0a49dc7c7d481123ef3cfe11Chris Lee * Returns names of policy advices that could be handled by OpenAM
8d3140b524c0e28c0a49dc7c7d481123ef3cfe11Chris Lee * Enterprise if PEP redirects user agent to OpenAM.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken application sso token that would be used while
8d3140b524c0e28c0a49dc7c7d481123ef3cfe11Chris Lee * communicating to OpenAM
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param refetchFromServer indicates whether to get the values fresh
8d3140b524c0e28c0a49dc7c7d481123ef3cfe11Chris Lee * from OpenAM or return the values from local cache.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * If the server reports app sso token is invalid, a new app sso
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * token is created and one more call is made to the server.
8d3140b524c0e28c0a49dc7c7d481123ef3cfe11Chris Lee * @return names of policy advices that could be handled by OpenAM
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws InvalidAppSSOTokenException if the server reported that the
8d3140b524c0e28c0a49dc7c7d481123ef3cfe11Chris Lee * app sso token provided was invalid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyEvaluationException if the server reported any other error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws PolicyException if there are problems in getting the advice
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * names
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws SSOException if the appToken is detected to be invalid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * at the client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set getAdvicesHandleableByAM(SSOToken appToken, boolean refetchFromServer)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws InvalidAppSSOTokenException, PolicyException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getAdvicesHandleableByAM():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":entering");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ( (advicesHandleableByAM != null) && !refetchFromServer ) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getAdvicesHandleableByAM():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":returning cached advices"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + advicesHandleableByAM);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return advicesHandleableByAM;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL policyServiceURL = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (appToken != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyServiceURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = getPolicyServiceURL(appToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (PolicyException pe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.getAdvicesHandleableByAM():",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw pe;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((appToken != null) && (policyServiceURL != null)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest policyReq = new PolicyRequest();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setAppSSOToken(appToken.getTokenID().toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setAdvicesHandleableByAMRequest(new
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AdvicesHandleableByAMRequest());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyReq.setMethodID(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest.POLICY_REQUEST_ADVICES_HANDLEABLE_BY_AM_REQUEST);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyService ps = sendPLLRequest(policyServiceURL, policyReq);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ps != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "getAdvicesHandleableByAM():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "result=" + ps.toXMLString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyResponse psres = ps.getPolicyResponse();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String exceptionMessage = psres.getExceptionMsg();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (exceptionMessage != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if(exceptionMessage.indexOf(ResBundleUtils.getString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "app_sso_token_invalid")) >= 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "getAdvicesHandleableByAM():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " response exception "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + exceptionMessage);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "AdvicesHandleableByAM():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + " appSSOToken is invalid");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "throwing InvalidAppSSOTokenException");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] args = {exceptionMessage};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new InvalidAppSSOTokenException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "server_reported_invalid_app_sso_token",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "AdvicesHandleableByAM():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "response exception message="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + exceptionMessage);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] args = {exceptionMessage};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "server_reported_exception",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (psres.getMethodID() == PolicyResponse.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster POLICY_ADVICES_HANDLEABLE_BY_AM_RESPONSE)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster AdvicesHandleableByAMResponse
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster advicesHandleableByAMResponse
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = psres.getAdvicesHandleableByAMResponse();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "getAdvicesHandleableByAM():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + advicesHandleableByAMResponse);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (advicesHandleableByAMResponse != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster advicesHandleableByAM =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster advicesHandleableByAMResponse.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster getAdvicesHandleableByAM();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.getAdvicesHandleableByAM()"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster +":no result");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SendRequestException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.getAdvicesHandleableByAM():",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (advicesHandleableByAM == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster advicesHandleableByAM = Collections.EMPTY_SET;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getAdvicesHandleableByAM():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":returning advicesHandleableByAM"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + advicesHandleableByAM);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return advicesHandleableByAM;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Clears cached policy decisions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name for which cached decisions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * would be cleared
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster void clearCachedDecisionsForService(String serviceName) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "clearCachedDecisionsForService():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(resultCache) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resultCache.remove(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Return a PolicyService object based on the XML document received
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * from remote Policy Server. This is in response to a request that we
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * send to the Policy server.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param policyServiceUrl The URL of the Policy Service
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param preq The SessionRequest XML document
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return PolicyService
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @exception SendRequestException is thrown if there was an error in
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * sending the XML document or PolicyException if there are any parsing
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * errors.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static PolicyService sendPLLRequest(URL policyServiceUrl,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyRequest preq) throws SendRequestException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyException{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String lbcookie = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster lbcookie = getLBCookie(preq);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new SendRequestException(e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyService policyService = new PolicyService();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyService.setMethodID(PolicyService.POLICY_REQUEST_ID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyService.setPolicyRequest(preq);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String xmlString = policyService.toXMLString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Request request = new Request(xmlString);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster RequestSet requestSet
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = new RequestSet(PolicyService.POLICY_SERVICE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster requestSet.addRequest(request);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.sendPLLRequest:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "sending PLL request to URL=" + policyServiceUrl
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":\nPLL message=" + xmlString);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Vector responses = PLLClient.send(policyServiceUrl, lbcookie, requestSet);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Response response = (Response) responses.elementAt(0);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyService ps = PolicyService.parseXML(response.getContent());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.sendPLLRequest:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "result=" + ps.toXMLString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return ps;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Returns lbcookie value for the Session
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott * @param preq policy request
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return lbcookie name and value pair
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws Exception if session in request is invalid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static String getLBCookie(PolicyRequest preq) throws Exception{
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott String lbcookie;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResultRequest rrReq = preq.getResourceResultRequest();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if(rrReq !=null ) {
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott lbcookie = sessionCookies.getLBCookie(rrReq.getUserSSOToken());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
35ab1c5bca11317474fe12bdd8d22c17cdaf2697Robert Wapshott lbcookie = sessionCookies.getLBCookie(preq.getAppSSOToken());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return lbcookie;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean resourceResultsHasAdvices(Set resourceResults) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean hasAdvices = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceResults != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Iterator rrIter = resourceResults.iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while (rrIter.hasNext()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult rr = (ResourceResult)rrIter.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (rr.hasAdvices()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster hasAdvices =true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return hasAdvices;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String getRESTPolicyServiceURL(SSOToken token, String scope)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SSOException, PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL policyServiceURL = getPolicyServiceURL(token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String restUrl = policyServiceURL.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster restUrl = restUrl.replace(POLICY_SERVICE, REST_POLICY_SERVICE);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (PolicyProperties.SUBTREE.equals(scope)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster restUrl = restUrl + "s";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getRESTPolicyServiceURL():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "restPolicyServiceUrl=" + restUrl);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return restUrl;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static Set<String> mapActionBooleanToString(String serviceName, String actionName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actValues) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set values = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (actValues != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster values = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster values.addAll(actValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (values.remove("true")) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster values.add("allow");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (values.remove("false")) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster values.add("deny");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return values;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String getResourceContent(SSOToken appToken, SSOToken userToken, String url)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sb = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster HttpURLConnection conn = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster BufferedReader reader = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn = HttpURLConnectionManager.getConnection(new URL(url));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setDoOutput(true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setUseCaches(false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setRequestMethod("GET");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setInstanceFollowRedirects(false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster setCookieAndHeader(conn, appToken, userToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.connect();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster reader = new BufferedReader(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new InputStreamReader(conn.getInputStream(), "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int len;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char[] buf = new char[1024];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ((len = reader.read(buf, 0, buf.length)) != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(buf, 0, len);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int responseCode = conn.getResponseCode();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP) { // got a 302
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache.getResourceContent():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "got 302 redirect");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache.getResourceContent():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "throwing InvalidAppSSOTokenException");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] args = {conn.getResponseMessage()};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new InvalidAppSSOTokenException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "rest_call_to_server_caused_302",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster args, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (responseCode != HttpURLConnection.HTTP_OK) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "ResourceResultCache.getResourceContent():" +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "REST call failed with HTTP response code:" +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster responseCode);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "Entitlement REST call failed with error code:" +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster responseCode);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (UnsupportedEncodingException uee) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // should not happen
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.getResourceContent():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "UnsupportedEncodingException:" + uee.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IOException ie) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("IOException:" + ie);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "rest_call_failed_with_io_exception", null, ie);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } finally {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (reader != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster reader.close();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (conn != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.disconnect();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return sb.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void setCookieAndHeader(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster HttpURLConnection conn,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken userToken
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ) throws UnsupportedEncodingException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cookieValue = appToken.getTokenID().toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (Boolean.parseBoolean(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SystemProperties.get(Constants.AM_COOKIE_ENCODE, "false"))) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cookieValue = URLEncoder.encode(cookieValue, "UTF-8");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cookieName = SystemProperties.get(Constants.AM_COOKIE_NAME,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "iPlanetDirectoryPro");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setRequestProperty("Cookie", cookieName + "=" + cookieValue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String userTokenId = userToken.getTokenID().toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String userTokenIdHeader = "ssotoken:" + userTokenId;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setRequestProperty("X-Query-Parameters", userTokenIdHeader);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<ResourceResult> jsonResourceContentToResourceResults(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String jsonResourceContent, String serviceName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws JSONException, PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<ResourceResult> resourceResults = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster JSONObject jsonObject = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster jsonObject = new JSONObject(jsonResourceContent);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch(JSONException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.jsonResourceContentToResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "json parsing error of response: " + jsonResourceContent);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "error_rest_reponse",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int statusCode = jsonObject.optInt("statusCode");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (statusCode != 200) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.jsonResourceContentToResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "statusCode=" + statusCode + ", error response");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "error_rest_reponse",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster jsonObject = jsonObject.optJSONObject("body");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (jsonObject == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.jsonResourceContentToResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "does not have decisions object");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "error_rest_reponse",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster JSONArray jsonArray = jsonObject.optJSONArray("results");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (jsonArray != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceName resourceComparator =
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster (ResourceName)policyProperties.getResourceComparator(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult virtualResourceResult = new ResourceResult(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult.VIRTUAL_ROOT,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new PolicyDecision());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int arrayLen = jsonArray.length();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < arrayLen; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster JSONObject jo = jsonArray.optJSONObject(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (jo != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult rr = jsonEntitlementToResourceResult(jo,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster virtualResourceResult.addResourceResult(rr, resourceComparator);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults = virtualResourceResult.getResourceResults();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resourceName = jsonObject.optString("resourceName");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (resourceName != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult resourceResult
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = jsonEntitlementToResourceResult(jsonObject, serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults = new HashSet<ResourceResult>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceResults.add(resourceResult);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.jsonResourceContentToResourceResults():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "does not have results or resourceName object");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "error_rest_reponse",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return resourceResults;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult jsonEntitlementToResourceResult(JSONObject jsonEntitlement,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName) throws JSONException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resultResourceName = jsonEntitlement.optString(JSON_RESOURCE_NAME);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map<String, Set<String>> actionsValues = JSONUtils.getMapStringSetString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster jsonEntitlement, JSON_ACTIONS_VALUES);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map<String, Set<String>> advices = JSONUtils.getMapStringSetString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster jsonEntitlement, JSON_ADVICES);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map<String, Set<String>> attributes = JSONUtils.getMapStringSetString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster jsonEntitlement, JSON_ATTRIBUTES);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> actNames = (actionsValues != null)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ? actionsValues.keySet() : null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster PolicyDecision pd = new PolicyDecision();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (actNames != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (String actName : actNames) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> actValues = actionsValues.get(actName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster actValues = mapActionBooleanToString(serviceName, actName, actValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ActionDecision ad = new ActionDecision(actName, actValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ad.setAdvices(advices);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd.addActionDecision(ad);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd.setResponseDecisions(attributes);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResult resourceResult = new ResourceResult(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resultResourceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster pd);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return resourceResult;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Registers a REST listener with policy service to recieve
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications on policy changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken session token identifying the client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param notificationURL end point on the client that listens for
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster void addRESTRemotePolicyListener(SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, String notificationURL) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addRESTRemotePolicyListener(appToken, serviceName, notificationURL,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Registers a REST listener with policy service to recieve
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications on policy changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken session token identifying the client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param notificationURL end point on the client that listens for
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param reRegister flag indicating whether to register listener
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * even if it was already registered. <code>true</code> indicates
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * to register listener again even if it was previously registered
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean addRESTRemotePolicyListener(SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, String notificationURL,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean reRegister) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean status = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":notificationURL=" + notificationURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (remotePolicyListeners.contains(serviceName)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster && !reRegister) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":notificationURL=" + notificationURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":is already registered");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return status;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } //else do the following
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (appToken != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String policyServiceListenerURL = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyServiceListenerURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = getRESTPolicyServiceListenerURL(appToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String rootURL = getRootURL(notificationURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":notificationURL=" + notificationURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":rootURL=" + rootURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":policyServiceListenerURL=" + policyServiceListenerURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster );
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> resourceNames = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster resourceNames.add(rootURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String queryString = buildRegisterListenerQueryString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appToken, serviceName, resourceNames);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster queryString += "&url=" +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URLEncoder.encode(notificationURL, "UTF-8");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resourceContent = postForm(appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyServiceListenerURL, queryString);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // FIXME: what do we check in the content?
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // FIXME: check the response, detect error conditions?
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":resourceContent=" + resourceContent
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster );
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster status = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster remotePolicyListeners.add(serviceName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (UnsupportedEncodingException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not add policy listner", e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException se) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not add policy listner", se);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (PolicyException pe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not add policy listner", pe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // log a debug message: not registering listener
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "not adding listener, app sso token is null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return status;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Removes a REST listener registered with policy service to recieve
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications on policy changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param appToken session token identifying the client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param serviceName service name
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param notificationURL end point on the client that listens for
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public boolean removeRESTRemotePolicyListener(SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, String notificationURL) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean status = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL policyServiceURL = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster remotePolicyListeners.remove(notificationURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (appToken != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyServiceURL = getPolicyServiceURL(appToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (PolicyException pe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.removeRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not remove policy listner:", pe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (appToken != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String policyServiceListenerURL = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster policyServiceListenerURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster = getRESTPolicyServiceListenerURL(appToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "removeRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":notificationURL=" + notificationURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":policyServiceListenerURL=" + policyServiceListenerURL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster );
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sb = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(policyServiceListenerURL).append("/");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(notificationURL, "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> resourceNames = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("?");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(buildRegisterListenerQueryString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appToken, serviceName, resourceNames));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String restUrl = sb.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resourceContent = deleteRESTResourceContent(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster appToken, restUrl);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // FIXME: what do we check in the content
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "removeRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":resourceContent=" + resourceContent
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster );
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster remotePolicyListeners.remove(notificationURL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (UnsupportedEncodingException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not add policy listner", e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException se) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.addRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not add policy listner", se);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (PolicyException pe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.removeRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "Can not remove policy listner", pe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // log a debug message: not removing listener
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // log a debug message: not registering listener
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.removeRESTRemotePolicyListener():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "not removing listener, app sso token is null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return status;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Processes REST policy notifications forwarded from listener end
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * point of policy client
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param pn REST policy notification
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static void processRESTPolicyNotification(String pn) //pn has to be JSON string
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws PolicyEvaluationException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // samplePn = "{realm: "/", privilgeName: "p1", resources: ["r1", "r2"]}";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (pn != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache:processRESTPolicyNotification(), jsonString:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + pn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ResourceResultCache cache = ResourceResultCache.getInstance();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // FIXME after servre side is fixed to provide serviceName in notification
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName = "iPlanetAMWebAgentService";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> affectedResourceNames = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster JSONObject jo = new JSONObject(pn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster JSONArray jsonArray = jo.optJSONArray("resources");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (jsonArray != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int arrayLen = jsonArray.length();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (int i = 0; i < arrayLen; i++) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resName = jsonArray.optString(i);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (affectedResourceNames == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster affectedResourceNames = new HashSet<String>();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster affectedResourceNames.add(resName);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (JSONException je) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.processRESTPolicyNotification():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "pn=" + pn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyEvaluationException("notification_not_valid_json");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (serviceName != null && affectedResourceNames != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (cache.remotePolicyListeners.contains(serviceName)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "processRESTPolicyNotification():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName=" + serviceName
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":affectedResourceNames="
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + affectedResourceNames
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":clearing cache for affected "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resource names");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster clearCacheForResourceNames(serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster affectedResourceNames);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "processRESTPolicyNotification():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName not registered"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":no resource names cleared from cache");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "processRESTPolicyNotification():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName or affectedResourceNames is null"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ":no resource names cleared from cache");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.processRESTPolicyNotification()"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "PolicyNotification is null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String getRESTPolicyServiceListenerURL(SSOToken token)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SSOException, PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String restUrl = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster URL policyServiceURL = getPolicyServiceURL(token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster restUrl = policyServiceURL.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster restUrl = restUrl.replace(POLICY_SERVICE, REST_POLICY_SERVICE_LISTENER);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache.getRESTPolicyServiceURL():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "restPolicyServiceListenerUrl=" + restUrl);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return restUrl;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String postForm(SSOToken appToken, String url, String formContent)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.message("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "postForm():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "url=" + url
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ", formContent=" + formContent);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sb = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster HttpURLConnection conn = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster OutputStream out = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster BufferedReader reader = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn = HttpURLConnectionManager.getConnection(new URL(url));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setDoInput(true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setDoOutput(true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setUseCaches(false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster setCookieAndHeader(conn, appToken, appToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setRequestMethod("POST");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setRequestProperty("Content-Type",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "application/x-www-form-urlencoded");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setRequestProperty("Content-Length",
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Integer.toString(formContent.length()));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.connect();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster out = conn.getOutputStream();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster out.write(formContent.getBytes("UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster out.write("\r\n".getBytes("UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster out.flush();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster out.close();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster reader = new BufferedReader(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new InputStreamReader(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.getInputStream(), "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int len;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char[] buf = new char[1024];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ((len = reader.read(buf, 0, buf.length)) != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(buf, 0, len);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int responseCode = conn.getResponseCode();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // any 200 series response code is success
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (responseCode < 200 || responseCode > 299) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "postForm():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "REST call failed with HTTP response code:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + responseCode);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "Entitlement REST call failed with error code:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + responseCode);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (UnsupportedEncodingException uee) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // should not happen
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.postFormParams():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "UnsupportedEncodingException:" + uee.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IOException ie) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.postForm():IOException:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + ie.getMessage(), ie);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "rest_call_failed_with_io_exception", null, ie);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } finally {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (reader != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster reader.close();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (conn != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.disconnect();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return sb.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private String deleteRESTResourceContent(SSOToken appToken, String url)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sb = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster HttpURLConnection conn = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster BufferedReader reader = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn = HttpURLConnectionManager.getConnection(new URL(url));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setDoOutput(true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setUseCaches(false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster setCookieAndHeader(conn, appToken, appToken);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.setRequestMethod("DELETE");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.connect();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster reader = new BufferedReader(new InputStreamReader(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.getInputStream(), "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int len;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster char[] buf = new char[1024];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster while ((len = reader.read(buf, 0, buf.length)) != -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(buf, 0, len);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int responseCode = conn.getResponseCode();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (responseCode != conn.HTTP_OK) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "deleteRESTResourceContent():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "REST call failed with HTTP response code:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + responseCode);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "Entitlement REST call failed with error code:"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + responseCode);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (UnsupportedEncodingException uee) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // should not happen
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.deleteRESTResourceContent():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "UnsupportedEncodingException:" + uee.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (IOException ie) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("IOException:" + ie);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "rest_call_failed_with_io_exception", null, ie);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } finally {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (reader != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster reader.close();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (conn != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster conn.disconnect();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return sb.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static String buildRegisterListenerQueryString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken appToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, // called application in entitlement
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set<String> resourceNames) throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sb = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (appToken == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache.builRegisterListenerdQueryString():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "admin is null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "admin_can_not_be_null", null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tokenId = appToken.getTokenID().toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String hashedTokenId = Hash.hash(tokenId);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(REST_QUERY_SUBJECT).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(hashedTokenId, "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((serviceName == null) || (serviceName.length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache.builRegisterListenerdQueryString():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName can not be null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "service_name_can_not_be_null", null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sb.length() > 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(REST_QUERY_APPLICATION).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(serviceName, "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((resourceNames == null) || resourceNames.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache.builRegisterListenerdQueryString():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resoureNames is null or empty");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (String resourceName : resourceNames) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (sb.length() > 0) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(REST_QUERY_RESOURCES).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(resourceName, "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (UnsupportedEncodingException use) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // should not happen
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.buildRegisterListenerQueryString():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + use.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return sb.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static String buildEntitlementRequestQueryString(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String realm,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken userToken,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String resource,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set actionNames,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Map envMap) throws PolicyException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster StringBuilder sb = new StringBuilder();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster realm = (realm == null || (realm.trim().length() == 0)) ? "/"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster : realm;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster realm = URLEncoder.encode(realm, "UTF-8");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(REST_QUERY_REALM).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(realm);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((serviceName == null) || (serviceName.length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "buildEntitlementRequestQueryString():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "serviceName can not be null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "service_name_can_not_be_null", null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&").append(REST_QUERY_APPLICATION).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(serviceName, "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (userToken == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "buildEntitlementRequestQueryString():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "subject can not be null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "subject_can_not_be_null", null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String userTokenId = userToken.getTokenID().toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String hashedUserTokenId = Hash.hash(userTokenId);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&").append(REST_QUERY_SUBJECT).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(hashedUserTokenId, "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((resource == null) || (resource.trim().length() == 0)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.warning("ResourceResultCache."
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "buildEntitlementRequestQueryString():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "resource can not be null");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throw new PolicyException(ResBundleUtils.rbName,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "resource_can_not_be_null", null, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&").append(REST_QUERY_RESOURCE).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(resource, "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((actionNames != null) && !actionNames.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Object actObj: actionNames) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&").append(REST_QUERY_ACTION).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(actObj.toString(), "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((envMap != null) && !envMap.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String encodedEq = URLEncoder.encode("=", "UTF-8");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set keys = envMap.keySet();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Object keyOb : keys) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Set values = (Set)envMap.get(keyOb);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String key = URLEncoder.encode(keyOb.toString(), "UTF-8");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((values != null) && !values.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Object valueOb : values) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append("&").append(REST_QUERY_ENV).append("=");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(key);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(encodedEq);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sb.append(URLEncoder.encode(valueOb.toString(), "UTF-8"));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (UnsupportedEncodingException use) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // should not happen
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster debug.error("ResourceResultCache.buildEntitlementRequestQueryString():"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + use.getMessage());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return sb.toString();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String getRootURL(String url) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (url == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int dsi = url.indexOf("//");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (dsi == -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return url;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int si = url.indexOf("/", dsi + 3);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (si == -1) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return url;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (url.substring(0, si));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster