diff --git a/auth_token/server/AuthTokenSvc/README b/auth_token/server/AuthTokenSvc/README
index b3b564c9..6b83201b 100644
--- a/auth_token/server/AuthTokenSvc/README
+++ b/auth_token/server/AuthTokenSvc/README
@@ -67,6 +67,7 @@ Thhe following is an example svc.settings file:
43200
10
/home/jluciani/jakarta-tomcat-5.0.28/webapps/CasaAuthTokenSvc/WEB-INF/conf/iaRealms.xml
+ 60
o=novell
@@ -89,6 +90,12 @@ Note the following about the sample svc.settings file:
the different realms (contexts) that the ATS can utilize to authenticate
entities and resolve identities. In the future the configuration of this
settng will be optional.
+
+- The ReconfigureInterval setting specifies how often the ATS should refresh its
+ configuration. The default value for this setting is 60 seconds. A ReconfigureInterval
+ value of 0 means that the ATS will not refresh its configuration once it has been
+ initialized, thus requiring that the servlet be re-initialized to make configuration
+ changes take effect.
- The startSearchContext setting specifies the begin location for initiating
context searches. The absence of this setting will result in searches ocurring
diff --git a/auth_token/server/AuthTokenSvc/src/com/novell/casa/authtoksvc/Rpc.java b/auth_token/server/AuthTokenSvc/src/com/novell/casa/authtoksvc/Rpc.java
index 8c3cb53e..6da2ca7c 100644
--- a/auth_token/server/AuthTokenSvc/src/com/novell/casa/authtoksvc/Rpc.java
+++ b/auth_token/server/AuthTokenSvc/src/com/novell/casa/authtoksvc/Rpc.java
@@ -46,21 +46,133 @@ public class Rpc extends javax.servlet.http.HttpServlet implements javax.servlet
{
private static final long serialVersionUID = -8264027868130334613L;
- private EnabledSvcsConfig m_enabledSvcsConfig;
- private Map m_methodsMap;
+ private String m_appFolderPath = null;
+ private String m_configFolderPath = null;
+
+ protected ReconfigureThread m_reconfigureThread = null;
+ protected int m_reconfigureInterval; // seconds
+
+ private Map m_methodsMap;
+
+ /*
+ * Reconfigure Thread Class.
+ *
+ * This class implements a runnable thread that reconfigures an Rpc Servlet instance.
+ *
+ */
+ private class ReconfigureThread implements Runnable
+ {
+ private Rpc m_rpc;
+ private Thread m_thread;
+
+ /*
+ * Constructor.
+ */
+ public ReconfigureThread (Rpc rpc)
+ {
+ m_rpc = rpc;
+ m_thread = new Thread(this);
+ m_thread.start();
+ }
+
+ /*
+ * run() implementation.
+ */
+ public void run ()
+ {
+ System.err.println("ReconfigureThread.run()- Running");
+
+ while (true)
+ {
+ // Sleep an ammount equal the reconfigure interval for the Rpc
+ try
+ {
+ m_thread.sleep(m_rpc.m_reconfigureInterval * 1000);
+ }
+ catch (InterruptedException e) { /* nothing to do */ }
+
+ // Re-configure the Rpc servlet.
+ try
+ {
+ m_rpc.configureServlet();
+
+ // Check if it is no longer necessary to re-configure the servlet
+ if (m_rpc.m_reconfigureInterval == 0)
+ {
+ System.err.println("ReconfigureTask.run()- Configuration changed to no longer perform timed re-configuration");
+ break;
+ }
+ }
+ catch (Exception e)
+ {
+ System.err.println("ReconfigureTask.run()- Exception caught during re-configure process, " + e.toString());
+ }
+ }
+ }
+
+ /*
+ * stop() implementation.
+ */
+ public void stop ()
+ {
+ m_thread.stop();
+ }
+ }
/*
* Constructor.
*/
- public Rpc()
+ public Rpc ()
{
super();
}
+ /*
+ * configureServlet() implementation.
+ */
+ protected void configureServlet () throws Exception
+ {
+ // Read service configuration
+ SvcConfig svcConfig = new SvcConfig(m_appFolderPath, m_configFolderPath);
+
+ // Get the reconfigure interval
+ try
+ {
+ m_reconfigureInterval = Integer.parseInt(svcConfig.getSetting(SvcConfig.ReconfigureInterval));
+ }
+ catch (NumberFormatException e)
+ {
+ System.err.println("Rpc.configureServlet()- Invalid reconfigure interval value format");
+ m_reconfigureInterval = Integer.parseInt(SvcConfig.DefaultReconfigureIntervalValue);
+ }
+
+ // Read enabled services configuration
+ EnabledSvcsConfig enabledSvcsConfig = new EnabledSvcsConfig(m_configFolderPath);
+
+ // Create a map to keep track of the Rpc methods
+ Map methodsMap = new HashMap();
+
+ // Instantiate the Rpc Methods
+ RpcMethod getAuthPolicy = new GetAuthPolicy();
+ getAuthPolicy.init(svcConfig, enabledSvcsConfig);
+ methodsMap.put(getAuthPolicy.getId(), getAuthPolicy);
+
+ RpcMethod authenticate = new Authenticate();
+ authenticate.init(svcConfig, enabledSvcsConfig);
+ methodsMap.put(authenticate.getId(), authenticate);
+
+ RpcMethod getAuthToken = new GetAuthToken();
+ getAuthToken.init(svcConfig, enabledSvcsConfig);
+ methodsMap.put(getAuthToken.getId(), getAuthToken);
+
+ // Set the map as the methods map used by the servlet
+ m_methodsMap = methodsMap;
+ }
+
/*
* init() implementation.
*/
- public void init(ServletConfig config) throws ServletException
+ public void init (ServletConfig config) throws ServletException
{
super.init(config);
@@ -71,38 +183,25 @@ public class Rpc extends javax.servlet.http.HttpServlet implements javax.servlet
// Get the path to our configuration folder
//
// First check if it has been specified via a system property
- String configFolder;
ServletContext context = config.getServletContext();
- configFolder = System.getProperty("com.novell.casa.authtoksvc.config");
- if (configFolder == null)
+ m_appFolderPath = context.getRealPath(File.separator);
+ m_configFolderPath = System.getProperty("com.novell.casa.authtoksvc.config");
+ if (m_configFolderPath == null)
{
// The path to the svc config folder was not specified via a system
// property, assume that it's location is off the WEB-INF folder for
// our web application.
- configFolder = context.getRealPath(File.separator) + "WEB-INF/conf";
+ m_configFolderPath = m_appFolderPath + "WEB-INF/conf";
}
- // Read service configuration
- SvcConfig svcConfig = new SvcConfig(context.getRealPath(File.separator), configFolder);
+ // Configure ourselves
+ configureServlet();
- // Read enabled services configuration
- EnabledSvcsConfig enabledSvcsConfig = new EnabledSvcsConfig(configFolder);
-
- // Create a map to keep track of the Rpc methods
- m_methodsMap = new HashMap();
-
- // Instantiate the Rpc Methods
- RpcMethod getAuthPolicy = new GetAuthPolicy();
- getAuthPolicy.init(svcConfig, enabledSvcsConfig);
- m_methodsMap.put(getAuthPolicy.getId(), getAuthPolicy);
-
- RpcMethod authenticate = new Authenticate();
- authenticate.init(svcConfig, enabledSvcsConfig);
- m_methodsMap.put(authenticate.getId(), authenticate);
-
- RpcMethod getAuthToken = new GetAuthToken();
- getAuthToken.init(svcConfig, enabledSvcsConfig);
- m_methodsMap.put(getAuthToken.getId(), getAuthToken);
+ // Check if we must start a thread to periodically reconfigure ourselves
+ if (m_reconfigureInterval != 0)
+ {
+ m_reconfigureThread = new ReconfigureThread(this);
+ }
}
catch (Exception e)
{
@@ -114,17 +213,23 @@ public class Rpc extends javax.servlet.http.HttpServlet implements javax.servlet
/*
* destroy() implementation.
*/
- public void destroy()
+ public void destroy ()
{
super.destroy();
System.err.println("Rpc.destroy()");
+
+ // Stop our re-configure thread
+ if (m_reconfigureThread != null)
+ {
+ m_reconfigureThread.stop();
+ }
}
/*
* doGet() implementation.
*/
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
doPost(request, response);
}
@@ -132,7 +237,7 @@ public class Rpc extends javax.servlet.http.HttpServlet implements javax.servlet
/*
* doPost() implementation.
*/
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// Get ready to send back a reply
response.setContentType("text/html");
diff --git a/auth_token/server/AuthTokenSvc/src/com/novell/casa/authtoksvc/SvcConfig.java b/auth_token/server/AuthTokenSvc/src/com/novell/casa/authtoksvc/SvcConfig.java
index df111a13..a9c34e50 100644
--- a/auth_token/server/AuthTokenSvc/src/com/novell/casa/authtoksvc/SvcConfig.java
+++ b/auth_token/server/AuthTokenSvc/src/com/novell/casa/authtoksvc/SvcConfig.java
@@ -52,10 +52,12 @@ public class SvcConfig
public final static String StartSearchContext = "startSearchContext";
public final static String ConfigFolderPath = "ConfigFolderPath";
public final static String AppRootPath = "AppRootPath";
+ public final static String ReconfigureInterval = "ReconfigureInterval";
// Default configuration values
- private String m_defaultSessionTokenLifetimeValue = "43200"; // Seconds
- private String m_defaultLifetimeShorterValue = "5"; // Seconds
+ public final static String DefaultSessionTokenLifetimeValue = "43200"; // Seconds
+ public final static String DefaultLifetimeShorterValue = "5"; // Seconds
+ public final static String DefaultReconfigureIntervalValue = "60"; // Seconds
private static final String m_svcSettingsFileName = "svc.settings";
private Map m_svcSettingsMap;
@@ -255,19 +257,27 @@ public class SvcConfig
// which we have defaults.
if (settingName.equals(SessionTokenLifetime) == true)
{
- value = m_defaultSessionTokenLifetimeValue;
+ value = DefaultSessionTokenLifetimeValue;
System.err.println("SvcConfig.getSetting()- Assigning default value " + value);
// Add the key to the map so that it can be found quicker next time
- m_svcSettingsMap.put(SessionTokenLifetime, m_defaultSessionTokenLifetimeValue);
+ m_svcSettingsMap.put(SessionTokenLifetime, DefaultSessionTokenLifetimeValue);
}
else if (settingName.equals(LifetimeShorter) == true)
{
- value = m_defaultLifetimeShorterValue;
+ value = DefaultLifetimeShorterValue;
System.err.println("SvcConfig.getSetting()- Assigning default value " + value);
// Add the key to the map so that it can be found quicker next time
- m_svcSettingsMap.put(LifetimeShorter, m_defaultLifetimeShorterValue);
+ m_svcSettingsMap.put(LifetimeShorter, DefaultLifetimeShorterValue);
+ }
+ else if (settingName.equals(ReconfigureInterval) == true)
+ {
+ value = DefaultReconfigureIntervalValue;
+ System.err.println("SvcConfig.getSetting()- Assigning default value " + value);
+
+ // Add the key to the map so that it can be found quicker next time
+ m_svcSettingsMap.put(ReconfigureInterval, DefaultReconfigureIntervalValue);
}
else if (settingName.equals(IdentityAbstractionConfigFile) == true)
{