package org.jacorb.poa;
/*
* JacORB - a free Java ORB
*
* Copyright (C) 1997-2014 Gerald Brose / The JacORB Team.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
import org.jacorb.config.Configurable;
import org.jacorb.config.Configuration;
import org.jacorb.config.ConfigurationException;
import org.jacorb.orb.dsi.ServerRequest;
import org.jacorb.poa.except.ApplicationError;
import org.jacorb.poa.gui.POAMonitorController;
import org.jacorb.poa.gui.POAMonitorView;
import org.jacorb.poa.util.POAUtil;
import org.jacorb.poa.util.StringPair;
import org.omg.PortableServer.ID_ASSIGNMENT_POLICY_ID;
import org.omg.PortableServer.ID_UNIQUENESS_POLICY_ID;
import org.omg.PortableServer.IMPLICIT_ACTIVATION_POLICY_ID;
import org.omg.PortableServer.LIFESPAN_POLICY_ID;
import org.omg.PortableServer.REQUEST_PROCESSING_POLICY_ID;
import org.omg.PortableServer.SERVANT_RETENTION_POLICY_ID;
import org.omg.PortableServer.Servant;
import org.omg.PortableServer.THREAD_POLICY_ID;
import org.slf4j.Logger;
/**
* This class extends the POA with a monitoring gui. It implements all
* poa related listener interfaces and will set up and update the gui.
*
* @author Reimo Tiedemann, FU Berlin
* @version 1.06, 12/08/99, RT
*/
public class POAMonitorImpl
extends POAAdapter
implements POAMonitor, POAMonitorController, Configurable
{
private POA poaModel;
private AOM aomModel;
private RequestQueue queueModel;
private RPPoolManager pmModel;
private POAMonitorView view;
private String prefix;
private int aomSize;
private int queueSize;
private int poolCount;
private int poolSize;
private boolean terminate;
private boolean aomChanged;
private boolean queueChanged;
private boolean pmChanged;
/** the configuration object for this POA instance */
private org.jacorb.config.Configuration configuration = null;
private Logger logger;
private int threadPoolMin = 0;
private int threadPoolMax = 0;
public void configure(Configuration myConfiguration)
throws ConfigurationException
{
this.configuration = (org.jacorb.config.Configuration)myConfiguration;
logger = configuration.getLogger("org.jacorb.poa.monitor");
threadPoolMin =
configuration.getAttributeAsInteger("jacorb.poa.thread_pool_min", 5);
threadPoolMax =
configuration.getAttributeAsInteger("jacorb.poa.thread_pool_max", 20);
}
public void actionCloseView() {
closeMonitor();
}
public void actionDeactivateObject(String oidStr) {
if (poaModel != null) {
try {
poaModel.deactivate_object( oidStr.getBytes() );
} catch (Throwable e) {
printMessage("Exception occurred in deactivateObject() of POAMonitor: "+e);
}
}
}
public void actionRemoveRequestFromQueue(String ridStr) {
if (queueModel != null && poaModel != null) {
try {
ServerRequest request = queueModel.getElementAndRemove(Integer.parseInt(ridStr));
if (request == null) throw new ApplicationError("error: rid " + ridStr + " is not contained in queue");
poaModel.getRequestController().rejectRequest(request, new org.omg.CORBA.OBJ_ADAPTER());
} catch (Throwable e) {
printMessage("Exception occurred in removeRequestFromQueue() of POAMonitor: "+e);
}
}
}
public StringPair[] actionRetrieveAOMContent() {
if (aomModel != null) {
try {
return aomModel != null ? aomModel.deliverContent() : null;
} catch (Throwable e) {
printMessage("Exception occurred in retrieveAOMContent() of POAMonitor: "+e);
}
}
return null;
}
public StringPair[] actionRetrieveQueueContent()
{
if (queueModel != null)
{
try
{
return queueModel.deliverContent();
}
catch (Throwable e)
{
printMessage("Exception during retrieveQueueContent() of POAMonitor: "+e);
}
}
return null;
}
public synchronized void changeState(String state)
{
if (view != null)
{
try
{
view._setState(state);
}
catch (Throwable exception)
{
if (logger.isWarnEnabled())
{
logger.warn("Exception during changeState() of POAMonitor" +
exception.getMessage());
}
}
}
}
public synchronized void closeMonitor()
{
if (view != null)
{
try
{
terminate = true;
poaModel._removePOAEventListener(this);
POAMonitor newMonitor =
(POAMonitor)Class.forName("org.jacorb.poa.POAMonitorLightImpl").newInstance();
newMonitor.init(poaModel, aomModel, queueModel, pmModel, prefix );
newMonitor.configure(configuration);
poaModel.setMonitor(newMonitor);
POAMonitorView tmp = view;
view = null;
tmp._destroy();
}
catch (Throwable exception)
{
if (logger.isWarnEnabled())
{
logger.warn("Exception during closeMonitor() of POAMonitorImpl" +
exception.getMessage());
}
}
}
}
public void init(POA poa, AOM aom,
RequestQueue queue, RPPoolManager pm,
String _prefix )
{
poaModel = poa;
aomModel = aom;
queueModel = queue;
pmModel = pm;
prefix = _prefix;
}
private void initView()
{
if (view != null)
{
try
{
String name = poaModel._getQualifiedName();
view._setName(name.equals("") ? POAConstants.ROOT_POA_NAME :
POAConstants.ROOT_POA_NAME+POAConstants.OBJECT_KEY_SEPARATOR+name);
view._setState(POAUtil.convert(poaModel.getState()));
view._setPolicyThread(POAUtil.convert(poaModel.threadPolicy, THREAD_POLICY_ID.value));
view._setPolicyLifespan(POAUtil.convert(poaModel.lifespanPolicy, LIFESPAN_POLICY_ID.value));
view._setPolicyIdUniqueness(POAUtil.convert(poaModel.idUniquenessPolicy, ID_UNIQUENESS_POLICY_ID.value));
view._setPolicyIdAssignment(POAUtil.convert(poaModel.idAssignmentPolicy, ID_ASSIGNMENT_POLICY_ID.value));
view._setPolicyServantRetention(POAUtil.convert(
poaModel.servantRetentionPolicy, SERVANT_RETENTION_POLICY_ID.value));
view._setPolicyRequestProcessing(POAUtil.convert(
poaModel.requestProcessingPolicy, REQUEST_PROCESSING_POLICY_ID.value));
view._setPolicyImplicitActivation(POAUtil.convert(
poaModel.implicitActivationPolicy, IMPLICIT_ACTIVATION_POLICY_ID.value));
view._initAOMBar(aomModel != null ? 10 : 0, true);
view._initQueueBar(10, true);
view._initActiveRequestsBar(poaModel.isSingleThreadModel() ? 1 : threadPoolMin,
poaModel.isSingleThreadModel() ? 1 : threadPoolMax);
view._initThreadPoolBar(0);
}
catch (Throwable exception)
{
if (logger.isWarnEnabled())
{
logger.warn("Exception during initView() of POAMonitor" +
exception.getMessage());
}
}
}
}
public void objectActivated(byte[] oid, Servant servant, int aom_size)
{
aomSize = aom_size;
aomChanged = true;
refreshAOM();
}
public void objectDeactivated(byte[] oid, Servant servant, int aom_size)
{
aomSize = aom_size;
aomChanged = true;
refreshAOM();
}
public synchronized void openMonitor()
{
if (view == null)
{
try
{
aomSize = aomModel != null ? aomModel.size() : 0;
queueSize = queueModel.size();
poolCount = pmModel.getPoolCount();
poolSize = pmModel.getPoolSize();
view = new org.jacorb.poa.gui.poa.POAFrame(this);
initView();
refreshView();
poaModel._addPOAEventListener(this);
view._setVisible(true);
}
catch (Throwable exception)
{
if (logger.isWarnEnabled())
{
logger.warn("Exception occurred in openMonitor() of POAMonitor" +
exception.getMessage() );
}
}
}
}
private synchronized void printMessage(String str)
{
if (view != null)
{
try
{
view._printMessage(str);
}
catch (Throwable exception)
{
System.err.println("Exception occurred in _printMessage() of POAMonitor");
}
}
}
public void processorAddedToPool(RequestProcessor processor,
int pool_count,
int pool_size)
{
poolCount = pool_count;
poolSize = pool_size;
pmChanged = true;
refreshPM();
}
public void processorRemovedFromPool(RequestProcessor processor,
int pool_count,
int pool_size)
{
poolCount = pool_count;
poolSize = pool_size;
pmChanged = true;
refreshPM();
}
private /* synchronized */ void refreshAOM()
{
if (view != null)
{
try
{
view._setValueAOMBar(aomSize);
}
catch (Throwable exception)
{
if (logger.isWarnEnabled())
{
logger.warn("Exception during refreshAOM() of POAMonitor" +
exception.getMessage());
}
}
}
}
private /* synchronized */ void refreshPM()
{
if (view != null)
{
try
{
view._setValueActiveRequestsBar(poolSize-poolCount);
view._setMaxThreadPoolBar(poolSize);
view._setValueThreadPoolBar(poolCount);
}
catch (Throwable exception)
{
if (logger.isWarnEnabled())
{
logger.warn("Exception occurred in refreshPM() of POAMonitor" +
exception.getMessage());
}
}
}
}
private /* synchronized */ void refreshQueue()
{
if (view != null)
{
try
{
view._setValueQueueBar(queueSize);
}
catch (Throwable exception)
{
if (logger.isWarnEnabled())
{
logger.warn("Exception occurred in refreshQueue() of POAMonitor: " +
exception.getMessage());
}
}
}
}
private void refreshView()
{
refreshAOM();
refreshQueue();
refreshPM();
}
public void requestAddedToQueue(ServerRequest request, int queue_size) {
queueSize = queue_size;
queueChanged = true;
refreshQueue();
}
public void requestRemovedFromQueue(ServerRequest request, int queue_size) {
queueSize = queue_size;
queueChanged = true;
refreshQueue();
}
}