@Activate
  protected void activate(final BundleContext bundleContext, Map<String, Object> properties) {

    _logger = new Logger(bundleContext);

    DB db = DBManagerUtil.getDB();

    ServiceTrackerMapListener<String, UpgradeInfo, List<UpgradeInfo>> serviceTrackerMapListener =
        null;

    _releaseManagerConfiguration =
        ConfigurableUtil.createConfigurable(ReleaseManagerConfiguration.class, properties);

    if (_releaseManagerConfiguration.autoUpgrade()) {
      serviceTrackerMapListener = new UpgradeInfoServiceTrackerMapListener();
    }

    _serviceTrackerMap =
        ServiceTrackerMapFactory.openMultiValueMap(
            bundleContext,
            UpgradeStep.class,
            "(&(upgrade.bundle.symbolic.name=*)(|(upgrade.db.type=any)"
                + "(upgrade.db.type="
                + db.getDBType()
                + ")))",
            new PropertyServiceReferenceMapper<String, UpgradeStep>("upgrade.bundle.symbolic.name"),
            new UpgradeServiceTrackerCustomizer(bundleContext),
            Collections.reverseOrder(
                new PropertyServiceReferenceComparator<UpgradeStep>("upgrade.from.schema.version")),
            serviceTrackerMapListener);
  }
  protected boolean isMySQL() {
    DB db = DBManagerUtil.getDB();

    if (db.getDBType() == DBType.MYSQL) {
      return true;
    }

    return false;
  }
  @Override
  protected void doVerify() throws Exception {
    DB db = DBManagerUtil.getDB();

    if (db.getDBType() != DBType.DB2) {
      return;
    }

    PreparedStatement ps = null;
    ResultSet rs = null;

    try {
      StringBundler sb = new StringBundler(4);

      sb.append("select tbname, name, coltype, length from ");
      sb.append("sysibm.syscolumns where tbcreator = (select distinct ");
      sb.append("current schema from sysibm.sysschemata) AND coltype = ");
      sb.append("'VARCHAR' and length = 500");

      ps = connection.prepareStatement(sb.toString());

      rs = ps.executeQuery();

      while (rs.next()) {
        String tableName = rs.getString(1);

        if (!isPortalTableName(tableName)) {
          continue;
        }

        String columnName = rs.getString(2);

        runSQL(
            "alter table "
                + tableName
                + " alter column "
                + columnName
                + " set data type varchar(600)");
      }
    } finally {
      DataAccess.cleanUp(ps, rs);
    }
  }
  protected Scheduler initializeScheduler(String propertiesPrefix, boolean useQuartzCluster)
      throws Exception {

    StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();

    Properties properties = _props.getProperties(propertiesPrefix, true);

    if (useQuartzCluster) {
      DB db = DBManagerUtil.getDB();

      DBType dbType = db.getDBType();

      if (dbType == DBType.SQLSERVER) {
        String lockHandlerClassName =
            properties.getProperty("org.quartz.jobStore.lockHandler.class");

        if (Validator.isNull(lockHandlerClassName)) {
          properties.setProperty(
              "org.quartz.jobStore.lockHandler.class", UpdateLockRowSemaphore.class.getName());
        }
      }

      if (GetterUtil.getBoolean(_props.get(PropsKeys.CLUSTER_LINK_ENABLED))) {

        if (dbType == DBType.HYPERSONIC) {
          _log.error("Unable to cluster scheduler on Hypersonic");
        } else {
          properties.put("org.quartz.jobStore.isClustered", Boolean.TRUE.toString());
        }
      }
    }

    schedulerFactory.initialize(properties);

    return schedulerFactory.getScheduler();
  }
  protected void processStartupEvents() throws Exception {

    // Print release information

    Class<?> clazz = getClass();

    ClassLoader classLoader = clazz.getClassLoader();

    try (InputStream inputStream =
        classLoader.getResourceAsStream("com/liferay/portal/events/dependencies/startup.txt")) {

      System.out.println(_toString(inputStream));
    }

    System.out.println("Starting " + ReleaseInfo.getReleaseInfo() + "\n");

    if (_log.isDebugEnabled()) {
      _log.debug("Portal Resiliency - NOT SUPPORTED");
    }

    // Shutdown hook

    if (_log.isDebugEnabled()) {
      _log.debug("Add shutdown hook");
    }

    Runtime runtime = Runtime.getRuntime();

    runtime.addShutdownHook(new Thread(new ShutdownHook()));

    // MySQL version

    DB db = DBManagerUtil.getDB();

    if ((db.getDBType() == DBType.MYSQL) && GetterUtil.getFloat(db.getVersionString()) < 5.6F) {

      throw new ServletException(
          "Please upgrade to at least MySQL 5.6.4. The portal no "
              + "longer supports older versions of MySQL.");
    }

    // Check required build number

    if (_log.isDebugEnabled()) {
      _log.debug("Check required build number");
    }

    DBUpgrader.checkRequiredBuildNumber(ReleaseInfo.getParentBuildNumber());

    Registry registry = RegistryUtil.getRegistry();

    Map<String, Object> properties = new HashMap<>();

    properties.put("module.service.lifecycle", "database.initialized");
    properties.put("service.vendor", ReleaseInfo.getVendor());
    properties.put("service.version", ReleaseInfo.getVersion());

    _dbModuleServiceLifecycleServiceRegistration =
        registry.registerService(
            ModuleServiceLifecycle.class, new ModuleServiceLifecycle() {}, properties);

    // Check class names

    if (_log.isDebugEnabled()) {
      _log.debug("Check class names");
    }

    ClassNameLocalServiceUtil.checkClassNames();
  }