/**
* Mad-Advertisement
* Copyright (C) 2011 Thorsten Marx <thmarx@gmx.net>
*
* This program 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 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 General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.mad.ads.manager.utils.listener;
import java.io.File;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.sql.DataSource;
import net.mad.ads.base.api.BaseContext;
import net.mad.ads.base.api.EmbeddedBaseContext;
import net.mad.ads.base.api.exception.ServiceException;
import net.mad.ads.base.api.model.user.User;
import net.mad.ads.base.api.model.user.impl.AdminUser;
import net.mad.ads.base.api.service.HibernateService;
import net.mad.ads.base.api.service.banner.CampaignService;
import net.mad.ads.base.api.service.banner.HibernateCampaignService;
import net.mad.ads.base.api.service.site.HibernatePlaceService;
import net.mad.ads.base.api.service.site.HibernateSiteService;
import net.mad.ads.base.api.service.site.PlaceService;
import net.mad.ads.base.api.service.site.SiteService;
import net.mad.ads.base.api.service.user.HibernateUserService;
import net.mad.ads.base.api.service.user.UserService;
import net.mad.ads.base.api.track.TrackingService;
import net.mad.ads.base.api.track.impl.local.h2.H2TrackingService;
import net.mad.ads.common.util.Properties2;
import net.mad.ads.manager.RuntimeContext;
import net.mad.ads.manager.utils.Constants;
import org.apache.log4j.PropertyConfigurator;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author thorsten
*/
public class StartupPlugIn implements ServletContextListener {
private static Logger logger = LoggerFactory.getLogger(StartupPlugIn.class);
public void contextDestroyed(ServletContextEvent event) {
logger.debug("stop application");
RuntimeContext.getSessionFactory().close();
try {
RuntimeContext.getTrackingService().close();
} catch (ServiceException e) {
logger.error("", e);
}
}
public void contextInitialized(ServletContextEvent event) {
logger.info("Init Application");
try {
String enviroment = event.getServletContext().getInitParameter(
"enviroment");
String configDirectory = new File(".").getAbsolutePath(); // event.getServletContext().getInitParameter("configDirectory");
if (System.getProperties().containsKey("mad.home")) {
configDirectory = System.getProperty("mad.home");
}
if (configDirectory.endsWith(".")) {
configDirectory = configDirectory.substring(0, configDirectory.length() - 1);
}
if (!configDirectory.endsWith("/")) {
configDirectory += "/";
}
System.setProperty("mad.home", configDirectory);
configDirectory += "config/manager/";
PropertyConfigurator.configure(Properties2.loadProperties(configDirectory + "log4j.properties"));
RuntimeContext.setProperties(Properties2.loadProperties(configDirectory + "config.properties"));
// hier können allgemeine Konfigurationen vorgenommen werden, die
// erst
// gemacht werden können, wenn die Anwendung läuft
String path = event.getServletContext().getRealPath("/");
File hibernateConfig = new File(configDirectory + "hibernate.cfg.xml");
SessionFactory sessionFactory = new Configuration().configure(hibernateConfig).buildSessionFactory();
RuntimeContext.setSessionFactory(sessionFactory);
BaseContext context = new BaseContext();
context.put(HibernateService.SESSION_FACTORY, sessionFactory);
UserService users = new HibernateUserService();
users.open(context);
RuntimeContext.setUserService(users);
SiteService sites = new HibernateSiteService();
sites.open(context);
RuntimeContext.setSiteService(sites);
PlaceService places = new HibernatePlaceService();
places.open(context);
RuntimeContext.setPlaceService(places);
CampaignService campaigns = new HibernateCampaignService();
campaigns.open(context);
RuntimeContext.setCampaignService(campaigns);
User admin = users.get(1L);
if (admin == null) {
admin = new AdminUser();
admin.setActive(true);
admin.setCreated(new Date());
admin.setUsername("admin");
admin.setPassword("admin");
users.create(admin);
}
initTracking(context);
} catch (Exception ex) {
logger.error("error init application", ex);
}
}
public void initTracking (BaseContext context) {
try {
String classname = RuntimeContext.getProperties().getProperty(
Constants.CONFIG.PROPERTIES.TRACKINGSERVICE_CLASS,
"");
TrackingService trackService = (TrackingService) Class.forName(
classname).newInstance();
if (trackService instanceof H2TrackingService) {
Context ctx = new InitialContext();
ctx = (Context) ctx.lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup("jdbc/trackingds");
context.put(EmbeddedBaseContext.EMBEDDED_TRACKING_DATASOURCE, ds);
}
trackService.open(context);
RuntimeContext.setTrackingService(trackService);
} catch (NamingException se) {
logger.error("", se);
} catch (ClassCastException cce) {
logger.error("", cce);
} catch (ServiceException e) {
logger.error("", e);
} catch (InstantiationException e) {
logger.error("", e);
} catch (IllegalAccessException e) {
logger.error("", e);
} catch (ClassNotFoundException e) {
logger.error("", e);
}
}
}