/*
* Data Hub Service (DHuS) - For Space data distribution.
* Copyright (C) 2013,2014,2015 GAEL Systems
*
* This file is part of DHuS software sources.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.gael.dhus;
import java.io.IOException;
import java.net.URL;
import java.util.Map;
import java.util.TimeZone;
import org.springframework.context.ApplicationListener;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import fr.gael.dhus.database.DatabasePostInit;
import fr.gael.dhus.datastore.IncomingManager;
import fr.gael.dhus.search.SolrDao;
import fr.gael.dhus.server.http.TomcatException;
import fr.gael.dhus.server.http.TomcatServer;
import fr.gael.dhus.server.http.webapp.WebApplication;
import fr.gael.dhus.service.ISynchronizerService;
import fr.gael.dhus.service.SystemService;
import fr.gael.dhus.spring.context.ApplicationContextProvider;
import fr.gael.drb.impl.DrbFactoryResolver;
import fr.gael.drbx.cortex.DrbCortexMetadataResolver;
import fr.gael.drbx.cortex.DrbCortexModel;
import net.sf.ehcache.CacheManager;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.io.IoBuilder;
/**
* DHuS Main class.
*
* Spanws servers, creates the Spring application context, starts background
* process.
*/
public class DHuS
{
/** Logger. */
private static final Logger LOGGER;
/** {@code true} if the DHuS is started. */
private static boolean started = false;
/** Apache Tomcat: HTTP server, servlet container, JSP processor, ... */
private static TomcatServer server;
//** FTP server. */
//private static FtpServer ftp;
static
{
// Sets up the JUL --> Log4J brigde
System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
LOGGER = LogManager.getLogger(DHuS.class);
// Transfer System.err in logger
IoBuilder iob = IoBuilder.forLogger(LOGGER).setAutoFlush(true).setLevel(Level.ERROR);
System.setErr(iob.buildPrintStream());
}
/** Hide utility class constructor. */
private DHuS () {}
/**
* Returns true if DHuS is already started.
* @return true if DHuS is already started, otherwise false.
*/
public static boolean isStarted ()
{
return started;
}
/** Starts the DHuS (starts Tomcat, creates the Spring application context. */
public static void start ()
{
String version = DHuS.class.getPackage ().getImplementationVersion ();
// Force ehcache not to call home
System.setProperty ("net.sf.ehcache.skipUpdateCheck", "true");
System.setProperty ("org.terracotta.quartz.skipUpdateCheck", "true");
System.setProperty ("user.timezone", "UTC");
TimeZone.setDefault (TimeZone.getTimeZone ("UTC"));
System.setProperty ("fr.gael.dhus.version", version == null? "dev": version);
if (!SystemService.restore ())
{
LOGGER.error ("Cannot run system restoration.");
LOGGER.error ("Check the restoration file \"" +
SystemService.RESTORATION_PROPERTIES +
"\" from the current directory.");
System.exit (1);
}
Runtime.getRuntime ().addShutdownHook (new Thread (new Runnable ()
{
@Override
public void run ()
{
if ((server != null) && server.isRunning ())
{
try
{
server.stop ();
}
catch (TomcatException e)
{
e.printStackTrace ();
}
}
}
}));
LOGGER.info ("Loading DHuS cache configuration");
URL cache_config_url = DHuS.class.getResource ("/dhus_ehcache.xml");
if (cache_config_url == null)
{
throw new IllegalStateException (
"DHuS can not be run without a cache configuration");
}
CacheManager.newInstance (cache_config_url);
// Always add JMSAppender
//Logger rootLogger = LogManager.getRootLogger ();
//org.apache.logging.log4j.core.Logger coreLogger =
//(org.apache.logging.log4j.core.Logger)rootLogger;
//JMSAppender jmsAppender = JMSAppender.createAppender ();
//coreLogger.addAppender (jmsAppender);
try
{
// Activates the resolver for Drb
DrbFactoryResolver.setMetadataResolver (new DrbCortexMetadataResolver (
DrbCortexModel.getDefaultModel ()));
}
catch (IOException e)
{
LOGGER.error ("Resolver cannot be handled.");
//logger.error (new Message(MessageType.SYSTEM,
//"Resolver cannot be handled."));
}
LOGGER.info ("Launching Data Hub Service...");
//logger.info (new Message(MessageType.SYSTEM,
//"Loading Data Hub Service..."));
ClassPathXmlApplicationContext context
= new ClassPathXmlApplicationContext (
"classpath:fr/gael/dhus/spring/dhus-core-context.xml");
context.registerShutdownHook ();
// Registers ContextClosedEvent listeners to properly save states before
// the Spring context is destroyed.
ApplicationListener sync_sv = context.getBean (ISynchronizerService.class);
context.addApplicationListener (sync_sv);
// Initialize Database Incoming folder
IncomingManager incoming_manager =
(IncomingManager) context.getBean ("incomingManager");
incoming_manager.initIncoming ();
// Initialize DHuS loggers
//jmsAppender.cleanWaitingLogs ();
//logger.info (new Message(MessageType.SYSTEM, "DHuS Started"));
try
{
//ftp = xml.getBean (FtpServer.class);
//ftp.start ();
server = ApplicationContextProvider.getBean (TomcatServer.class);
server.init ();
LOGGER.info ("Starting server " + server.getClass () + "...");
//logger.info (new Message(MessageType.SYSTEM, "Starting server..."));
server.start ();
//logger.info (new Message(MessageType.SYSTEM, "Server started."));
LOGGER.info ("Server started.");
// Initialises SolrDAO
SolrDao solr_dao = (SolrDao) context.getBean("solrDao");
solr_dao.initServerStarted();
Map<String, WebApplication> webapps =
context.getBeansOfType (WebApplication.class);
for (String beanName: webapps.keySet ())
{
server.install (webapps.get (beanName));
}
DatabasePostInit dbInit = ApplicationContextProvider.getBean (DatabasePostInit.class);
dbInit.init ();
ISynchronizerService syncService = ApplicationContextProvider.getBean (ISynchronizerService.class);
syncService.init ();
LOGGER.info ("Server is ready...");
started = true;
//InitializableComponent.initializeAll ();
//logger.info (new Message(MessageType.SYSTEM, "Server is ready..."));
server.await ();
context.close ();
}
catch (Exception e)
{
LOGGER.error ("Cannot start system.", e);
//logger.error (new Message(MessageType.SYSTEM, "Cannot start DHuS."), e);
//ftp.stop ();
if (context != null) context.close ();
System.exit (1);
}
}
/**
* Allows to exit program.
* @param exit_code return code value.
*/
public static void stop (int exit_code)
{
//logger.info (new Message(MessageType.SYSTEM, "DHuS Shutdown "));
//ftp.stop ();
System.exit (exit_code);
}
/**
* Main method.
* @param args String table of arguments (command line).
*/
public static void main (String[] args)
{
start ();
}
}