Skip to content
Permalink
Browse files
Unfinished Commits, Guice Injection Error (See persistence.xml)
Implemented DatabaseModule() for when creating the Guice injector
instance.

Added Guice annotations to GenericJpaDao
  • Loading branch information
jadenmitchell committed Jun 17, 2016
1 parent 480e129 commit 69b98ee
Show file tree
Hide file tree
Showing 15 changed files with 442 additions and 1,146 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

@@ -17,7 +17,7 @@ dependencies {

// DEPENDENCY INJECTION
compile group: 'com.google.inject', name: 'guice', version: '4.0'
compile group: 'com.google.inject.extensions', name: 'guice-persist', version: '3.0-rc2'
compile group: 'com.google.inject.extensions', name: 'guice-persist', version: '4.0'
compile group: 'com.netflix.governator', name: 'governator', version: '1.12.13'
compile group: 'com.netflix.governator', name: 'governator-archaius', version: '1.12.13'
compile group: 'com.mycila.guice.extensions', name: 'mycila-guice-jsr250', version: '3.2.ga'
@@ -1,6 +1,6 @@
mysql.user=root
mysql.pass=drewuv6cre6uYas
mysql.database=mango_db
mysql.database=rev_db
mysql.maxconnections=100
# default or innoDB
mysql.dialect=default
@@ -11,6 +11,7 @@
import org.mdev.revolution.communication.encryption.HabboEncryption;
import org.mdev.revolution.communication.packets.PacketManager;
import org.mdev.revolution.database.DatabaseManager;
import org.mdev.revolution.game.players.PlayerService;
import org.mdev.revolution.network.Server;
import org.mdev.revolution.network.sessions.SessionManager;
import org.mdev.revolution.utilities.Configuration;
@@ -140,6 +141,8 @@ public static void main(String[] args) {
Thread hook = new Thread(Revolution::shutdown);
Runtime.getRuntime().addShutdownHook(hook);

PlayerService.findPlayer("");

while (true) {}
}

@@ -1,8 +1,5 @@
package org.mdev.revolution.database;

import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.persist.jpa.JpaPersistModule;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.logging.log4j.LogManager;
@@ -12,60 +9,60 @@
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl;
import org.hibernate.service.ServiceRegistry;
import org.mdev.revolution.Revolution;
import org.mdev.revolution.communication.packets.outgoing.notifications.HabboBroadcastMessageComposer;

import javax.activation.DataSource;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Hashtable;

public class DatabaseManager {
private static final Logger logger = LogManager.getLogger(DatabaseManager.class);

private HikariDataSource dataSource;
private SessionFactory sessionFactory;
private EntityManagerFactory emf;
private Injector injector;

@Inject
public void initialize() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
hikariConfig.setDataSourceJNDI("jdbc/HikariDataSource");
hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/" + Revolution.getConfig().getString("mysql.database") + "?autoReconnect=true&useSSL=false");
hikariConfig.setUsername(Revolution.getConfig().getString("mysql.user"));
hikariConfig.setPassword(Revolution.getConfig().getString("mysql.pass"));
hikariConfig.setMaximumPoolSize(Revolution.getConfig().getInt("mysql.maxconnections"));
hikariConfig.setDataSourceJNDI("default");
hikariConfig.addDataSourceProperty("cachePrepStmts", true);
hikariConfig.addDataSourceProperty("prepStmtCacheSize", 250);
hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
dataSource = new HikariDataSource(hikariConfig);
try {
Hashtable<Object, Object> env = new Hashtable<>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");
env.put(Context.PROVIDER_URL, "corbaloc::localhost:9810,:localhost:9811");
Context context = new InitialContext(env);
context.bind("java:/comp/env/jdbc/default", dataSource);
}
catch(NamingException e) {
logger.error("Error binding the JNDI DataSource to the Context", e);
System.exit(0);
}
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry
= new StandardServiceRegistryBuilder()
//.applySetting(Environment.TRANSACTION_COORDINATOR_STRATEGY, JtaTransactionCoordinatorBuilderImpl.class)
//.applySetting(Environment.CONNECTION_PROVIDER, "com.zaxxer.hikari.hibernate.HikariConnectionProvider")
//.applySetting(Environment.SESSION_FACTORY_NAME, dataSource.getDataSourceJNDI())
//.applySetting(Environment.SESSION_FACTORY_NAME_IS_JNDI, "true")
.applySetting(Environment.TRANSACTION_COORDINATOR_STRATEGY, JtaTransactionCoordinatorBuilderImpl.class)
.applySetting(Environment.DIALECT, "org.hibernate.dialect." + (Revolution.getConfig().getString("mysql.dialect").equals("innodb") ? "MySQLInnoDBDialect" : "MySQLDialect"))
.applySetting(Environment.DATASOURCE, dataSource)
.build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
emf = Persistence.createEntityManagerFactory("org.mdev.revolution.jpa");
injector = Guice.createInjector(new JpaPersistModule("org.mdev.revolution.jpa"));
}

public EntityManager createEntityManager() {
return emf.createEntityManager();
}

@SuppressWarnings("unchecked")
public Injector getInjector() {
return injector;
}

public Session openSession() {
@@ -0,0 +1,27 @@
package org.mdev.revolution.database;

import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
import com.google.inject.persist.PersistService;
import com.google.inject.persist.jpa.JpaPersistModule;

import javax.inject.Inject;

public class DatabaseModule extends AbstractModule {
public static final DatabaseModule INSTANCE = new DatabaseModule();

@Override
protected void configure() {
install(new JpaPersistModule("org.mdev.revolution.jpa"));
bind(JPAInitializer.class).asEagerSingleton();
}

@Singleton
public static class JPAInitializer {

@Inject
public JPAInitializer(final PersistService service) {
service.start();
}
}
}
@@ -1,7 +1,13 @@
package org.mdev.revolution.database.dao;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.persist.Transactional;
import com.google.inject.persist.jpa.JpaPersistModule;
import org.hibernate.CacheMode;
import org.mdev.revolution.Revolution;
import org.mdev.revolution.database.DatabaseModule;

import javax.inject.Inject;
import javax.persistence.EntityManager;
@@ -15,48 +21,48 @@

@SuppressWarnings("unchecked")
public abstract class GenericJpaDao<T, K extends Serializable> {
@Inject
@PersistenceContext
private EntityManager entityManager;

protected EntityManager getEntityManager() {
if (entityManager == null) {
entityManager = Revolution.getInstance().getDatabaseManager().getInjector().getInstance(EntityManager.class);
}
return entityManager;
}

private Class clazz;

public void setClazz(Class clazz) {
this.clazz = clazz;
}

@Inject
public GenericJpaDao() {
entityManager = Revolution.getInstance().getDatabaseManager().createEntityManager();
Injector injector = Guice.createInjector(DatabaseModule.INSTANCE);
entityManager = injector.getInstance(EntityManager.class);
}

@Transactional
public void create(T entity) {
getEntityManager().persist(entity);
entityManager.persist(entity);
}

@Transactional
public void update(T entity) {
getEntityManager().merge(entity);
entityManager.merge(entity);
}

@Transactional
public void remove(K id) {
Object entity = getEntityManager().find(clazz, id);
Object entity = entityManager.find(clazz, id);
remove((T) entity);
}

@Transactional
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
entityManager.remove(entityManager.merge(entity));
}

@Transactional
public void delete(T object) {
getEntityManager().detach(object);
entityManager.detach(object);
}

@Transactional
public void save(T object) {
if (entityManager.contains(object)) {
update(object);
@@ -65,18 +71,21 @@ public void save(T object) {
}
}

@Transactional
public void flush() {
getEntityManager().flush();
entityManager.flush();
}

@Transactional
@SuppressWarnings("unchecked")
public List<T> findAll() {
final CriteriaQuery<T> criteriaQuery = getEntityManager().getCriteriaBuilder()
final CriteriaQuery<T> criteriaQuery = entityManager.getCriteriaBuilder()
.createQuery(clazz);
criteriaQuery.select(criteriaQuery.from(clazz));
return getEntityManager().createQuery(criteriaQuery).getResultList();
return entityManager.createQuery(criteriaQuery).getResultList();
}

@Transactional
@SuppressWarnings("unchecked")
private TypedQuery<T> findTypedQueryByProperty(String property, Object value) {
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
@@ -88,6 +97,7 @@ private TypedQuery<T> findTypedQueryByProperty(String property, Object value) {
return entityManager.createQuery(criteriaQuery);
}

@Transactional
@SuppressWarnings("unchecked")
private TypedQuery<T> findTypedQueryByProperty(final SingularAttribute<T, ? extends Object> property, final Object value) {
final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
@@ -110,11 +120,13 @@ private TypedQuery<T> findTypedQueryByProperty(final SingularAttribute<T, ? exte
.createQuery(criteriaQuery);
}

@Transactional
@SuppressWarnings("unchecked")
public List<T> findByProperty(String property, final Object value) {
return findTypedQueryByProperty(property, value).getResultList();
}

@Transactional
@SuppressWarnings("unchecked")
public List<T> findByPropertyLimit(String property, final Object value, int maxLimit) {
return findTypedQueryByProperty(property, value)
@@ -123,6 +135,7 @@ public List<T> findByPropertyLimit(String property, final Object value, int maxL
.getResultList();
}

@Transactional
@SuppressWarnings("unchecked")
public T findByPropertyUnique(String property, final Object value) {
return findByPropertyLimit(property, value, 1).get(0);
@@ -55,6 +55,7 @@ public static Player findPlayer(String ssoTicket) {
return null;
}

System.out.println("PLAYER ID: " + playerId);
return playerDao.findByPropertyUnique("id", playerId);
}

@@ -47,7 +47,7 @@ public boolean tryLogin(String ssoTicket) {
if (player == null) {
sendPacket(new HabboBroadcastMessageComposer("No player found with your session ticket"));
return false;
}
}

PlayerService.removeSSOTicket(player.getId());

@@ -2,22 +2,29 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="org.mdev.revolution.jpa" transaction-type="RESOURCE_LOCAL">
<persistence-unit name="org.mdev.revolution.jpa" transaction-type="JTA"> <!-- RESOURCE_LOCAL -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:HikariDataSource</jta-data-source>
<class>org.mdev.revolution.database.domain.Player</class>
<properties>
<!-- Disable the second-level cache -->
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />

<!-- Important, Database Connection Provider -->
<!--<property name="hibernate.connection.provider_class"
value="com.zaxxer.hikari.hibernate.HikariConnectionProvider" />
-->

<property name="hibernate.connection.datasource" value="java:comp/env/jdbc/default"/>

<!-- Default is false for backwards compatibility. Should be used on all new projects -->
<property name="hibernate.id.new_generator_mappings" value="true"/>

<!-- Hibernate connection dialect -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect"/>

<!-- Echo all executed SQL to stdout -->
<property name="hibernate.show_sql" value="true"/>

<!-- Format SQL before echo to stdout -->
<property name="hibernate.format_sql" value="true"/>
</properties>

0 comments on commit 69b98ee

Please sign in to comment.