/* * ALMA - Atacama Large Millimiter Array * (c) European Southern Observatory, 2004 * Copyright by ESO (in the framework of the ALMA collaboration), * All rights reserved * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ package alma.acs.container; import si.ijs.maci.ContainerOperations; import alma.JavaContainerError.wrappers.AcsJContainerEx; import alma.JavaContainerError.wrappers.AcsJContainerServicesEx; import alma.acs.container.corba.AcsCorba; import alma.acs.logging.AcsLogger; import alma.acs.logging.ClientLogManager; /** * Runner for an embedded container, i.e. a container that gets started in the JVM of an ACS-aware application * such as the Exec GUI. *
* See comments for {@link #run(AcsCorba, String, String)}, which is the only method that must be called,
* with the required external initializations.
*
* @author hsommer
* created Apr 25, 2005 5:55:27 PM
*/
public class AcsEmbeddedContainerRunner {
protected AcsLogger m_logger;
protected AcsCorba m_acsCorba;
protected AcsContainer m_container;
protected final boolean isEmbedded;
protected final Boolean recoveryModeOverride;
protected String m_containerName;
protected String m_managerLoc;
protected AcsManagerProxy m_managerProxy;
/**
* Constructor to be used by a separate application which needs to create an embedded container.
*/
public AcsEmbeddedContainerRunner() {
this(true, false);
}
/**
* @param isEmbedded false if this runner is not started by a separate application, but merely by some other runner.
*/
AcsEmbeddedContainerRunner(boolean isEmbedded, Boolean recoveryModeOverride) {
this.isEmbedded = isEmbedded;
this.recoveryModeOverride = recoveryModeOverride;
}
/**
* Runs this container using the ORB provided in acsCorba
and returns w/o blocking on the ORB.
* It is assumed that acsCorba
is initialized,
* and that the singleton ClientLogManager
has been or will be initialized for remote logging
* outside of this method.
*
* Note on the implementation: the steps involved are grouped as private methods
* that access the instance variables. The intent was to make the sequence clearer.
*
* @param acsCorba the shared instance of AcsCorba
* @param containerName
* @param managerLoc
* @throws AcsJContainerServicesEx at the slightest provocation...
*/
public void run(AcsCorba acsCorba, String containerName, String managerLoc) throws AcsJContainerEx
{
setContainerName(containerName);
setManagerLoc(managerLoc);
run(acsCorba);
}
void run(AcsCorba acsCorba) throws AcsJContainerEx {
getContainerLogger();
if (!acsCorba.isInitialized()) {
AcsJContainerEx ex = new AcsJContainerEx();
ex.setContextInfo("The provided AcsCorba object must be initialized!");
throw ex;
}
m_acsCorba = acsCorba;
checkReadyToRun(null);
// not calling AcsCorba.initCorba here is the main reason we have a separate embedded-container runner
System.out.println(ContainerOperations.ContainerStatusStartupBeginMsg);
initManagerProxy();
createContainer();
m_container.initialize();
System.out.println(ContainerOperations.ContainerStatusStartupEndMsg);
}
/**
* Gets the logger used by the container. If necessary, creates and initializes the logger.
* @return container logger
*/
public AcsLogger getContainerLogger() {
if (m_logger == null) {
m_logger = ClientLogManager.getAcsLogManager().getLoggerForContainer(m_containerName);
}
return m_logger;
}
AcsContainer getContainer() {
if (m_container == null) {
throw new IllegalStateException("Container not yet created.");
}
return m_container;
}
AcsManagerProxy getManagerProxy() {
if (m_managerProxy == null) {
throw new IllegalStateException("Manager proxy not yet created.");
}
return m_managerProxy;
}
void checkReadyToRun(String otherMsg) throws AcsJContainerEx {
String msg = "";
if (m_managerLoc == null || m_managerLoc.trim().length() == 0)
{
msg += "no manager-location specified; ";
}
if (m_containerName == null || m_containerName.trim().length() == 0)
{
msg += "no container name specified; ";
}
if (otherMsg != null) {
msg += otherMsg;
}
if (msg.length() > 0) {
AcsJContainerEx ex = new AcsJContainerEx();
ex.setContextInfo("can't start container because of missing information: " + msg);
throw ex;
}
}
protected void createContainer() throws AcsJContainerEx {
m_logger.fine("creating the AcsContainer " + m_containerName);
m_container = new AcsContainer(m_containerName, m_acsCorba, m_managerProxy, isEmbedded);
if (recoveryModeOverride != null) {
m_container.setRecoveryModeOverride(recoveryModeOverride);
}
m_logger.fine("AcsContainer '" + m_containerName + "' created.");
}
/**
* Creates the instance for m_managerProxy
* and calls getManager
on it so that the connection
* to the manager will be established, without logging in to the manager yet.
*
* @throws AcsJContainerEx
*/
protected void initManagerProxy() throws AcsJContainerEx {
m_managerProxy = new AcsManagerProxy(m_managerLoc, m_acsCorba.getORB(), m_logger);
m_managerProxy.getManager();
}
void setContainerName(String name) {
m_containerName = name;
}
void setManagerLoc(String loc) {
m_managerLoc = loc;
}
}