/*
* Copyright 1999-2008 University of Chicago
*
* Licensed 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.nimbustools.messaging.gt4_0.common;
import org.globus.wsrf.jndi.Initializable;
import org.globus.wsrf.config.ContainerConfig;
import org.globus.wsrf.container.ServiceHost;
import org.globus.wsrf.Constants;
import org.nimbustools.api.brain.BreathOfLife;
import org.nimbustools.api.brain.ModuleLocator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.net.URL;
import java.io.IOException;
import java.io.File;
import commonj.timers.TimerManager;
import javax.naming.InitialContext;
public abstract class NimbusMasterContext implements Initializable {
// -------------------------------------------------------------------------
// STATIC VARIABLES
// -------------------------------------------------------------------------
private static final Log logger =
LogFactory.getLog(NimbusMasterContext.class.getName());
// -------------------------------------------------------------------------
// INSTANCE VARIABLES
// -------------------------------------------------------------------------
protected final String jndiAdvice;
protected final String confadvice;
protected ModuleLocator moduleLocator;
protected String baseLocation;
protected String masterConf;
// -------------------------------------------------------------------------
// CONSTRUCTOR
// -------------------------------------------------------------------------
public NimbusMasterContext(String jndiAdvice, String confadvice) {
if (jndiAdvice == null) {
throw new IllegalArgumentException("jndiAdvice may not be null");
}
if (confadvice == null) {
throw new IllegalArgumentException("confadvice may not be null");
}
this.jndiAdvice = jndiAdvice;
this.confadvice = confadvice;
}
// -------------------------------------------------------------------------
// SET (via jndi)
// -------------------------------------------------------------------------
public synchronized void setMasterConf(String path) {
this.masterConf = path;
}
// -------------------------------------------------------------------------
// implements Initializable
// -------------------------------------------------------------------------
public synchronized void initialize() throws Exception {
if (this.moduleLocator != null) {
logger.warn("MasterContext.initialize() should not have been " +
"invoked more than once");
return;
}
this.checkConf(this.masterConf);
// spring interprets "/" as a relative path unless it is "//"
final String appCtxPath = this.fixAbsolute(this.masterConf);
this.moduleLocator = new BreathOfLife().breathe(appCtxPath);
}
// -------------------------------------------------------------------------
// GET
// -------------------------------------------------------------------------
public ModuleLocator getModuleLocator() {
if (this.moduleLocator == null) {
throw new IllegalStateException("The application was not " +
"initialized correctly.");
}
return this.moduleLocator;
}
/**
* In Globus environment, GL is present.
*
* @return baseLocation never null
* @throws Exception problem
*/
public String getBaseLocation()
throws Exception {
if (this.baseLocation != null) {
return this.baseLocation;
}
this.baseLocation = ContainerConfig.getBaseDirectory();
if (this.baseLocation == null) {
throw new Exception("cannot find base system " +
"location (GLOBUS_LOCATION)");
}
return this.baseLocation;
}
/**
* @return base URL, never null
* @throws java.io.IOException problem getting URL from GT container
*/
public URL getBaseURL() throws IOException {
return ServiceHost.getBaseURL();
}
/**
* @return TimerManager, never null
* @throws Exception could not locate
*/
public TimerManager discoverTimerManager() throws Exception {
InitialContext ctx = null;
try {
ctx = new InitialContext();
final TimerManager timerManager =
(TimerManager) ctx.lookup(Constants.DEFAULT_TIMER);
if (timerManager == null) {
// should be NameNotFoundException if missing
throw new Exception("null from JNDI for TimerManager (?)");
}
return timerManager;
} finally {
if (ctx != null) {
ctx.close();
}
}
}
// -------------------------------------------------------------------------
// CONF FILE
// -------------------------------------------------------------------------
protected String fixAbsolute(String path) throws Exception {
final File conf = new File(path);
if (conf.isAbsolute()) {
// spring interprets "/" as a relative path unless it is "//"
return "/" + path;
} else {
return path;
}
}
protected void checkConf(String path) throws Exception {
if (path == null) {
throw new Exception("No masterConf setting.\n" + jndiAdvice);
}
String confInvalidError = null;
final File conf = new File(path);
String debugHelp = "[[ setting was '" + path + "' ]]";
if (conf.isAbsolute()) {
debugHelp += " [[ that is an absolute path ]]";
} else {
debugHelp += " [[ that is a relative path which resolves to " +
"absolute path '" + conf.getAbsolutePath() + "' ]]";
}
if (!conf.exists()) {
confInvalidError = "File does not exist. " + debugHelp;
} else if (!conf.canRead()) {
confInvalidError = "File can not be read. " + debugHelp;
}
if (confInvalidError != null) {
throw new Exception(
"Unusable masterConf setting.\n" + jndiAdvice +
"\n" + confadvice +
"\n** Problem: " + confInvalidError);
}
}
}