/*
* $Id: IWMainApplication.java,v 1.152 2005/11/16 17:59:10 gimmi Exp $
* Created in 2002 by Tryggvi Larusson
*
* Copyright (C) 2002-2005 Idega software hf. All Rights Reserved.
*
* This software is the proprietary information of Idega hf.
* Use is subject to license terms.
*
*/
package com.idega.idegaweb;
import java.beans.Introspector;
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.idega.core.appserver.AppServer;
import com.idega.core.appserver.AppServerDetector;
import com.idega.core.builder.data.ICDomain;
import com.idega.core.builder.data.ICDomainHome;
import com.idega.core.builder.presentation.ICPropertyHandler;
import com.idega.core.component.business.ComponentRegistry;
import com.idega.core.component.data.ICObject;
import com.idega.core.component.data.ICObjectHome;
import com.idega.core.component.data.ICObjectType;
import com.idega.core.component.data.ICObjectTypeHome;
import com.idega.core.contact.data.EmailType;
import com.idega.core.contact.data.EmailTypeHome;
import com.idega.core.user.data.OldUserBMPBean;
import com.idega.core.user.data.User;
import com.idega.data.DatastoreInterface;
import com.idega.data.EntityControl;
import com.idega.data.IDOContainer;
import com.idega.data.IDOException;
import com.idega.data.IDOLookup;
import com.idega.data.IDOLookupException;
import com.idega.repository.data.RefactorClassRegistry;
import com.idega.repository.data.SingletonRepository;
import com.idega.user.data.GroupRelationBMPBean;
import com.idega.user.data.GroupRelationType;
import com.idega.user.data.GroupRelationTypeHome;
import com.idega.util.database.ConnectionBroker;
import com.idega.util.database.PoolManager;
import com.idega.util.expression.ELUtil;
/**
* <p>
* This class is responsible for starting up the idegaWeb application,
* that is initializing the IWMainApplication instance
* and reading and initializing properties and settings on startup.
* </p>
* Copyright: Copyright (c) 2002-2005 idega software<br/>
* Last modified: $Date: 2005/11/16 17:59:10 $ by $Author: gimmi $
*
* @author <a href="mailto:tryggvil@idega.com">Tryggvi Larusson</a>
* @version $Revision: 1.152 $
*/
public class IWMainApplicationStarter implements ServletContextListener {
IWMainApplication iwma = null;
private ServletContext context;
private final Logger log = Logger.getLogger(IWMainApplicationStarter.class.getName());
public IWMainApplicationStarter(){
// empty
}
public IWMainApplicationStarter(ServletContext context){
initialize(context);
}
/**
* @param context
*/
private void initialize(ServletContext context) {
AppServer appServer = AppServerDetector.setAppServerForApplication(context);
IWMainApplication _iwma = new IWMainApplication(context,appServer);
_iwma.setApplicationServer(appServer);
this.iwma=_iwma;
this.context=context;
this.startLogManager();
//IWMainApplication iwma = IWMainApplication.getIWMainApplication(getServletContext());
//sendStartMessage("Initializing IWMainApplicationStarter");
String serverInfo = context.getServerInfo();
String appServerName = appServer.getName();
String appServerVersion = appServer.getVersion();
if(appServer.isOfficiallySupported()){
if(appServerVersion!=null){
log.fine("Detected supported application server '"+appServerName+"' (version "+appServerVersion+")");
}
else{
log.fine("Detected supported application server '"+appServerName+"' (unknown version)");
}
}
else{
log.warning("This application server ("+serverInfo+") is not officially supported by idegaWeb");
}
startup();
}
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent event) {
initialize(event.getServletContext());
}
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
*/
@Override
public void contextDestroyed(ServletContextEvent event) {
log.fine("Destroying IWMainApplicationStarter");
shutdown();
log.fine("Destroyed IWMainApplicationStarter");
}
public void startup() {
log.info("Initializing IdegaWeb");
try{
startIdegaWebApplication();
fireAppStartedEvent();
}
catch(Exception re){
re.printStackTrace();
}
}
protected void fireAppStartedEvent() {
ELUtil.getInstance().publishEvent(new IWMainApplicationStartedEvent(this));
}
public void shutdown() {
ELUtil.getInstance().publishEvent(new IWMainApplicationShutdownEvent(this));
//poolMgr.release();
log.info("Stopping IdegaWeb");
endIdegaWebApplication();
this.iwma=null;
//super.destroy();
}
protected void startDatabasePool(){
String poolType = this.iwma.getSettings().getPoolManagerType();
if (poolType != null) {
if (poolType.equalsIgnoreCase("POOLMAN")) {
this.startPoolManDatabasePool();
}
else if (poolType.equalsIgnoreCase("IDEGA")) {
startIdegaDatabasePool();
}
else if (poolType.equalsIgnoreCase("JDBC_DATASOURCE")) {
this.startJNDIDatasourcePool();
}
}
else {
if(this.startIdegaDatabasePool()){
//db.properties Successful
}
else if(startJNDIDatasourcePool()){
//JNDI Successful
}
else{
log.warning("No Database found - setting to databaseless mode and setup mode");
this.iwma.setInDatabaseLessMode(true);
this.iwma.setInSetupMode(true);
}
}
Connection conn=null;
try{
conn = ConnectionBroker.getConnection();
DatastoreInterface.getInstance(conn).onApplicationStart(conn);
ConnectionBroker.freeConnection(conn);
}
catch(Exception e){
log.log(Level.WARNING, "Error starting database pool", e);
}
finally{
if(conn!=null){
ConnectionBroker.freeConnection(conn);
}
}
}
protected void startPoolManDatabasePool() {
ConnectionBroker.POOL_MANAGER_TYPE = ConnectionBroker.POOL_MANAGER_TYPE_POOLMAN;
//ServletContext cont = this.getServletContext();
//String file = "poolman.xml";
//String file = IWMainApplication.getIWMainApplication(cont).getPropertiesRealPath()+separator+"poolman.xml";
//sendStartMessage("Reading Databases from file: " + file);
//sendStartMessage("Starting PoolMan Datastore ConnectionPool");
//com.codestudio.util.SQLManager.getInstance(file);
}
/**
* <p>
* Returns true if a db.properties file is found and old style idegaWeb PoolManager is initialized.
* </p>
*/
protected boolean startIdegaDatabasePool() {
String separator = File.separator;
ConnectionBroker.POOL_MANAGER_TYPE=ConnectionBroker.POOL_MANAGER_TYPE_IDEGA;
String fileName=null;
String sfile1 = this.iwma.getApplicationRealPath()+"/WEB-INF/idegaweb/properties/db.properties";
String sfile2= this.iwma.getPropertiesRealPath()+separator+"db.properties";
String dbPropsFromSystemProperty = System.getProperty(ConnectionBroker.SYSTEM_PROPERTY_DB_PROPERTIES_FILE_PATH);
if(dbPropsFromSystemProperty!=null && !"".equals(dbPropsFromSystemProperty)){
sfile1 = dbPropsFromSystemProperty;
log.info("Trying to load db.properties from system property ("+ConnectionBroker.SYSTEM_PROPERTY_DB_PROPERTIES_FILE_PATH+") :"+dbPropsFromSystemProperty);
}
File file1 = new File(sfile1);
File file2 = new File(sfile2);
if(file1.exists()){
fileName=sfile1;
}
else if(file2.exists()){
fileName=sfile2;
}
else{
log.fine("No db.properties found");
return false;
}
log.info("Reading Databases from file: "+fileName);
log.fine("Starting idega Datastore ConnectionPool");
PoolManager.unlock();
PoolManager.getInstance(fileName,this.iwma);
return true;
}
/**
* <p>
* Returns true if a JNDI DataSource is successfully initialized.
* </p>
*/
protected boolean startJNDIDatasourcePool(){
boolean theReturn=false;
String url = this.iwma.getSettings().getJDBCDatasourceDefaultURL();
if(url!=null){
ConnectionBroker.POOL_MANAGER_TYPE=ConnectionBroker.POOL_MANAGER_TYPE_JDBC_DATASOURCE;
ConnectionBroker.setDefaultJDBCDatasourceURL(url);
}
theReturn = ConnectionBroker.tryDefaultJNDIDataSource();
if(theReturn){
log.info("Starting JDBC Datastore ConnectionPool from url: "+ConnectionBroker.getDefaultJNDIUrl());
}
return theReturn;
}
public void endDatabasePool() {
//sendShutdownMessage("Stopping Database Pool");
try {
endIdegaDatabasePool();
}
catch (Exception e) {
// ignore
}
try {
endPoolManDatabasePool();
}
catch (Exception e) {
// ignore
}
}
protected void endPoolManDatabasePool() {
// empty
}
protected void endIdegaDatabasePool() {
PoolManager.getInstance().release();
int count = Thread.activeCount();
Thread[] threads = new Thread[count];
Thread.enumerate(threads);
for (int i = 0; i < threads.length; i++) {
Thread thread = threads[i];
String name = (thread == null) ? null : thread.getName();
//System.out.println(name);
if (name != null && name.startsWith("HSQLDB")) {
thread.interrupt();
}
}
}
/**
* <p>
* This is a method that is called to set database specific properties bafore loading the Jdbc driver and the pool.
* </p>
*/
protected void setDatabaseProperties(){
//Currently this only does initialization for Apache Derby:
Properties p = System.getProperties();
if(p.get("derby.system.home")==null){
String dbHome = this.iwma.getApplicationRealPath()+"WEB-INF/derby/";
p.put("derby.system.home", dbHome);
}
String osName = p.get("os.name").toString().toLowerCase();
if(osName.indexOf("mac os") != -1){
//this is a hack for the MacOS X 1.4.x VM:
p.put("derby.storage.fileSyncTransactionLog","true");
}
}
/**
* Adds the .jar files in /WEB-INF/lib to the ClassPath
*/
protected void addToClassPath() {
String classPathProperty = "java.class.path";
String classPath = System.getProperty(classPathProperty);
log.fine("Classpath before adding WEB-INF/lib:\n" + classPath);
StringBuffer classes = new StringBuffer(classPath);
File webINF = new File(this.iwma.getApplicationRealPath()+"/WEB-INF/lib");
File[] subfiles = webINF.listFiles();
if (subfiles != null) {
for (int i = 0; i < subfiles.length; i++) {
if (subfiles[i].isFile()) {
String fileName = subfiles[i].getAbsolutePath();
if (fileName.endsWith(".jar")) {
classes.append(File.pathSeparator);
classes.append(fileName);
}
}
}
}
classPath = classes.toString();
log.fine("Classpath after adding libs:\n" + classPath);
System.setProperty(classPathProperty, classPath);
}
public void startIdegaWebApplication() {
long start = System.currentTimeMillis();
try {
addToClassPath();
} catch (Exception e) {
log.log(Level.WARNING, "Error adding libs to classpath", e);
}
// reset singletons
IWMainApplication.shutdownApplicationServices();
// enable singletons
SingletonRepository.start();
this.setDatabaseProperties();
registerSystemBeans();
this.startDatabasePool();
// set application variables first before setting any properties (ICApplicationBinding table might be created first)
setApplicationVariables();
if (!this.iwma.getSettings().getBoolean("use_debug_mode", false)) {
this.iwma.regData();
}
// now set some properties
this.iwma.getSettings().setProperty("last_startup", com.idega.util.IWTimestamp.RightNow().toString());
// cleaning, maintaining, updating
if(!this.iwma.isInDatabaseLessMode()){
log.fine("Cleaning and updating database...");
updateStartDataInDatabase();
log.fine("...cleaning and updating database done");
}
startTemporaryBundleStarters();
startComponentRegistry();
boolean fileSystemStarted = false;
if (!this.iwma.isInDatabaseLessMode()) {
this.iwma.startAccessController();
fileSystemStarted = this.iwma.startFileSystem(false);
}
try {
log.fine("Loading the ViewManager...");
this.iwma.loadViewManager();
log.fine("...loading ViewManager done");
} catch(Exception e){
log.log(Level.SEVERE, "Error loading the ViewManager", e);
}
if (!this.iwma.isInDatabaseLessMode()) {
this.iwma.loadBundles();
if (!fileSystemStarted) {
this.iwma.startFileSystem(true); //added by Eiki to ensure that ic_file is created before ib_page
}
}
executeServices(this.iwma);
//create ibdomain
long end = System.currentTimeMillis();
long time = (end - start) / 1000;
// test if all classes are available
testReferencedClasses();
log.info("Completed in " + time + " seconds");
}
/**
* <p>
* TODO tryggvil describe method startComponentRegistry
* </p>
*/
private void startComponentRegistry() {
ComponentRegistry.loadRegistry(this.iwma,this.context);
}
/**
*
*/
private void startLogManager() {
String propertiesRealPath = this.iwma.getPropertiesRealPath();
File propertiesFile = new File(propertiesRealPath,"logging.properties");
boolean propertiesFileExists = propertiesFile.exists();
if(propertiesFileExists){
try {
LogManager.getLogManager().readConfiguration(new FileInputStream(propertiesFile));
}
catch (Exception e) {
log.log(Level.WARNING, "Error reading logging.properties", e);
}
}
}
protected void setApplicationVariables() {
// get the factory settings for auto create entities and set EntityControl.
// In this way ICApplicationBinding table can be created if necessary and if it is allowed by the factory settings
// see call of getIfgetIfEntityAutoCreate() below
if (this.iwma.getSettings().getFactorySettingsForAutoCreateEntities()) {
EntityControl.setAutoCreationOfEntities(true);
log.fine("EntityAutoCreation switched on temporarily (factory settings)");
}
if (this.iwma.getSettings().getIfUsePreparedStatement()) {
this.iwma.getSettings().setUsePreparedStatement(true);
log.fine("Using prepared statements");
}
if (this.iwma.getSettings().getIfDebug()) {
this.iwma.getSettings().setDebug(true);
log.fine("Debug mode is active");
}
if (this.iwma.getSettings().getIfAutoCreateStrings()) {
this.iwma.getSettings().setAutoCreateStrings(true);
log.fine("AutoCreateLocalizedStrings is active");
}
if (this.iwma.getSettings().getIfAutoCreateProperties()) {
this.iwma.getSettings().setAutoCreateProperties(true);
log.fine("AutoCreateProperties is active");
}
if (this.iwma.getSettings().getIfEntityBeanCaching()) {
IDOContainer.getInstance().setBeanCachingActiveByDefault(true);
log.fine("EntityBeanCaching Active");
}
if (this.iwma.getSettings().getIfEntityQueryCaching()) {
IDOContainer.getInstance().setQueryCaching(true);
log.fine("EntityQueryCaching Active");
}
if (this.iwma.getSettings().getIfEntityAutoCreate()) {
// now set what the table ICApplicationBinding says
EntityControl.setAutoCreationOfEntities(true);
log.fine("EntityAutoCreation Active");
}
else {
log.fine("EntityAutoCreation Not Active");
}
String userSystem = this.iwma.getSettings().getProperty("IW_USER_SYSTEM");
if(userSystem!=null){
if(userSystem.equalsIgnoreCase("OLD")){
throw new RuntimeException("Unable to register implemantation of " + User.class.getName() +
" to old user system: " + OldUserBMPBean.class.getName());
}
}
String accControlType = this.iwma.getSettings().getProperty(IWMainApplication.IW_ACCESSCONTROL_TYPE_PROPERTY);
if (accControlType == null) {
com.idega.presentation.Block.usingNewAcessControlSystem = true;
}
else if(!accControlType.equals("iw")){
com.idega.presentation.Block.usingNewAcessControlSystem = false;
}
String usingEvent = this.iwma.getSettings().getProperty(IWMainApplication._PROPERTY_USING_EVENTSYSTEM);
if (usingEvent != null && !"false".equalsIgnoreCase(usingEvent)) {
com.idega.presentation.text.Link.usingEventSystem = true;
}
String usingNewURLStructure = this.iwma.getSettings().getProperty(IWMainApplication.PROPERTY_NEW_URL_STRUCTURE);
if (usingNewURLStructure != null && "false".equalsIgnoreCase(usingNewURLStructure)) {
log.fine("NOT Using new URL Scheme");
IWMainApplication.useNewURLScheme=false;
}
else{
log.fine("Using new URL Scheme");
}
String usingJSFRendering = this.iwma.getSettings().getProperty(IWMainApplication.PROPERTY_JSF_RENDERING);
if (usingJSFRendering != null && "false".equalsIgnoreCase(usingJSFRendering)) {
log.fine("NOT Using JavaServer Faces Runtime");
IWMainApplication.useJSF=false;
}
else{
log.fine("Using JavaServer Faces Runtime");
}
}
private void startTemporaryBundleStarters() {
// start these bundle starters explicitly because some old applications have not registered these bundles and
// therefore these bundle starters will not start automatically
//startTemporaryBundleStarter("com.idega.block.category.IWBundleStarter");
//startTemporaryBundleStarter("com.idega.block.media.IWBundleStarter");
//startTemporaryBundleStarter("com.idega.builder.IWBundleStarter");
//Temporary, should be removed:
/*try {
Class.forName("com.idega.hibernate.demo.Test").newInstance();
}
catch (Exception e) {
e.printStackTrace();
}*/
//startTemporaryBundleStarter("is.idega.idegaweb.member.IWBundleStarter");
//startTemporaryBundleStarter("se.idega.idegaweb.commune.childcare.IWBundleStarter");
//startTemporaryBundleStarter("se.idega.idegaweb.commune.school.IWBundleStarter");
//startTemporaryBundleStarter("se.idega.idegaweb.commune.accounting.IWBundleStarter");
//startTemporaryBundleStarter("is.idega.idegaweb.egov.musicschool.IWBundleStarter");
//startTemporaryBundleStarter("se.idega.idegaweb.commune.adulteducation.IWBundleStarter");
}
/**
* Category bundle is not registered in many web applications (but used) because category wasn't a bundle in the past
* Call BundleStarter directly because the bundle is not loaded by old web applications!
*/
/*private void startTemporaryBundleStarter(String starterName) {
IWBundleStartable starter;
try {
starter = (IWBundleStartable) RefactorClassRegistry.forName(starterName).newInstance();
starter.start(null);
}
catch (InstantiationException e) {
log.info(starterName + " could not be instanciated (probably corresponding bundle is not loaded)");
}
catch (IllegalAccessException e) {
log.info(" Constructor of " + starterName + " could not be accessed (probably corresponding bundle is not loaded)");
}
catch (ClassNotFoundException e) {
log.info(starterName + " could not be found (probably corresponding bundle is not loaded)");
}
catch (Exception e) {
log.log(Level.WARNING, "Error starting " + starterName, e);
}
}*/
/**
* This is a fix so that these bundle starters are always started
*/
private void registerSystemBeans()
{
//TODO: TL: Move this to be registered in a property file.
RefactorClassRegistry rfregistry = RefactorClassRegistry.getInstance();
rfregistry.registerRefactoredClass("com.idega.builder.data.IBDomain","com.idega.core.builder.data.ICDomain");
rfregistry.registerRefactoredClass("com.idega.builder.data.IBPage","com.idega.core.builder.data.ICPage");
rfregistry.registerRefactoredClass("com.idega.core.data.ICFile","com.idega.core.file.data.ICFile");
rfregistry.registerRefactoredClass("com.idega.core.data.ICFileType","com.idega.core.file.data.ICFileType");
rfregistry.registerRefactoredClass("com.idega.core.data.ICFileTypeHandler","com.idega.core.file.data.ICFileTypeHandler");
rfregistry.registerRefactoredClass("com.idega.core.data.ICFileCategory","com.idega.core.file.data.ICFileCategory");
rfregistry.registerRefactoredClass("com.idega.core.data.ICMimeType","com.idega.core.file.data.ICMimeType");
rfregistry.registerRefactoredClass("com.idega.core.data.ICCategory","com.idega.core.category.data.ICCategory");
rfregistry.registerRefactoredClass("com.idega.core.data.ICCategoryBMPBean","com.idega.block.category.data.ICCategoryBMPBean");
rfregistry.registerRefactoredClass("com.idega.core.category.data.ICCategoryBMPBean","com.idega.block.category.data.ICCategoryBMPBean");
rfregistry.registerRefactoredClass("com.idega.core.data.ICCategoryICObjectInstance","com.idega.core.category.data.ICCategoryICObjectInstance");
rfregistry.registerRefactoredClass("com.idega.core.data.ICCategoryTranslation","com.idega.core.category.data.ICCategoryTranslation");
rfregistry.registerRefactoredClass("com.idega.core.data.ICInformationCategory","com.idega.core.category.data.ICInformationCategory");
rfregistry.registerRefactoredClass("com.idega.core.data.ICInformationCategoryBMPBean","com.idega.core.category.data.ICInformationCategoryBMPBean");
rfregistry.registerRefactoredClass("com.idega.core.data.ICInformationCategoryTranslation","com.idega.core.category.data.ICInformationCategoryTranslation");
rfregistry.registerRefactoredClass("com.idega.core.data.ICInformationFolder","com.idega.core.category.data.ICInformationFolder");
rfregistry.registerRefactoredClass("com.idega.core.data.ICInformationFolderBMPBean","com.idega.core.category.data.ICInformationFolderBMPBean");
rfregistry.registerRefactoredClass("com.idega.core.data.ICObject","com.idega.core.component.data.ICObject");
rfregistry.registerRefactoredClass("com.idega.core.data.ICObjectField","com.idega.core.component.data.ICObjectField");
rfregistry.registerRefactoredClass("com.idega.core.data.ICObjectInstance","com.idega.core.component.data.ICObjectInstance");
rfregistry.registerRefactoredClass("com.idega.core.data.ICObjectType","com.idega.core.component.data.ICObjectType");
rfregistry.registerRefactoredClass("com.idega.core.data.AreaCode","com.idega.core.contact.data.AreaCode");
rfregistry.registerRefactoredClass("com.idega.core.data.Email","com.idega.core.contact.data.Email");
rfregistry.registerRefactoredClass("com.idega.core.data.EmailType","com.idega.core.contact.data.EmailType");
rfregistry.registerRefactoredClass("com.idega.core.data.Phone","com.idega.core.contact.data.Phone");
rfregistry.registerRefactoredClass("com.idega.core.data.PhoneType","com.idega.core.contact.data.PhoneType");
rfregistry.registerRefactoredClass("com.idega.core.data.CountryCode","com.idega.core.contact.data.CountryCode");
rfregistry.registerRefactoredClass("com.idega.core.data.ICLanguage","com.idega.core.localisation.data.ICLanguage");
rfregistry.registerRefactoredClass("com.idega.core.data.ICLocale","com.idega.core.localisation.data.ICLocale");
rfregistry.registerRefactoredClass("com.idega.core.data.Address","com.idega.core.location.data.Address");
rfregistry.registerRefactoredClass("com.idega.core.data.AddressType","com.idega.core.location.data.AddressType");
rfregistry.registerRefactoredClass("com.idega.core.data.Commune","com.idega.core.location.data.Commune");
rfregistry.registerRefactoredClass("com.idega.core.data.Country","com.idega.core.location.data.Country");
rfregistry.registerRefactoredClass("com.idega.core.data.PostalCode","com.idega.core.location.data.PostalCode");
rfregistry.registerRefactoredClass("com.idega.core.data.Province","com.idega.core.location.data.Province");
rfregistry.registerRefactoredClass("com.idega.core.data.ICNetwork","com.idega.core.net.data.ICNetwork");
rfregistry.registerRefactoredClass("com.idega.core.data.ICProtocol","com.idega.core.net.data.ICProtocol");
// perhaps these entries are not necessary (by thomas)
rfregistry.registerRefactoredClass("com.idega.builder.handler.PropertyHandler", ICPropertyHandler.class.getName());
rfregistry.registerRefactoredClass("com.idega.core.builder.data.ICPropertyHandler", ICPropertyHandler.class.getName());
}
/*private void updateClassReferencesInDatabase() {
try {
ICObjectTypeHome home = (ICObjectTypeHome) IDOLookup.getHome(ICObjectType.class);
home.updateClassReferences("com.idega.builder.handler.PropertyHandler", ICPropertyHandler.class);
home.updateClassReferences("com.idega.core.builder.data.ICPropertyHandler", ICPropertyHandler.class);
}
catch (IDOLookupException e) {
log.throwing(this.getClass().getName(), "updateClassReferencesInDatabase", e);
}
catch (IDOException e) {
log.throwing(this.getClass().getName(), "updateClassReferencesInDatabase", e);
}
}*/
protected void updateStartDataInDatabase() {
updateStartDataGroupRelationType();
updateStartTypeEmailType();
updateDomainData();
}
private void updateDomainData() {
String propertyKey = "dataupdate_domain_done";
String done = iwma.getSettings().getProperty(propertyKey);
if(done==null){
ICDomainHome domainHome = null;
ICDomain defaultDomain = null;
try {
domainHome = (ICDomainHome) IDOLookup.getHome(ICDomain.class);
defaultDomain = domainHome.findDefaultDomain();
} catch (FinderException e) {
if(defaultDomain==null){
try {
defaultDomain = domainHome.findFirstDomain();
defaultDomain.setType(ICDomain.TYPE_DEFAULT);
defaultDomain.store();
iwma.getSettings().setProperty(propertyKey, "true");
} catch (FinderException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
} catch (IDOLookupException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void updateStartDataGroupRelationType() {
/*
* @todo Move to user plugin system
**/
//Temporary Fix to make sure GroupRelation table exists:
new GroupRelationBMPBean();
try {
ICObjectTypeHome home = (ICObjectTypeHome) IDOLookup.getHome(ICObjectType.class);
home.updateStartData();
}
catch (IDOLookupException e) {
log.throwing(this.getClass().getName(), "updateStartDataGroupRelationType", e);
}
catch (IDOException e) {
log.throwing(this.getClass().getName(), "updateStartDataGroupRelationType", e);
}
insertGroupRelationType("GROUP_PARENT");
insertGroupRelationType("FAM_CHILD");
insertGroupRelationType("FAM_PARENT");
insertGroupRelationType("FAM_SPOUSE");
insertGroupRelationType("FAM_CUSTODIAN");
insertGroupRelationType("FAM_SIBLING");
}
private void updateStartTypeEmailType() {
EmailTypeHome home;
try {
home = (EmailTypeHome) IDOLookup.getHome(EmailType.class);
home.updateStartData();
}
catch (IDOLookupException e) {
log.throwing(this.getClass().getName(), "updateStartTypeEmailType", e);
}
catch (IDOException e) {
log.throwing(this.getClass().getName(), "updateStartTypeEmailType", e);
}
catch (CreateException e) {
log.throwing(this.getClass().getName(), "updateStartTypeEmailType", e);
}
}
/*private void cleanEmailData() {
try {
IWApplicationContext iwac = this.iwma.getIWApplicationContext();
UserBusiness userBusiness = (UserBusiness) IBOLookup.getServiceInstance(iwac, UserBusiness.class);
userBusiness.cleanUserEmails();
}
catch (IBOLookupException e) {
log.throwing(this.getClass().getName(), "cleanEmailData", e);
}
}*/
private void insertGroupRelationType(String groupRelationType) {
/**
* @todo Move this to a more appropriate place
**/
try {
GroupRelationTypeHome grtHome = (GroupRelationTypeHome) com.idega.data.IDOLookup.getHome(GroupRelationType.class);
GroupRelationType grType;
try {
grType = grtHome.findByPrimaryKey(groupRelationType);
}
catch (FinderException fe) {
try {
grType = grtHome.create();
grType.setType(groupRelationType);
grType.store();
log.fine("Registered Group relation type: '" + groupRelationType + "'");
}
catch (CreateException e) {
log.throwing(this.getClass().getName(), "insertGroupRelationType", e);
}
}
}
catch (IDOLookupException e) {
log.throwing(this.getClass().getName(), "insertGroupRelationType", e);
}
}
/**
* Not Implemented fully
*/
public void executeServices(IWMainApplication application) {
List list = application.getSettings().getServiceClasses();
if (list != null) {
Iterator iter = list.iterator();
while (iter.hasNext()) {
Class theClass = (Class) iter.next();
try {
IWService theService = (IWService) theClass.newInstance();
theService.startService(application);
}
catch (Exception ex) {
log.log(Level.WARNING, "Error starting service " + theClass.getName(), ex);
}
}
}
}
public void endIdegaWebApplication() {
//IWMainApplication application = IWMainApplication.getIWMainApplication(getServletContext());
//IWMainApplication application = iwma;
this.iwma.getSettings().setProperty("last_shutdown", com.idega.util.IWTimestamp.RightNow().toString());
IWStyleManager iwStyleManager = IWStyleManager.getInstance();
log.fine("Saving style sheet");
iwStyleManager.writeStyleSheet();
this.iwma.unloadInstanceAndClass();
// some bundle starters have initialized threads that are using the database
// therefore stop first and then end database pool
endDatabasePool();
log.fine("Completed");
Introspector.flushCaches();
}
private void testReferencedClasses() {
ICObjectHome home = null;
try {
home =(ICObjectHome) IDOLookup.getHome(ICObject.class);
}
catch (IDOLookupException ex) {
log.severe("Could not find home of ICObject");
return;
}
// get the current classloader (it is the same that is used for "Class.forName()" )
ClassLoader currentClassLoader = getClass().getClassLoader();
try {
SortedSet classNames = new TreeSet();
Collection allICObjects = home.findAll();
Iterator iterator = allICObjects.iterator();
while (iterator.hasNext()) {
ICObject object = (ICObject) iterator.next();
String className = object.getClassName();
try {
// delay initialization, we are not using the class here
RefactorClassRegistry.forName(className, false, currentClassLoader);
}
catch (ClassNotFoundException ex) {
// bad luck
classNames.add(className);
// go ahead
}
}
Iterator classNameIterator = classNames.iterator();
while (classNameIterator.hasNext()) {
String className = (String) classNameIterator.next();
log.warning("Class " + className + " could not be found but is referenced as ICObject");
}
}
catch (FinderException ex) {
log.fine("Could not find any ICObjects");
}
}
public IWMainApplication getIWMainApplication() {
return iwma;
}
}