DefaultJMQSAML2Repository.java revision 4a2f0f0be43dfd4c1b490cbf3cc48b6ba6084b1c
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2008 Sun Microsystems Inc. All Rights Reserved
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The contents of this file are subject to the terms
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * of the Common Development and Distribution License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (the License). You may not use this file except in
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * compliance with the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * You can obtain a copy of the License at
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * https://opensso.dev.java.net/public/CDDLv1.0.html or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * opensso/legal/CDDLv1.0.txt
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * See the License for the specific language governing
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * permission and limitations under the License.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * When distributing Covered Code, include this CDDL
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Header Notice in each file and include the License file
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * at opensso/legal/CDDLv1.0.txt.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * If applicable, add the following below the CDDL Header,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * with the fields enclosed by brackets [] replaced by
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * your own identifying information:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * "Portions Copyrighted [year] [name of copyright owner]"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * $Id: DefaultJMQSAML2Repository.java,v 1.5 2008/08/01 22:23:47 hengming Exp $
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpackage com.sun.identity.saml2.plugins;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.common.SystemTimer;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.common.TimerPool;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.common.GeneralTaskRunnable;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.common.TaskRunnable;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.iplanet.dpro.session.SessionException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.configuration.SystemPropertiesManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.iplanet.dpro.session.service.SessionService;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.iplanet.dpro.session.share.SessionBundle;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.iplanet.services.naming.WebtopNaming;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.session.util.SessionUtils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.Constants;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.shared.debug.Debug;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.ArrayList;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Date;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.HashMap;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.List;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Map;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport java.util.Vector;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport javax.jms.IllegalStateException;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.ha.FAMRecord;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.ha.FAMRecordPersister;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.ha.jmqdb.FAMRecordJMQPersister;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.ha.FAMPersisterManager;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterimport com.sun.identity.saml2.common.SAML2Utils;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This class is used in SAML2 failover mode to store/recover serialized
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * state of Assertion/Response object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterpublic class DefaultJMQSAML2Repository extends GeneralTaskRunnable
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster implements JMQSAML2Repository {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* Operations */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static public final String READ = "READ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static public final String WRITE = "WRITE";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static public final String DELETE = "DELETE";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static public final String DELETEBYDATE = "DELETEBYDATE";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Private data members
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String serverId;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* Config data */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static boolean isDatabaseUp = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * grace period before expired session records are removed from the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * repository
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static long gracePeriod = 5 * 60; /* 5 mins in secs */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static final String CLEANUP_GRACE_PERIOD =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "com.sun.identity.session.repository.cleanupGracePeriod";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static final String BRIEF_DB_ERROR_MSG =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "SAML2 failover service is not functional due to DB unavailability.";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static final String DB_ERROR_MSG =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "SAML2 database is not available at this moment."
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "Please check with the system administrator " +
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "for appropriate actions";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static final String LOG_MSG_DB_BACK_ONLINE =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "SESSION_DATABASE_BACK_ONLINE";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static final String LOG_MSG_DB_UNAVAILABLE =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "SESSION_DATABASE_UNAVAILABLE";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static boolean lastLoggedDBStatusIsUp = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Time period between two successive runs of repository cleanup thread
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * which checks and removes expired records
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static long cleanUpPeriod = 5 * 60 * 1000; // 5 min in milliseconds
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static long cleanUpValue = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static final String CLEANUP_RUN_PERIOD =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "com.sun.identity.saml2.repository.cleanupRunPeriod";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Time period between two successive runs of DBHealthChecker thread which
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * checks for Database availability.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static long healthCheckPeriod = 1 * 60 * 1000;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public static final String HEALTH_CHECK_RUN_PERIOD =
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "com.sun.identity.saml2.repository.healthCheckRunPeriod";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This period is actual one that is used by the thread. The value is set to
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the smallest value of cleanUPPeriod and healthCheckPeriod.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private static long runPeriod = 1 * 60 * 1000; // 1 min in milliseconds
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static Debug debug = SAML2Utils.debug;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private String SAML2="saml2";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster static {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster gracePeriod = Integer.parseInt(SystemPropertiesManager.get(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster CLEANUP_GRACE_PERIOD, String.valueOf(gracePeriod)));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("Invalid value for " + CLEANUP_GRACE_PERIOD
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ", using default");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cleanUpPeriod = Integer.parseInt(SystemPropertiesManager.get(
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster CLEANUP_RUN_PERIOD, String.valueOf(cleanUpPeriod)));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("Invalid value for " + CLEANUP_RUN_PERIOD
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ", using default");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster healthCheckPeriod = Integer
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .parseInt(SystemPropertiesManager.get(HEALTH_CHECK_RUN_PERIOD,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String.valueOf(healthCheckPeriod)));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("Invalid value for " + HEALTH_CHECK_RUN_PERIOD
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + ", using default");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster runPeriod = (cleanUpPeriod <= healthCheckPeriod) ? cleanUpPeriod
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster : healthCheckPeriod;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cleanUpValue = cleanUpPeriod;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Message queues
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // One REQUEST queue/topic is suffcient
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster // Multiple RESPONSE queues/topics may be necessary
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public FAMRecordPersister pSession = null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Constructs new JMQSAML2Repository
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception Exception when cannot create a new SAML2 repository
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public DefaultJMQSAML2Repository() throws Exception {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String thisSessionServerProtocol = SystemPropertiesManager
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .get(Constants.AM_SERVER_PROTOCOL);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String thisSessionServer = SystemPropertiesManager
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .get(Constants.AM_SERVER_HOST);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String thisSessionServerPortAsString = SystemPropertiesManager
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .get(Constants.AM_SERVER_PORT);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String thisSessionURI = SystemPropertiesManager
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster .get(Constants.AM_SERVICES_DEPLOYMENT_DESCRIPTOR);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (thisSessionServerProtocol == null
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster || thisSessionServerPortAsString == null
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster || thisSessionServer == null) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster throw new SessionException(SessionBundle.rbName,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "propertyMustBeSet", null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster serverId = WebtopNaming.getServerID(thisSessionServerProtocol,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster thisSessionServer, thisSessionServerPortAsString,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster thisSessionURI);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster initPersistSession();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SystemTimer.getTimer().schedule(this, new Date((
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster System.currentTimeMillis() / 1000) * 1000));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Initialize new FAMRecord persister
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void initPersistSession() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pSession = FAMPersisterManager.getInstance().
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster getFAMRecordPersister();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isDatabaseUp = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isDatabaseUp = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(BRIEF_DB_ERROR_MSG);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Retrives existing SAML2 object from persistent datastore
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param samlKey primary key
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return SAML2 object, if failed, return null.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public Object retrieve(String samlKey) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!isDatabaseUp) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord famRec = new FAMRecord (
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2, FAMRecord.READ, samlKey, 0, null, 0, null, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord retRec = pSession.send(famRec);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster byte[] blob = retRec.getBlob();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object retObj = SessionUtils.decode(blob);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return retObj;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IllegalStateException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isDatabaseUp = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logDBStatus();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(BRIEF_DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message("JMQSAML2Repository.retrieve(): failed retrieving "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "SAML2 object", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Retrives a list of existing SAML2 object from persistent datastore with
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * secodaryKey
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param secKey Secondary Key
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @return SAML2 object, if failed, return null.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public List retrieveWithSecondaryKey(String secKey) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!isDatabaseUp) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord famRec = new FAMRecord(SAML2,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord.READ_WITH_SEC_KEY, null, 0, secKey, 0, null, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord retRec = pSession.send(famRec);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Map map = retRec.getExtraStringAttributes();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((map != null) && (!map.isEmpty())) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Vector blobs = (Vector)map.values().iterator().next();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((blobs != null) && (!blobs.isEmpty())) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster List list = new ArrayList();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster for(int i=0; i<blobs.size(); i++) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster byte[] blob = (byte[])blobs.get(i);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Object obj = SessionUtils.decode(blob);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list.add(obj);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return list;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IllegalStateException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isDatabaseUp = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logDBStatus();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(BRIEF_DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message("JMQSAML2Repository.retrieve(): failed retrieving "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "SAML2 object", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return null;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Deletes the SAML2 object by given primary key from the repository
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param samlKey primary key
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void delete(String samlKey) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!isDatabaseUp) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord famRec = new FAMRecord (
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2, FAMRecord.DELETE, samlKey, 0, null, 0, null, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord retRec = pSession.send(famRec);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IllegalStateException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isDatabaseUp = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logDBStatus();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(BRIEF_DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("JMQSAML2Repository.delete(): failed deleting "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "SAML2 object", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Deletes expired SAML2 object from the repository
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @exception When Unable to delete the expired SAML2 object
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void deleteExpired() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!isDatabaseUp) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster long date = System.currentTimeMillis() / 1000;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord famRec = new FAMRecord (
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2, FAMRecord.DELETEBYDATE, null,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster date, null, 0, null, null);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord retRec = pSession.send(famRec);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IllegalStateException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isDatabaseUp = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logDBStatus();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(BRIEF_DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("JMQSAML2Repository.deleteExpired(): failed "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "deleting Expired saml2 object", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Saves SAML2 data into the SAML2 Repository
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param samlKey primary key
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param samlObj saml object such as Response, IDPSession
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param expirationTime expiration time
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * @param secKey Secondary Key
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void save(String samlKey, Object samlObj, long expirationTime,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String secKey) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!isDatabaseUp) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster byte[] blob = SessionUtils.encode(samlObj);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord famRec = new FAMRecord (
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SAML2, FAMRecord.WRITE, samlKey, expirationTime, secKey,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster 0, null, blob);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster FAMRecord retRec = pSession.send(famRec);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (IllegalStateException e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster isDatabaseUp = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logDBStatus();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error(BRIEF_DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(DB_ERROR_MSG, e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("JMQSAML2Repository.save(): failed "
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster + "to save SAML2 object", e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This method is invoked to log a message in the following two cases:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (1) the DB is detected down by either the user requests
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (retrieve/save/delete) or the background checker thread:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Log message: HA_DATABASE_UNAVAILABLE (2) the DB is detected
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * available again by the background health checker thread => Log message:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * HA_DATABASE_BACK_ONLINE
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * The flag "lastLoggedDBStatusIsUp" is used to avoid logging the same DB
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * status again and again if the status actually doesn't change over time.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Please also note that if the DB is already down in the very beginning
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * when starting the AM instance, there will be no message being logged
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * since at this time the session service is not fully initialized yet
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * therefore no sso token can be generated and used for the logging purpose.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Nevertheless, the appropriate logging will be done later when the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * background thread kicks in.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster private void logDBStatus() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster SessionService ss = SessionService.getSessionService();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (!isDatabaseUp && lastLoggedDBStatusIsUp) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ss.logSystemMessage(LOG_MSG_DB_UNAVAILABLE,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster java.util.logging.Level.WARNING);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster lastLoggedDBStatusIsUp = false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (isDatabaseUp && !lastLoggedDBStatusIsUp) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ss.logSystemMessage(LOG_MSG_DB_BACK_ONLINE,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster java.util.logging.Level.INFO);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster lastLoggedDBStatusIsUp = true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public long getRunPeriod() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return runPeriod;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public boolean addElement(Object obj) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public boolean removeElement(Object obj) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return false;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public boolean isEmpty() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return true;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /**
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Monitoring logic used by background thread This thread is used for both
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * clenup expired sessions in the repository and for the Database health
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * checking. The thread always runs with smallest value of cleanUpPeriod and
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * healthCheckPeriod.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster public void run() {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster String classMethod="DefaultJMQSAML2Repository.run: ";
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster try {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (debug.messageEnabled()) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.message(classMethod + "Cleaning expired SAML2 records");
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Clean up is done based on the cleanUpPeriod even though the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * thread runs based on the runPeriod.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.isSAML2FailOverEnabled() && (cleanUpValue <= 0)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster deleteExpired();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cleanUpValue = cleanUpPeriod;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster cleanUpValue = cleanUpValue - runPeriod;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * HealthChecking is done based on the runPeriod but only when
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * the Database is down.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (SAML2Utils.isSAML2FailOverEnabled() && (!isDatabaseUp)) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster initPersistSession();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster logDBStatus();
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } catch (Exception e) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster debug.error("JMQSAML2Repository.run(): Exception in thread",
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster e);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster