/* $Id: ManifoldCF.java 988245 2010-08-23 18:39:35Z kwright $ */
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.manifoldcf.authorities.system;
import org.apache.manifoldcf.core.interfaces.*;
import org.apache.manifoldcf.authorities.interfaces.*;
import java.io.*;
import java.util.*;
public class ManifoldCF extends org.apache.manifoldcf.core.system.ManifoldCF
{
// Initialization needed flag
protected static boolean authoritiesInitialized = false;
// Threads
protected static IdleCleanupThread idleCleanupThread = null;
protected static AuthCheckThread[] authCheckThreads = null;
protected static MappingThread[] mappingThreads = null;
// Number of auth check threads
protected static int numAuthCheckThreads = 0;
// Number of mapping threads
protected static int numMappingThreads = 0;
protected static final String authCheckThreadCountProperty = "org.apache.manifoldcf.authorityservice.threads";
protected static final String mappingThreadCountProperty = "org.apache.manifoldcf.authorityservice.mappingthreads";
// Request queue
protected static RequestQueue<AuthRequest> requestQueue = null;
// Mapping request queue
protected static RequestQueue<MappingRequest> mappingRequestQueue = null;
/** Initialize environment.
*/
public static void initializeEnvironment(IThreadContext tc)
throws ManifoldCFException
{
synchronized (initializeFlagLock)
{
org.apache.manifoldcf.core.system.ManifoldCF.initializeEnvironment(tc);
org.apache.manifoldcf.authorities.system.ManifoldCF.localInitialize(tc);
}
}
public static void cleanUpEnvironment(IThreadContext tc)
{
synchronized (initializeFlagLock)
{
org.apache.manifoldcf.authorities.system.ManifoldCF.localCleanup(tc);
org.apache.manifoldcf.core.system.ManifoldCF.cleanUpEnvironment(tc);
}
}
public static void localInitialize(IThreadContext tc)
throws ManifoldCFException
{
synchronized (initializeFlagLock)
{
if (authoritiesInitialized)
return;
Logging.initializeLoggers();
Logging.setLogLevels(tc);
authoritiesInitialized = true;
}
}
public static void localCleanup(IThreadContext tc)
{
// Since pools are a shared resource, we clean them up only
// when we are certain nothing else is using them in the JVM.
try
{
AuthorityConnectorPoolFactory.make(tc).closeAllConnectors();
}
catch (ManifoldCFException e)
{
if (Logging.authorityService != null)
Logging.authorityService.warn("Exception closing authority connection pool: "+e.getMessage(),e);
}
try
{
MappingConnectorPoolFactory.make(tc).closeAllConnectors();
}
catch (ManifoldCFException e)
{
if (Logging.authorityService != null)
Logging.authorityService.warn("Exception closing mapping connection pool: "+e.getMessage(),e);
}
}
/** Install all the authority manager system tables.
*@param threadcontext is the thread context.
*/
public static void installSystemTables(IThreadContext threadcontext)
throws ManifoldCFException
{
IAuthorizationDomainManager domainMgr = AuthorizationDomainManagerFactory.make(threadcontext);
IAuthorityGroupManager groupMgr = AuthorityGroupManagerFactory.make(threadcontext);
IAuthorityConnectorManager connMgr = AuthorityConnectorManagerFactory.make(threadcontext);
IAuthorityConnectionManager authConnMgr = AuthorityConnectionManagerFactory.make(threadcontext);
IMappingConnectorManager mappingConnectorMgr = MappingConnectorManagerFactory.make(threadcontext);
IMappingConnectionManager mappingConnectionMgr = MappingConnectionManagerFactory.make(threadcontext);
domainMgr.install();
connMgr.install();
mappingConnectorMgr.install();
groupMgr.install();
authConnMgr.install();
mappingConnectionMgr.install();
}
/** Uninstall all the authority manager system tables.
*@param threadcontext is the thread context.
*/
public static void deinstallSystemTables(IThreadContext threadcontext)
throws ManifoldCFException
{
IAuthorizationDomainManager domainMgr = AuthorizationDomainManagerFactory.make(threadcontext);
IAuthorityConnectorManager connMgr = AuthorityConnectorManagerFactory.make(threadcontext);
IAuthorityGroupManager groupMgr = AuthorityGroupManagerFactory.make(threadcontext);
IAuthorityConnectionManager authConnMgr = AuthorityConnectionManagerFactory.make(threadcontext);
IMappingConnectorManager mappingConnectorMgr = MappingConnectorManagerFactory.make(threadcontext);
IMappingConnectionManager mappingConnectionMgr = MappingConnectionManagerFactory.make(threadcontext);
mappingConnectionMgr.deinstall();
authConnMgr.deinstall();
groupMgr.deinstall();
mappingConnectorMgr.deinstall();
connMgr.deinstall();
domainMgr.deinstall();
}
/** Start the authority system.
*/
public static void startSystem(IThreadContext threadContext)
throws ManifoldCFException
{
// Read any parameters
numAuthCheckThreads = LockManagerFactory.getIntProperty(threadContext, authCheckThreadCountProperty, 10);
if (numAuthCheckThreads < 1 || numAuthCheckThreads > 100)
throw new ManifoldCFException("Illegal value for the number of auth check threads");
numMappingThreads = LockManagerFactory.getIntProperty(threadContext, mappingThreadCountProperty, 10);
if (numMappingThreads < 1 || numMappingThreads > 100)
throw new ManifoldCFException("Illegal value for the number of mapping threads");
// Start up threads
idleCleanupThread = new IdleCleanupThread();
idleCleanupThread.start();
requestQueue = new RequestQueue<AuthRequest>();
mappingRequestQueue = new RequestQueue<MappingRequest>();
authCheckThreads = new AuthCheckThread[numAuthCheckThreads];
for (int i = 0; i < numAuthCheckThreads; i++)
{
authCheckThreads[i] = new AuthCheckThread(Integer.toString(i),requestQueue);
authCheckThreads[i].start();
}
mappingThreads = new MappingThread[numMappingThreads];
for (int i = 0; i < numMappingThreads; i++)
{
mappingThreads[i] = new MappingThread(Integer.toString(i),mappingRequestQueue);
mappingThreads[i].start();
}
}
/** Shut down the authority system.
*/
public static void stopSystem(IThreadContext threadContext)
throws ManifoldCFException
{
while (idleCleanupThread != null || authCheckThreads != null || mappingThreads != null)
{
if (idleCleanupThread != null)
{
idleCleanupThread.interrupt();
}
if (authCheckThreads != null)
{
for (int i = 0; i < authCheckThreads.length; i++)
{
Thread authCheckThread = authCheckThreads[i];
if (authCheckThread != null)
authCheckThread.interrupt();
}
}
if (mappingThreads != null)
{
for (int i = 0; i < mappingThreads.length; i++)
{
Thread mappingThread = mappingThreads[i];
if (mappingThread != null)
mappingThread.interrupt();
}
}
if (idleCleanupThread != null)
{
if (!idleCleanupThread.isAlive())
idleCleanupThread = null;
}
if (authCheckThreads != null)
{
boolean isAlive = false;
for (int i = 0; i < authCheckThreads.length; i++)
{
Thread authCheckThread = authCheckThreads[i];
if (authCheckThread != null)
{
if (!authCheckThread.isAlive())
authCheckThreads[i] = null;
else
isAlive = true;
}
i++;
}
if (!isAlive)
authCheckThreads = null;
}
if (mappingThreads != null)
{
boolean isAlive = false;
for (int i = 0; i < mappingThreads.length; i++)
{
Thread mappingThread = mappingThreads[i];
if (mappingThread != null)
{
if (!mappingThread.isAlive())
mappingThreads[i] = null;
else
isAlive = true;
}
i++;
}
if (!isAlive)
mappingThreads = null;
}
try
{
ManifoldCF.sleep(1000);
}
catch (InterruptedException e)
{
}
}
// Release all authority connectors
AuthorityConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
numAuthCheckThreads = 0;
requestQueue = null;
MappingConnectorPoolFactory.make(threadContext).flushUnusedConnectors();
numMappingThreads = 0;
mappingRequestQueue = null;
}
/** Get the current request queue */
public static RequestQueue<AuthRequest> getRequestQueue()
{
return requestQueue;
}
/** Get the current mapping request queue */
public static RequestQueue<MappingRequest> getMappingRequestQueue()
{
return mappingRequestQueue;
}
}