package org.yamcs.xtce.service;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yamcs.xtce.SpaceSystem;
import org.yamcs.xtce.XtceDb;
import org.yamcs.xtce.xml.XtceStaxReader;
/**
*
* @author Martin Ursik
*
*/
public class MissionDatabaseService {
/** Logger */
private static final Logger logger = LoggerFactory.getLogger(MissionDatabaseService.class);
/** File name of the properties file */
private static final String XTCE_PROPERTIES_FILENAME = "xtce.properties";
/** Reference to singleton instance */
private static MissionDatabaseService instance = null;
/**
* Mission database map: key is the name string (SpaceSystem name attribute
* content)
*/
private Map<String, XtceDb> xtceDbMap;
/**
* Mission database descriptor map: key is the name string (SpaceSystem name
* attribute content)
*/
private Map<String, MissionDatabaseDescriptor> xtceDescMap;
public static synchronized MissionDatabaseService getInstance()
throws IOException {
if (instance == null) {
instance = new MissionDatabaseService();
}
return instance;
}
private MissionDatabaseService() throws IOException {
initialize();
}
/**
* Load all available databases.
*
* @throws IOException
*/
private void initialize() throws IOException {
logger.info("Initializing instance");
xtceDbMap = new HashMap<String, XtceDb>();
xtceDescMap = new HashMap<String, MissionDatabaseDescriptor>();
Properties properties = new Properties();
properties.load(ClassLoader.getSystemClassLoader().getResourceAsStream(
XTCE_PROPERTIES_FILENAME));
String databases = properties.getProperty("mdb.databases");
String[] dbs = null;
if (databases != null) {
dbs = databases.split(" ");
}
MissionDatabaseDescriptor mdbDescriptor = null;
for (String database : dbs) {
mdbDescriptor = new MissionDatabaseDescriptor(
properties.getProperty("mdb." + database + ".name"),
properties.getProperty("mdb." + database
+ ".validity.start"), properties.getProperty("mdb."
+ database + ".validity.end"),
properties.getProperty("mdb." + database + ".path"));
// load the xtce file
try {
XtceStaxReader reader = new XtceStaxReader();
SpaceSystem ss = reader.readXmlDocument(mdbDescriptor
.getFilename());
XtceDb xtceDb = new XtceDb(ss);
xtceDbMap.put(mdbDescriptor.getName(), xtceDb);
xtceDescMap.put(mdbDescriptor.getName(), mdbDescriptor);
logger.info("Mdb loaded: " + mdbDescriptor.getFilename());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
public XtceDb getXtceDb(String mdbName) {
return xtceDbMap.get(mdbName);
}
public MissionDatabaseDescriptor getXtceDescriptor(String mdbName) {
return xtceDescMap.get(mdbName);
}
/**
* Set of available mission databases.
*
* @return Unmodifiable set of mission databases.
*/
public Set<String> getAvailableDatabases() {
return Collections.unmodifiableSet(xtceDbMap.keySet());
}
}