All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ow2.bonita.util.DbTool Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2007  Bull S. A. S.
 * Bull, Rue Jean Jaures, B.P.68, 78340, Les Clayes-sous-Bois
 * This library is free software; you can redistribute it and/or modify it under the terms
 * of the GNU Lesser General Public License as published by the Free Software Foundation
 * version 2.1 of the License.
 * This library 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 Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA  02110-1301, USA.
 * 
 * Modified by Matthieu Chaffotte - BonitaSoft S.A.
 **/
package org.ow2.bonita.util;

import java.io.File;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.hibernate.Cache;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.ow2.bonita.env.EnvConstants;
import org.ow2.bonita.env.EnvironmentFactory;
import org.ow2.bonita.env.GlobalEnvironmentFactory;
import org.ow2.bonita.facade.IdentityAPI;
import org.ow2.bonita.facade.def.element.impl.MetaDataImpl;
import org.ow2.bonita.facade.identity.Group;
import org.ow2.bonita.facade.identity.Membership;
import org.ow2.bonita.facade.identity.impl.GroupImpl;
import org.ow2.bonita.facade.identity.impl.MembershipImpl;
import org.ow2.bonita.facade.identity.impl.RoleImpl;
import org.ow2.bonita.facade.identity.impl.UserImpl;
import org.ow2.bonita.runtime.event.EventExecutor;
import org.ow2.bonita.runtime.event.Master;
import org.ow2.bonita.search.SearchUtil;

/**
 * @author Guillaume Porcher Helper class to initialize DB tables from the environment.
 */
public final class DbTool {

  static final Logger LOG = Logger.getLogger(DbTool.class.getName());

  private DbTool() {
  }

  protected static Configuration getConfiguration(final String domain, final String configurationName) throws Exception {
    final EnvironmentFactory envFactory = GlobalEnvironmentFactory.getEnvironmentFactory(domain);
    if (envFactory == null) {
      final String message = ExceptionManager.getInstance().getFullMessage("bh_DBT_1");
      throw new BonitaRuntimeException(message);
    }
    final Configuration config = (Configuration) envFactory.get(configurationName);
    if (config == null) {
      final String message = ExceptionManager.getInstance().getFullMessage("bh_DBT_2", configurationName);
      throw new BonitaRuntimeException(message);
    }
    return config;
  }

  protected static SchemaExport getSchemaExport(final Configuration config) {
    return new SchemaExport(config, config.buildSettings());
  }

  /**
   * Export DB schema to the database defined in the environment.
   */
  public static void recreateDb(final String domain, final String configurationName) throws Exception {
    BonitaConstants.getBonitaHomeFolder();
    final Configuration config = getConfiguration(domain, configurationName);

    if (LOG.isLoggable(Level.FINE)) {
      final SessionFactoryImplementor sessionFactory = getSessionFactory(domain,
          configurationName.replaceAll("-configuration", "-session-factory"));
      if (sessionFactory != null) {
        final Dialect dialect = sessionFactory.getDialect();
        final String[] script = config.generateSchemaCreationScript(dialect);
        for (final String s : script) {
          LOG.fine(s);
        }
      }
    }

    final SchemaExport schemaExport = getSchemaExport(config);
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Creating schema...");
    }

    final String dbVendor = getDatabaseVendor(config);
    final StringBuilder fileNamebuilder = new StringBuilder("/script/post-initdb-").append(dbVendor).append(".sql");
    schemaExport.setImportFile(fileNamebuilder.toString());
    schemaExport.create(true, true);
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Schema created.");
    }
    
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Initializing master...");
    }
    if (EnvConstants.HB_CONFIG_CORE.equals(configurationName)) {
      initializeMaster(domain, configurationName);
      if (LOG.isLoggable(Level.FINE)) {
        LOG.fine("Master initialized.");
      }
    }
      
    if (LOG.isLoggable(Level.FINE)) {
      LOG.fine("Adding default users...");
    }
    if (EnvConstants.HB_CONFIG_CORE.equals(configurationName)) {
      addDefaultUsers(domain, configurationName);
      if (LOG.isLoggable(Level.FINE)) {
        LOG.fine("Default users added.");
      }
    }
  }

  protected static SessionFactoryImplementor getSessionFactory(final String domain, final String sessionFactoryName)
      throws Exception {
    final SessionFactory sessionFactory = (SessionFactory) GlobalEnvironmentFactory.getEnvironmentFactory(domain).get(
        sessionFactoryName);
    if (sessionFactory instanceof SessionFactoryImplementor) {
      return (SessionFactoryImplementor) sessionFactory;
    }
    return null;
  }

  public static void addDefaultUsers(final String domain, final String configurationName) throws Exception {
    final SessionFactoryImplementor sessionFactory = getSessionFactory(domain,
        configurationName.replaceAll("-configuration", "-session-factory"));
    if (sessionFactory != null) {
      Session session = null;
      try {
        session = sessionFactory.openSession();
        final Transaction tx = session.beginTransaction();
        final RoleImpl memberRole = createDefaultRole(session, IdentityAPI.USER_ROLE_NAME, IdentityAPI.USER_ROLE_LABEL,
            IdentityAPI.USER_ROLE_DESCRIPTION);
        final RoleImpl adminRole = createDefaultRole(session, IdentityAPI.ADMIN_ROLE_NAME,
            IdentityAPI.ADMIN_ROLE_LABEL, IdentityAPI.ADMIN_ROLE_DESCRIPTION);

        final GroupImpl defaultGroup = createDefaultGroup(session, IdentityAPI.DEFAULT_GROUP_NAME,
            IdentityAPI.DEFAULT_GROUP_LABEL, IdentityAPI.DEFAULT_GROUP_DESCRIPTION, null);

        final MembershipImpl memberMembership = createDefaultMembership(session, defaultGroup, memberRole);
        final Set memberMemberships = new HashSet();
        memberMemberships.add(memberMembership);
        final MembershipImpl adminMembership = createDefaultMembership(session, defaultGroup, adminRole);
        final Set adminMemberships = new HashSet();
        adminMemberships.add(adminMembership);

        addDefaultUser(session, "admin", null, null, "bpm", null, null, adminMemberships);
        final UserImpl user1 = addDefaultUser(session, "john", "John", "Doe", "bpm", null, null, memberMemberships);
        final UserImpl user2 = addDefaultUser(session, "jack", "Jack", "Doe", "bpm", user1.getUUID(), user1.getUUID(),
            memberMemberships);
        addDefaultUser(session, "james", "James", "Doe", "bpm", user1.getUUID(), user2.getUUID(), memberMemberships);

        final MetaDataImpl defaultUsersAddedMetadata = new MetaDataImpl("DEFAULT_USERS_CREATED", "true");

        session.save(defaultUsersAddedMetadata);
        tx.commit();
      } catch (final HibernateException e) {
        LOG.log(Level.WARNING, "Unable to add the default users in the DB", e);
      } finally {
        if (session != null) {
          session.close();
        }
      }
    }
  }
  
  public static void initializeMaster(final String domain, final String configurationName) throws Exception {
	  final SessionFactoryImplementor sessionFactory = getSessionFactory(domain,
	      configurationName.replaceAll("-configuration", "-session-factory"));
	  if (sessionFactory != null) {
	    Session session = null;
	      try {
	        session = sessionFactory.openSession();
	        final Transaction tx = session.beginTransaction();
	        final Master master = new Master(0L, "unknown");
	        session.save(master);
	        tx.commit();
	      } catch (final HibernateException e) {
	        LOG.log(Level.WARNING, "Unable to add the default users in the DB", e);
	      } finally {
	        if (session != null) {
	          session.close();
	        }
	      }
	    }
	  }

  public static MembershipImpl createDefaultMembership(final Session session, final GroupImpl group, final RoleImpl role)
      throws HibernateException {
    final MembershipImpl membership = new MembershipImpl();
    membership.setGroup(group);
    membership.setRole(role);
    session.save(membership);
    return membership;
  }

  public static GroupImpl createDefaultGroup(final Session session, final String name, final String label,
      final String description, final Group parentGroup) throws HibernateException {
    final GroupImpl group = new GroupImpl(name);
    group.setLabel(label);
    group.setDescription(description);
    group.setParentGroup(parentGroup);
    session.save(group);
    return group;
  }

  public static RoleImpl createDefaultRole(final Session session, final String name, final String label,
      final String description) throws HibernateException {
    final RoleImpl role = new RoleImpl(name);
    role.setLabel(label);
    role.setDescription(description);
    session.save(role);
    return role;
  }

  public static UserImpl addDefaultUser(final Session session, final String username, final String firstName,
      final String lastName, final String password, final String manager, final String delegee,
      final Set memberships) throws HibernateException {
    final UserImpl user = new UserImpl(username, Misc.hash(password));
    user.setFirstName(firstName);
    user.setLastName(lastName);
    user.setMemberships(memberships);
    user.setManagerUUID(manager);
    user.setDelegeeUUID(delegee);
    session.save(user);
    return user;
  }

  public static void dropDb(final String domain, final String configurationName) throws Exception {
    final EventExecutor eventExecutor = GlobalEnvironmentFactory.getEnvironmentFactory(BonitaConstants.DEFAULT_DOMAIN)
        .get(EventExecutor.class);
    eventExecutor.stop();
    final Configuration configuration = getConfiguration(domain, configurationName);
    final SchemaExport schemaExport = getSchemaExport(configuration);
    schemaExport.drop(false, true);
    final String indexesDirecoryPath = SearchUtil.getIndexesDirectoryPath(configuration);
    if (indexesDirecoryPath != null) {
      Misc.deleteDir(new File(indexesDirecoryPath));
    }
  }

  public static void main(final String[] args) throws Exception {
    if (args == null || args.length < 2) {
      final String message = ExceptionManager.getInstance().getFullMessage("bh_DBT_3", EnvConstants.HB_CONFIG_CORE,
          EnvConstants.HB_CONFIG_HISTORY);
      throw new IllegalArgumentException(message);
    }
    final String domain = args[0];
    final String disableSearch = "bonita.search.use";
    System.setProperty(disableSearch, "false");
    try {
      for (int i = 1; i < args.length; i++) {
        recreateDb(domain, args[i]);
      }
    } finally {
      StringBuilder builder = new StringBuilder();
      builder.append("*******************************************************************************************************************\n");
      builder.append("* We recommend that you read the documentation (in case of possible modifications in your database configuration) *\n");
      builder.append("*******************************************************************************************************************\n");
      LOG.info(builder.toString());
      System.clearProperty(disableSearch);
    }
  }

  public static boolean isOnDb(final String dbName, final Configuration config) {
    final String lowerDbName = dbName.toLowerCase();
    return isOnDatabaseAccordingToDialect(lowerDbName, config) || isOnDatabaseAccordingToURL(lowerDbName, config);
  }

  private static boolean isOnDatabaseAccordingToDialect(final String dbName, final Configuration config) {
    final String dialect = getDbDialect(config);
    if (dialect == null) {
      throw new BonitaRuntimeException("The 'hibernate.dialect' property must be set");
    }
    final String lowerDialectName = dialect.toLowerCase();
    return lowerDialectName.contains(dbName);
  }

  private static String getDatabaseVendor(final Configuration config) {
    if (isOnDb("oracle", config)) {
      return "oracle";
    } else if (isOnDb("mysql", config)) {
      return "mysql";
    } else if (isOnDb("h2", config)) {
      return "h2";
    } else if (isOnDb("postgres", config)) {
      return "postgres";
    } else if (isOnDb("sqlserver", config)) {
      return "sqlserver";
    } else {
      throw new BonitaRuntimeException("Database unknown.");
    }
  }

  private static boolean isOnDatabaseAccordingToURL(final String lowerDbName, final Configuration config) {
    String url = getDbUrl(config);
    if (url != null) {
      final int index = url.indexOf(":/");
      if (index == -1) {
        url = url.split(":")[1];
      } else {
        url = url.substring(0, index);
      }
      url = url.toLowerCase();
    }
    return url != null && url.contains(lowerDbName);
  }

  public static String getDbDialect(final Configuration config) {
    return config.getProperty("hibernate.dialect");
  }

  public static String getDbUrl(final Configuration config) {
    return config.getProperty("hibernate.connection.url");
  }

  public static String getDbUseQueryCache(final Configuration config) {
    return config.getProperty("hibernate.cache.use_query_cache");
  }

  public static String getDbUseSecondLeveleCache(final Configuration config) {
    return config.getProperty("hibernate.cache.use_second_level_cache");
  }

  public static String getDbDriverClass(final Configuration config) {
    return config.getProperty("hibernate.connection.driver_class");
  }

  public static void cleanCache(final String domain, final String sessionFactoryName) throws Exception {
    // clean 2nd level cache:
    final SessionFactoryImplementor sessionFactory = getSessionFactory(domain, sessionFactoryName);
    if (sessionFactory != null) {
      final Cache cache = sessionFactory.getCache();
      if (cache != null) {
        cache.evictDefaultQueryRegion();
        cache.evictQueryRegions();
        cache.evictCollectionRegions();
        cache.evictEntityRegions();
      }
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy