Skip to content

Instantly share code, notes, and snippets.

@Sch3lp
Last active August 29, 2015 13:56
Show Gist options
  • Select an option

  • Save Sch3lp/9185192 to your computer and use it in GitHub Desktop.

Select an option

Save Sch3lp/9185192 to your computer and use it in GitHub Desktop.

Revisions

  1. Sch3lp revised this gist Feb 24, 2014. 1 changed file with 1 addition and 3 deletions.
    4 changes: 1 addition & 3 deletions DropWizardHibernateRule
    Original file line number Diff line number Diff line change
    @@ -24,7 +24,6 @@ import com.google.common.collect.ImmutableList;
    import com.google.common.collect.ImmutableMap;
    import com.google.common.collect.Lists;
    import com.google.common.collect.Sets;
    import org.yourcompany.domain.SomeEntity;
    import com.yammer.dropwizard.config.ConfigurationException;
    import com.yammer.dropwizard.config.ConfigurationFactory;
    import com.yammer.dropwizard.db.DatabaseConfiguration;
    @@ -76,8 +75,7 @@ public class DropwizardHibernateRule implements TestRule {
    final ManagedDataSource dataSource = new ManagedDataSourceFactory().build(dbConfig);
    final ConnectionProvider provider = buildConnectionProvider(dataSource,
    dbConfig.getProperties());
    sessionFactory = buildSessionFactory(dbConfig, provider, ImmutableMap.<String, String> of(),
    Lists.<Class<?>> newArrayList(SomeEntity.class));
    sessionFactory = buildSessionFactory(dbConfig, provider, ImmutableMap.<String, String> of(), entities);

    // open session/transaction
    ManagedSessionContext.bind(sessionFactory.openSession());
  2. Sch3lp revised this gist Feb 24, 2014. 3 changed files with 51 additions and 7 deletions.
    13 changes: 8 additions & 5 deletions DropWizardHibernateRule
    Original file line number Diff line number Diff line change
    @@ -20,6 +20,7 @@ import org.junit.rules.TestRule;
    import org.junit.runner.Description;
    import org.junit.runners.model.Statement;

    import com.google.common.collect.ImmutableList;
    import com.google.common.collect.ImmutableMap;
    import com.google.common.collect.Lists;
    import com.google.common.collect.Sets;
    @@ -35,17 +36,19 @@ public class DropwizardHibernateRule implements TestRule {

    private SessionFactory sessionFactory;
    private String configFilePath;
    private ImmutableList<Class<?>> entities;

    public static DropwizardHibernateRule create() {
    return create("src/test/resources/test-db.yml");
    public static DropwizardHibernateRule create(ImmutableList<Class<?>> entities) {
    return create("src/test/resources/test-db.yml", entities);
    }

    public static DropwizardHibernateRule create(String config) {
    return new DropwizardHibernateRule(config);
    public static DropwizardHibernateRule create(String config, ImmutableList<Class<?>> entities) {
    return new DropwizardHibernateRule(config, entities);
    }

    private DropwizardHibernateRule(String config) {
    private DropwizardHibernateRule(String config, ImmutableList<Class<?>> entities) {
    this.configFilePath = config;
    this.entities = entities;
    }

    public SessionFactory getSessionFactory() {
    5 changes: 3 additions & 2 deletions SomeEntityIntegrationTest
    Original file line number Diff line number Diff line change
    @@ -8,12 +8,13 @@ import org.junit.Before;
    import org.junit.Rule;
    import org.junit.Test;

    import com.yourcompany.test.DropwizardHibernateRule;
    import org.yourcompany.service.YourService;
    import org.yourcompany.test.DropwizardHibernateRule;

    public class SomeEntityRepositoryIntegrationTest {

    @Rule
    public DropwizardHibernateRule dropwizardHibernateRule = DropwizardHibernateRule.create();
    public DropwizardHibernateRule dropwizardHibernateRule = DropwizardHibernateRule.create(YourService.hibernentities);

    private SomeEntityRepository repository;

    40 changes: 40 additions & 0 deletions YourService
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,40 @@
    package org.yourcompany.service;

    import com.google.common.collect.ImmutableList;
    import org.yourcompany.configuration.YourConfiguration;
    import org.yourcompany.domain.SomeEntity;
    import org.yourcompany.domain.SomeEntityRepository;

    import com.yammer.dropwizard.Service;
    import com.yammer.dropwizard.config.Bootstrap;
    import com.yammer.dropwizard.config.Environment;
    import com.yammer.dropwizard.db.DatabaseConfiguration;
    import com.yammer.dropwizard.hibernate.HibernateBundle;
    import com.yammer.dropwizard.hibernate.SessionFactoryFactory;

    public class YourService extends Service<YourConfiguration> {

    public static ImmutableList<Class<?>> hibernentities = ImmutableList.<Class<?>> of(SomeEntity.class);

    private final HibernateBundle<YourConfiguration> hibernate = new HibernateBundle<YourConfiguration>(hibernentities, new SessionFactoryFactory()) {
    @Override
    public DatabaseConfiguration getDatabaseConfiguration(YourConfiguration configuration) {
    return configuration.getDatabaseConfiguration();
    }
    };

    @Override
    public void initialize(Bootstrap<YourConfiguration> bootstrap) {
    bootstrap.setName("derp");
    bootstrap.addBundle(hibernate);
    }

    @Override
    public void run(YourConfiguration configuration, Environment environment) throws Exception {
    environment.addResource(new SomeResource(new SomeEntityRepository(hibernate.getSessionFactory())));
    }

    public static void main(String[] args) throws Exception {
    new YourService().run(args);
    }
    }
  3. Sch3lp created this gist Feb 24, 2014.
    149 changes: 149 additions & 0 deletions DropWizardHibernateRule
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,149 @@
    package org.yourcompany.test;

    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    import java.util.Map;
    import java.util.SortedSet;

    import javax.sql.DataSource;

    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.AvailableSettings;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.context.internal.ManagedSessionContext;
    import org.hibernate.service.ServiceRegistry;
    import org.hibernate.service.ServiceRegistryBuilder;
    import org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl;
    import org.hibernate.service.jdbc.connections.spi.ConnectionProvider;
    import org.junit.rules.TestRule;
    import org.junit.runner.Description;
    import org.junit.runners.model.Statement;

    import com.google.common.collect.ImmutableMap;
    import com.google.common.collect.Lists;
    import com.google.common.collect.Sets;
    import org.yourcompany.domain.SomeEntity;
    import com.yammer.dropwizard.config.ConfigurationException;
    import com.yammer.dropwizard.config.ConfigurationFactory;
    import com.yammer.dropwizard.db.DatabaseConfiguration;
    import com.yammer.dropwizard.db.ManagedDataSource;
    import com.yammer.dropwizard.db.ManagedDataSourceFactory;
    import com.yammer.dropwizard.validation.Validator;

    public class DropwizardHibernateRule implements TestRule {

    private SessionFactory sessionFactory;
    private String configFilePath;

    public static DropwizardHibernateRule create() {
    return create("src/test/resources/test-db.yml");
    }

    public static DropwizardHibernateRule create(String config) {
    return new DropwizardHibernateRule(config);
    }

    private DropwizardHibernateRule(String config) {
    this.configFilePath = config;
    }

    public SessionFactory getSessionFactory() {
    return sessionFactory;
    }

    @Override
    public Statement apply(final Statement base, Description description) {
    return new Statement() {

    @Override
    public void evaluate() throws Throwable {
    before();
    try {
    base.evaluate();
    } finally {
    after();
    }
    }
    };
    }

    protected void before() throws IOException, ConfigurationException, ClassNotFoundException {
    DatabaseConfiguration dbConfig = createDatabaseConfiguration();
    final ManagedDataSource dataSource = new ManagedDataSourceFactory().build(dbConfig);
    final ConnectionProvider provider = buildConnectionProvider(dataSource,
    dbConfig.getProperties());
    sessionFactory = buildSessionFactory(dbConfig, provider, ImmutableMap.<String, String> of(),
    Lists.<Class<?>> newArrayList(SomeEntity.class));

    // open session/transaction
    ManagedSessionContext.bind(sessionFactory.openSession());
    }

    protected void after() {
    // close session/transaction
    ManagedSessionContext.unbind(sessionFactory);
    }

    /**
    * Creates a DatabaseConfiguration from a File
    */
    private DatabaseConfiguration createDatabaseConfiguration() throws IOException, ConfigurationException {
    return ConfigurationFactory.forClass(DatabaseConfiguration.class, new Validator()).build(new File(configFilePath));
    }

    /**
    * From com.yammer.dropwizard.hibernate.SessionFactoryFactory
    */
    private ConnectionProvider buildConnectionProvider(DataSource dataSource,
    ImmutableMap<String, String> properties) {
    final DatasourceConnectionProviderImpl connectionProvider = new DatasourceConnectionProviderImpl();
    connectionProvider.setDataSource(dataSource);
    connectionProvider.configure(properties);
    return connectionProvider;
    }

    /**
    * From com.yammer.dropwizard.hibernate.SessionFactoryFactory
    */
    private SessionFactory buildSessionFactory(DatabaseConfiguration dbConfig,
    ConnectionProvider connectionProvider,
    ImmutableMap<String, String> properties,
    List<Class<?>> entities) {
    final Configuration configuration = new Configuration();
    configuration.setProperty(AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS, "managed");
    configuration.setProperty(AvailableSettings.USE_SQL_COMMENTS, Boolean.toString(dbConfig.isAutoCommentsEnabled()));
    configuration.setProperty(AvailableSettings.USE_GET_GENERATED_KEYS, "true");
    configuration.setProperty(AvailableSettings.GENERATE_STATISTICS, "true");
    configuration.setProperty(AvailableSettings.USE_REFLECTION_OPTIMIZER, "true");
    configuration.setProperty(AvailableSettings.ORDER_UPDATES, "true");
    configuration.setProperty(AvailableSettings.ORDER_INSERTS, "true");
    configuration.setProperty(AvailableSettings.USE_NEW_ID_GENERATOR_MAPPINGS, "true");
    configuration.setProperty("jadira.usertype.autoRegisterUserTypes", "true");
    for (Map.Entry<String, String> property : properties.entrySet()) {
    configuration.setProperty(property.getKey(), property.getValue());
    }

    addAnnotatedClasses(configuration, entities);

    final ServiceRegistry registry = new ServiceRegistryBuilder()
    .addService(ConnectionProvider.class, connectionProvider)
    .applySettings(properties)
    .buildServiceRegistry();

    return configuration.buildSessionFactory(registry);
    }

    /**
    * From com.yammer.dropwizard.hibernate.SessionFactoryFactory
    */
    private void addAnnotatedClasses(Configuration configuration,
    Iterable<Class<?>> entities) {
    final SortedSet<String> entityClasses = Sets.newTreeSet();
    for (Class<?> klass : entities) {
    configuration.addAnnotatedClass(klass);
    entityClasses.add(klass.getCanonicalName());
    }
    }

    }
    41 changes: 41 additions & 0 deletions SomeEntity
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,41 @@
    package org.yourcompany.domain;

    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;
    import javax.persistence.Table;

    @Entity
    @Table(name = "SOME_ENTITY")
    @NamedQueries({
    @NamedQuery(
    name = "org.yourcompany.domain.SomeEntity.findAll",
    query = "from SomeEntity"
    )
    })
    public class SomeEntity {

    @Id
    private int id;

    private String name;

    @SuppressWarnings("unused")
    private SomeEntity() {
    }

    public SomeEntity(int id, String name) {
    this.id = id;
    this.name = name;
    }

    public int getId() {
    return id;
    }

    public String getName() {
    return name;
    }

    }
    31 changes: 31 additions & 0 deletions SomeEntityIntegrationTest
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    package org.yourcompany.domain;

    import static org.fest.assertions.api.Assertions.assertThat;

    import java.util.List;

    import org.junit.Before;
    import org.junit.Rule;
    import org.junit.Test;

    import com.yourcompany.test.DropwizardHibernateRule;

    public class SomeEntityRepositoryIntegrationTest {

    @Rule
    public DropwizardHibernateRule dropwizardHibernateRule = DropwizardHibernateRule.create();

    private SomeEntityRepository repository;

    @Before
    public void setUpSessionFactory() {
    repository = new SomeEntityRepository(dropwizardHibernateRule.getSessionFactory());
    }

    @Test
    public void herp() throws Exception {
    List<SomeEntity> cpbs = repository.getAll();
    assertThat(cpbs).isNotEmpty();
    }

    }
    19 changes: 19 additions & 0 deletions SomeEntityRepository
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,19 @@
    package org.yourcompany.domain;

    import java.util.List;

    import org.hibernate.SessionFactory;

    import com.yammer.dropwizard.hibernate.AbstractDAO;

    public class SomeEntityRepository extends AbstractDAO<SomeEntity> {

    public SomeEntityRepository(SessionFactory sessionFactory) {
    super(sessionFactory);
    }

    public List<SomeEntity> getAll() {
    return list(namedQuery("org.yourcompany.domain.SomeEntity.findAll"));
    }

    }
    8 changes: 8 additions & 0 deletions init.sql
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,8 @@
    CREATE TABLE SOMEENTITY (
    ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY NOT NULL,
    VERSION BIGINT NOT NULL,
    NAME VARCHAR(255)
    );

    insert into SOMEENTITY (version, name) values (0, 'moocows');
    commit;
    36 changes: 36 additions & 0 deletions test-db.yml
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,36 @@
    # the name of your JDBC driver
    driverClass: org.hsqldb.jdbc.JDBCDriver

    # the username
    user: sa

    # the password
    password:

    # the JDBC URL
    url: jdbc:hsqldb:hsql://localhost/somedb

    # any properties specific to your JDBC driver:
    properties:
    charSet: UTF-8

    # the maximum amount of time to wait on an empty pool before throwing an exception
    maxWaitForConnection: 1s

    # the SQL query to run when validating a connection's liveness
    validationQuery: "SELECT 1"

    # the minimum number of connections to keep open
    minSize: 8

    # the maximum number of connections to keep open
    maxSize: 32

    # whether or not idle connections should be validated
    checkConnectionWhileIdle: false

    # how long a connection must be held before it can be validated
    checkConnectionHealthWhenIdleFor: 10s

    # the maximum lifetime of an idle connection
    closeConnectionIfIdleFor: 1 minute