bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington/*
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Copyright (c) 2005 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: CachedSMSEntry.java,v 1.16 2009/10/08 20:33:54 hengming Exp $
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * Portions Copyrighted 2015 ForgeRock AS.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpackage com.sun.identity.sm;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.am.util.SystemProperties;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.IOException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.io.InputStream;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.lang.reflect.Method;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.ArrayList;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashSet;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Iterator;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Map;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Set;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.sso.SSOException;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.iplanet.sso.SSOToken;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport com.sun.identity.shared.Constants;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.Collections;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterimport java.util.HashMap;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonimport org.forgerock.opendj.ldap.DN;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The class <code>CachedSchemaManagerImpl</code> provides interfaces to
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * manage the SMSEntry. It caches SMSEntries which is used by ServiceSchema and
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * ServiceConfig classes.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterpublic class CachedSMSEntry {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Notification method that will be called for ServiceSchemaManagerImpls
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected static final String UPDATE_METHOD = "update";
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Cache of CachedSMSEntries (static)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected static Map smsEntries = Collections.synchronizedMap(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new HashMap(1000));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Instance variables
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Set of ServiceSchemaManagerImpls and ServiceConfigImpls
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // that must be updated where entry changes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected Set serviceObjects = Collections.synchronizedSet(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new HashSet());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected String notificationID;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected Set principals = Collections.synchronizedSet(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new HashSet(10)); // Principals who have read access
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected SSOToken token; // Valid SSOToken used for read
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected String dn2Str;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected String dnRFCStr;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected SMSEntry smsEntry;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Flag that determines if this object can be used
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean valid;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Flag to determine if the cached entry is dirty and
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // must be refreshed along with the last update time & TTL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private boolean dirty;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private Object dirtyLock = new Object();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static boolean ttlEnabled;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static long lastUpdate;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static long ttl = 1800000; // 30 minutes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Private constructor, can be instantiated only via getInstance
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private CachedSMSEntry(SMSEntry e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster smsEntry = e;
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington DN dn = DN.valueOf(e.getDN());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dn2Str = dn.toString();
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington dnRFCStr = dn.toString().toLowerCase();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster token = e.getSSOToken();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster addPrincipal(token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster valid = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Set the SMSEntry as read only
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster smsEntry.setReadOnly();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Register for notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster notificationID = SMSEventListenerManager.notifyChangesToNode(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster token, smsEntry.getDN(), UPDATE_FUNC, this, null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Write debug messages
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSEntry.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.message("CachedSMSEntry: New instance: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ----------------------------------------------
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Protected instance methods
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ----------------------------------------------
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean isValid() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return valid;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Used by JAXRPCObjectImpl
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public boolean isDirty() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ttlEnabled && !dirty &&
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ((System.currentTimeMillis() - lastUpdate) > ttl)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (dirtyLock) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dirty = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return dirty;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Invoked by SMSEventListenerManager when entry has been changed.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Mark the entry as dirty and return. The method refresh() must be
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * called to read the attributes.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster void update() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSEntry.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.message("CachedSMSEntry: update "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "method called: " + dn2Str );
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (dirtyLock) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dirty = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Reads the attributes from the datastore and send notifications to
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * objects caching this entry. Used by JAXRPCObjectImpl
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public void refresh() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (dirtyLock) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSEntry.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.message("CachedSMSEntry: refresh "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "method called: " + dn2Str );
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Read the LDAP attributes and update listeners
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean updated = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dirty = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SSOToken t = getValidSSOToken();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (t != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster smsEntry.read(t);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster lastUpdate = System.currentTimeMillis();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster updated = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } else if (SMSEntry.debug.warningEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.warning("CachedSMSEntry:update No VALID " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "SSOToken found for dn: " + dn2Str);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SMSException e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Error in reading the attribtues, entry could be deleted
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // or does not have permissions to read the object
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.error("Error in reading entry attributes: " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dn2Str, e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException ssoe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Error in reading the attribtues, SSOToken problem
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Might have timed-out
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.error("SSOToken problem in reading entry "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "attributes: " + dn2Str, ssoe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!updated) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // No valid SSOToken were foung
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // this entry is no long valid, remove from cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster clear();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Update service listeners either success or failure
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // updateServiceListeners(UPDATE_METHOD);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster updateServiceListeners(UPDATE_METHOD);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dirty = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Updates the attributes from the provided <class>SMSEntry</class>
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * and marks the entry as non-dirty.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param e object that contains the updated values for the attributes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @throws com.sun.identity.sm.SMSException
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster void refresh(SMSEntry e) throws SMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (dirtyLock) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster smsEntry.refresh(e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster updateServiceListeners(UPDATE_METHOD);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dirty = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Clears the local variables and marks the entry as invalid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Called by the SMS objects that have an instance of CachedSMSEntry
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster void clear() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster clear(true);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Marks the object to be invalid and deregisters for notifications.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Called by the static method clearCache()
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param removeFromCache remove itself from cache if set to true
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void clear(boolean removeFromCache) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // this entry is no long valid, remove from cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEventListenerManager.removeNotification(notificationID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster notificationID = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster valid = false;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized(dirtyLock) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster dirty = true;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Remove from cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (removeFromCache) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster smsEntries.remove(dnRFCStr);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Returns a valid SSOToken that can be used for reading
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private SSOToken getValidSSOToken() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Check if the cached SSOToken is valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!SMSEntry.tm.isValidToken(token)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Get a valid ssoToken from cached TokenIDs
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (principals) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator items = principals.iterator(); items.hasNext();) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String tokenID = (String) items.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster token = SMSEntry.tm.createSSOToken(tokenID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSEntry.tm.isValidToken(token)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster break;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException ssoe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // SSOToken has expired, remove from list
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster items.remove();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // If there are no valid SSO Tokens return null
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (principals.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Sends notifications to ServiceSchemaManagerImpl and ServiceConfigImpl
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * The method determines the object's method that would be invoked.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * It could be either update() -- in which only the local instances are
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * updated, or updateAndNotify() -- in which case the listeners are also
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * notified.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param method either "update" or "updateAndNotify"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private void updateServiceListeners(String method) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSEntry.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.message("CachedSMSEntry::updateServiceListeners "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "method called: " + dn2Str);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Inform the ServiceSchemaManager's of changes to attributes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ArrayList tmpServiceObjects = new ArrayList();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (serviceObjects) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for(Iterator objs = serviceObjects.iterator(); objs.hasNext();) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster tmpServiceObjects.add(objs.next());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for(Iterator objs = tmpServiceObjects.iterator(); objs.hasNext();){
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Object obj = objs.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Method m = obj.getClass().getDeclaredMethod(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster method, (Class[]) null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster m.invoke(obj, (Object[]) null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Throwable e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.error("CachedSMSEntry::unable to " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "deliver notification(" + dn2Str + ")", e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Method to add objects that needs notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void addServiceListener(Object o) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceObjects.add(o);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Method to remove objects that needs notifications
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster protected void removeServiceListener(Object o) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster serviceObjects.remove(o);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (serviceObjects.isEmpty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEventListenerManager.removeNotification(notificationID);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster notificationID = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized void addPrincipal(SSOToken t) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Making a local copy to avoid synchronization problems
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster principals.add(t.getTokenID().toString());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean checkPrincipal(SSOToken t) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (principals.contains(t.getTokenID().toString()));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public SMSEntry getSMSEntry() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (smsEntry);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public SMSEntry getClonedSMSEntry() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (isDirty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster refresh();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return ((SMSEntry) smsEntry.clone());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (CloneNotSupportedException c) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.error("Unable to clone SMSEntry: " + smsEntry, c);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster boolean isNewEntry() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (isDirty()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster refresh();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (smsEntry.isNewEntry());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String getDN() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (dn2Str);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ----------------------------------------------
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // protected static methods
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ----------------------------------------------
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Used by ServiceSchemaManager
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static CachedSMSEntry getInstance(SSOToken t, ServiceSchemaManagerImpl ssm,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String serviceName, String version) throws SMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSMSEntry entry = null;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String dn = ServiceManager.getServiceNameDN(serviceName, version);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entry = getInstance(t, dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster entry.addServiceListener(ssm);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (SSOException ssoe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.error("SMS: Invalid SSOToken: ", ssoe);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (entry);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster public static CachedSMSEntry getInstance(SSOToken t, String dn)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SMSException, SSOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSEntry.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.message("CachedSMSEntry::getInstance: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington String cacheEntry = DN.valueOf(dn).toString().toLowerCase();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSMSEntry answer = (CachedSMSEntry) smsEntries.get(cacheEntry);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if ((answer == null) || !answer.isValid()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Construct the SMS entry. Should be outside the synchronized
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // block since SMSEntry call delegation which in turn calls
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // policy, idrepo, special repo and SMS again
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSMSEntry tmp = new CachedSMSEntry(new SMSEntry(t, dn));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (smsEntries) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (((answer = (CachedSMSEntry) smsEntries.get(cacheEntry))
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster == null) || !answer.isValid()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Add it to cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer = tmp;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster smsEntries.put(cacheEntry, answer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Check if user has permissions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (!answer.checkPrincipal(t)) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Read the SMS entry as that user, and ignore the results
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster new SMSEntry(t, dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster answer.addPrincipal(t);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSEntry.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.message("CachedSMSEntry: obtained instance: " + dn);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (answer.isNewEntry()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry sEntry = answer.getSMSEntry();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster sEntry.dn = dn;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (answer);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static void initializeProperties() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Initialize the TTL
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String ttlEnabledString = SystemProperties.get(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster Constants.SMS_CACHE_TTL_ENABLE, "false");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ttlEnabled = Boolean.valueOf(ttlEnabledString).booleanValue();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (ttlEnabled) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String cacheTime = SystemProperties.get(Constants.SMS_CACHE_TTL);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (cacheTime != null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ttl = Long.parseLong(cacheTime);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Convert minutes to milliseconds
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ttl = ttl * 60* 1000;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (NumberFormatException nfe) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.error("CachedSMSEntry:init Invalid time " +
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "for SMS Cache TTL: " + cacheTime);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster ttl = 1800000; // 30 minutes, default
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Clears the cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static void clearCache() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster synchronized (smsEntries) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster for (Iterator items = smsEntries.values().iterator();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster items.hasNext();) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CachedSMSEntry cEntry = (CachedSMSEntry) items.next();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // this entry is no long valid
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster cEntry.clear(false);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Remove all entries from cache
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster smsEntries.clear();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ----------------------------------------------
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // protected instance methods for ServiceSchemaManager
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // ----------------------------------------------
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String getXMLSchema() {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] schema = smsEntry.getAttributeValues(SMSEntry.ATTR_SCHEMA);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (schema == null) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // The entry could be deleted, hence return null
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Since schema is a single valued attribute
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster return (schema[0]);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster void writeXMLSchema(SSOToken token, InputStream xmlServiceSchema)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster throws SSOException, SMSException, IOException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int lengthOfStream = xmlServiceSchema.available();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster byte[] byteArray = new byte[lengthOfStream];
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster xmlServiceSchema.read(byteArray, 0, lengthOfStream);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster writeXMLSchema(token, new String(byteArray));
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster void writeXMLSchema(SSOToken token, String xmlSchema) throws SSOException,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSException {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Validate SSOtoken
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.validateToken(token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Replace the attribute in the directory
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster String[] attrValues = { xmlSchema };
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry e = getClonedSMSEntry();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster e.setAttribute(SMSEntry.ATTR_SCHEMA, attrValues);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster e.save(token);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster refresh(e);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster if (SMSEntry.debug.messageEnabled()) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster SMSEntry.debug.message("CachedSMSEntry::writeXMLSchema: "
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster + "successfully wrote the XML schema for dn: " + e.getDN());
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Protected static variables
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static Class CACHED_SMSENTRY;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster private static Method UPDATE_FUNC;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster static {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster try {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster CACHED_SMSENTRY = Class.forName(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster "com.sun.identity.sm.CachedSMSEntry");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster UPDATE_FUNC = CACHED_SMSENTRY.getDeclaredMethod(
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster UPDATE_METHOD, (Class[]) null);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster initializeProperties();
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster } catch (Exception e) {
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster // Should not happen, ignore
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster }
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster}