/** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.brixcms.rmiserver.boot; import org.brixcms.rmiserver.Role; import org.brixcms.rmiserver.User; import org.brixcms.rmiserver.UserService; import org.brixcms.rmiserver.UserService.UserDto; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.dialect.Dialect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class Bootstrapper { private static final Logger logger = LoggerFactory.getLogger(Bootstrapper.class); private final DataSource datasource; private final PlatformTransactionManager transactionManager; private final Configuration configuration; private final SessionFactory sessionFactory; private final UserService userService; private final String workspaceManagerLogin; private final String workspaceManagerPassword; public Bootstrapper(DataSource datasource, PlatformTransactionManager transactionManager, Configuration configuration, SessionFactory sessionFactory, UserService userService, String workspaceManagerLogin, String workspaceManagerPassword) { this.datasource = datasource; this.configuration = configuration; this.sessionFactory = sessionFactory; this.transactionManager = transactionManager; this.userService = userService; this.workspaceManagerLogin = workspaceManagerLogin; this.workspaceManagerPassword = workspaceManagerPassword; } public void bootstrap() throws Exception { logger.info("Bootstrapper executing"); // create schema if necessary Session session = sessionFactory.openSession(); try { session.createCriteria(User.class).setMaxResults(1).list(); logger.info("Bootstrapper found schema, skipping schema creation"); } catch (HibernateException e) { logger.info("Bootstrapper did not find schema"); TransactionStatus txn = transactionManager .getTransaction(new DefaultTransactionDefinition()); try { logger.info("creating schema..."); bootstrapSchema(); logger.info("creating default admin user..."); bootstrapUsers(); } finally { if (txn.isRollbackOnly()) { transactionManager.rollback(txn); } else { transactionManager.commit(txn); } } } finally { session.close(); } logger.info("Bootstrapper execution completed"); } /** * @param sf */ private void bootstrapSchema() { Connection con = null; try { con = datasource.getConnection(); Dialect dialect = Dialect.getDialect(configuration.getProperties()); String[] schema = configuration.generateSchemaCreationScript(dialect); for (String stmt : schema) { Statement st = con.createStatement(); st.executeUpdate(stmt); st.close(); } con.commit(); } catch (SQLException e1) { if (con != null) { try { con.rollback(); } catch (SQLException e2) { try { con.close(); } catch (SQLException e3) { } } } } } private void bootstrapUsers() { UserDto dto = new UserDto(); dto.login = "admin"; dto.password = "admin"; dto.roles.add(Role.ADMIN); userService.create(dto); dto.login = workspaceManagerLogin; dto.password = workspaceManagerPassword; dto.locked = true; dto.roles.clear(); dto.roles.add(Role.RMI); userService.create(dto); } }