/*
* Copyright (c) 2010 The Jackson Laboratory
*
* This is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This software 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jax.maanova.configuration;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import org.jax.maanova.jaxbgenerated.JMaanovaApplicationState;
import org.jax.r.configuration.RApplicationConfigurationManager;
import org.jax.r.jaxbgenerated.FileType;
import org.jax.r.jaxbgenerated.RApplicationConfiguration;
import org.jax.r.jaxbgenerated.RApplicationStateType;
import org.jax.util.ConfigurationUtilities;
/**
* The J/maanova configuration manager.
* @author <A HREF="mailto:keith.sheppard@jax.org">Keith Sheppard</A>
*/
public class MaanovaApplicationConfigurationManager extends RApplicationConfigurationManager
{
/**
* the default config file name to use
*/
private static final String DEFAULT_CONFIG_FILE_NAME = "j-maanova-config.xml";
/**
* the default file name to use for application state
*/
private static final String DEFAULT_APPLICATION_STATE_FILE_NAME =
"j-maanova-application-state.xml";
/**
* the default config zip resource location
*/
private static final String DEFAULT_CONFIG_ZIP_RESOURCE = "/j-maanova-configuration.zip";
/**
* the config-path-relative dir name where all of the sample data
* that comes bundled with J/maanova lives
*/
private static final String SAMPLE_DATA_DIR_NAME = "sample-data";
/**
* our logger
*/
private static final Logger LOG = Logger.getLogger(
MaanovaApplicationConfigurationManager.class.getName());
/**
* our singleton instance
*/
private static final MaanovaApplicationConfigurationManager instance;
static
{
MaanovaApplicationConfigurationManager tempInstance = null;
try
{
tempInstance = new MaanovaApplicationConfigurationManager(
JAXBContext.newInstance(
RApplicationConfiguration.class,
JMaanovaApplicationState.class));
}
catch(JAXBException ex)
{
LOG.log(Level.SEVERE,
"Failed to initialize JAXB");
}
finally
{
instance = tempInstance;
}
}
/**
* Getter for the singleton instance of this class
* @return
* the instance
*/
public static MaanovaApplicationConfigurationManager getInstance()
{
return MaanovaApplicationConfigurationManager.instance;
}
/**
* Private constructor (use {@link #getInstance()} to get a handle on
* the singleton instance of this class)
* @param jaxbContext
* the JAXB context to use for creating new objects
*/
private MaanovaApplicationConfigurationManager(JAXBContext jaxbContext)
{
super(jaxbContext);
}
/**
* Set the starting data directory. This will persist in application
* state
* @see MaanovaApplicationConfigurationManager#getApplicationState()
* @param startingDataDirectory
* the starting dir
*/
public void setStartingDataDirectory(File startingDataDirectory)
{
String absolutePath = startingDataDirectory.getAbsolutePath();
if(absolutePath != null)
{
MaanovaApplicationConfigurationManager manager =
MaanovaApplicationConfigurationManager.getInstance();
manager.getJaxbRecentMicroarrayDataDirectory().setFileName(
absolutePath);
}
}
/**
* Get the starting directory for loading data.
* @return
* the starting data
*/
public File getStartingDataDirectory()
{
FileType dataDirs = this.getJaxbRecentMicroarrayDataDirectory();
File startingMicroarrayDataDir = null;
if(dataDirs.getFileName() == null || dataDirs.getFileName().length() == 0)
{
// since it's not set, use the samples dir
ConfigurationUtilities configUtil;
try
{
configUtil = new ConfigurationUtilities();
File baseDir = configUtil.getBaseDirectory();
startingMicroarrayDataDir = new File(baseDir, SAMPLE_DATA_DIR_NAME);
this.setStartingDataDirectory(startingMicroarrayDataDir);
}
catch(Exception ex)
{
LOG.log(Level.SEVERE,
"failed to get default data dir",
ex);
}
}
else
{
startingMicroarrayDataDir = new File(dataDirs.getFileName());
}
return startingMicroarrayDataDir;
}
/**
* Convenience function for getting (and initializing if needed) the
* JAXB data directory.
* @see MaanovaApplicationConfigurationManager#getApplicationState()
* @return
* the data directory
*/
public FileType getJaxbRecentMicroarrayDataDirectory()
{
JMaanovaApplicationState applicationState =
this.getApplicationState();
FileType microarrayDataDir = applicationState.getRecentMicroarrayDataDirectory();
if(microarrayDataDir == null)
{
org.jax.r.jaxbgenerated.ObjectFactory objectFactory =
new org.jax.r.jaxbgenerated.ObjectFactory();
microarrayDataDir = objectFactory.createFileType();
applicationState.setRecentMicroarrayDataDirectory(microarrayDataDir);
}
return microarrayDataDir;
}
/**
* {@inheritDoc}
*/
@Override
public JMaanovaApplicationState getApplicationState()
{
return (JMaanovaApplicationState)super.getApplicationState();
}
/**
* {@inheritDoc}
*/
@Override
protected RApplicationStateType createNewApplicationState()
{
org.jax.maanova.jaxbgenerated.ObjectFactory objectFactory =
new org.jax.maanova.jaxbgenerated.ObjectFactory();
return objectFactory.createJMaanovaApplicationState();
}
/**
* {@inheritDoc}
*/
@Override
protected String getApplicationStateFileName()
{
return DEFAULT_APPLICATION_STATE_FILE_NAME;
}
/**
* {@inheritDoc}
*/
@Override
protected String getConfigurationFileName()
{
return DEFAULT_CONFIG_FILE_NAME;
}
/**
* {@inheritDoc}
*/
@Override
protected String getConfigurationZipResourceName()
{
return DEFAULT_CONFIG_ZIP_RESOURCE;
}
}