package org.hivedb.hibernate; import org.hibernate.CallbackException; import org.hibernate.EntityMode; import org.hivedb.Hive; import org.hivedb.HiveLockableException; import org.hivedb.Lockable.Status; import org.hivedb.configuration.EntityHiveConfig; import org.hivedb.util.classgen.GenerateInstance; import org.hivedb.util.classgen.GeneratedClassFactory; import org.hivedb.util.classgen.GeneratedInstanceInterceptor; import org.hivedb.util.database.test.Continent; import org.hivedb.util.database.test.HiveTest; import org.hivedb.util.database.test.HiveTest.Config; import org.hivedb.util.database.test.WeatherReport; import static org.junit.Assert.*; import org.junit.Test; import java.util.Arrays; @Config("hive_default") public class HiveInterceptorDecoratorTest extends HiveTest { @Test public void testInstantiate() throws Exception { EntityHiveConfig config = getEntityHiveConfig(); Hive hive = getHive(); HiveInterceptorDecorator interceptor = new HiveInterceptorDecorator(config, hive); Object o = interceptor.instantiate("org.hivedb.util.database.test.WeatherReport", EntityMode.POJO, 7); assertEquals(GeneratedClassFactory.getGeneratedClass(WeatherReport.class), o.getClass()); } @Test public void testIsTransient() throws Exception { EntityHiveConfig config = getEntityHiveConfig(); Hive hive = getHive(); HiveInterceptorDecorator interceptor = new HiveInterceptorDecorator(config, hive); WeatherReport report = generateInstance(); Continent asia = new AsiaticContinent(); assertNotNull(config.getEntityConfig(asia.getClass())); assertTrue(interceptor.isTransient(report)); assertTrue(interceptor.isTransient(asia)); HiveIndexer indexer = new HiveIndexer(getHive()); indexer.insert(config.getEntityConfig(WeatherReport.class), report); indexer.insert(config.getEntityConfig(Continent.class), asia); assertFalse(interceptor.isTransient(report)); assertFalse(interceptor.isTransient(asia)); } private WeatherReport generateInstance() { return new GenerateInstance<WeatherReport>(WeatherReport.class).generate(); } @Test public void testOnSaveInsert() throws Exception { EntityHiveConfig config = getEntityHiveConfig(); Hive hive = getHive(); HiveInterceptorDecorator interceptor = new HiveInterceptorDecorator(config, hive); WeatherReport report = generateInstance(); Continent asia = new AsiaticContinent(); hive.directory().insertPrimaryIndexKey(asia.getName()); hive.directory().insertPrimaryIndexKey(report.getContinent()); interceptor.postFlush(Arrays.asList(new Object[]{report, asia}).iterator()); assertTrue(hive.directory().doesResourceIdExist("WeatherReport", report.getReportId())); assertTrue(hive.directory().doesResourceIdExist("Temperature", report.getTemperature())); assertTrue(hive.directory().doesPrimaryIndexKeyExist(asia.getName())); assertTrue(hive.directory().doesSecondaryIndexKeyExist("Continent", "population", asia.getPopulation(), asia.getName())); } @Test public void testOnSaveInsertReadOnlyFailure() throws Exception { Hive hive = getHive(); ConfigurationReader reader = new ConfigurationReader(Continent.class, WeatherReport.class); EntityHiveConfig config = reader.getHiveConfiguration(); HiveInterceptorDecorator interceptor = new HiveInterceptorDecorator(config, hive); WeatherReport report = generateInstance(); hive.directory().insertPrimaryIndexKey(report.getContinent()); hive.updateHiveStatus(Status.readOnly); try { interceptor.postFlush(Arrays.asList(new Object[]{report}).iterator()); fail("No exception thrown"); } catch (CallbackException e) { assertEquals(HiveLockableException.class, e.getCause().getClass()); } } @Test public void testOnDeleteReadOnlyFailure() throws Exception { EntityHiveConfig config = getEntityHiveConfig(); Hive hive = getHive(); HiveInterceptorDecorator interceptor = new HiveInterceptorDecorator(config, hive); WeatherReport report = generateInstance(); hive.directory().insertPrimaryIndexKey(report.getContinent()); interceptor.postFlush(Arrays.asList(new WeatherReport[]{report}).iterator()); assertTrue(hive.directory().doesPrimaryIndexKeyExist(report.getContinent())); assertTrue(hive.directory().doesResourceIdExist("WeatherReport", report.getReportId())); assertTrue(hive.directory().doesResourceIdExist("Temperature", report.getTemperature())); hive.updateHiveStatus(Status.readOnly); try { interceptor.onDelete(report, null, null, null, null); fail("No exception thrown"); } catch (CallbackException e) { assertEquals(HiveLockableException.class, e.getCause().getClass()); } } @Test public void testOnDelete() throws Exception { Hive hive = getHive(); ConfigurationReader reader = new ConfigurationReader(Continent.class, WeatherReport.class); EntityHiveConfig config = reader.getHiveConfiguration(); HiveInterceptorDecorator interceptor = new HiveInterceptorDecorator(config, hive); WeatherReport report = generateInstance(); Continent asia = new AsiaticContinent(); hive.directory().insertPrimaryIndexKey(report.getContinent()); hive.directory().insertPrimaryIndexKey(asia.getName()); interceptor.postFlush(Arrays.asList(new Object[]{report, asia}).iterator()); assertTrue(hive.directory().doesPrimaryIndexKeyExist(report.getContinent())); assertTrue(hive.directory().doesResourceIdExist("WeatherReport", report.getReportId())); assertTrue(hive.directory().doesResourceIdExist("Temperature", report.getTemperature())); assertTrue(hive.directory().doesPrimaryIndexKeyExist(asia.getName())); assertTrue(hive.directory().doesSecondaryIndexKeyExist("Continent", "population", asia.getPopulation(), asia.getName())); interceptor.onDelete(report, null, null, null, null); interceptor.onDelete(asia, null, null, null, null); assertFalse(hive.directory().doesResourceIdExist("WeatherReport", report.getReportId())); // Referenced entity does not get deleted assertTrue(hive.directory().doesResourceIdExist("Temperature", report.getTemperature())); assertFalse(hive.directory().doesPrimaryIndexKeyExist(asia.getName())); assertFalse(hive.directory().doesSecondaryIndexKeyExist("Continent", "population", asia.getPopulation(), asia.getName())); } @Test public void testOnSaveUpdate() throws Exception { Hive hive = getHive(); EntityHiveConfig config = getEntityHiveConfig(); HiveInterceptorDecorator interceptor = new HiveInterceptorDecorator(config, hive); WeatherReport report = generateInstance(); hive.directory().insertPrimaryIndexKey(report.getContinent()); interceptor.postFlush(Arrays.asList(new WeatherReport[]{report}).iterator()); assertTrue(hive.directory().doesPrimaryIndexKeyExist(report.getContinent())); assertTrue(hive.directory().doesResourceIdExist("WeatherReport", report.getReportId())); assertTrue(hive.directory().doesResourceIdExist("Temperature", report.getTemperature())); int oldTemperature = report.getTemperature(); GeneratedInstanceInterceptor.setProperty(report, "temperature", 72); assertFalse(oldTemperature == 72); interceptor.postFlush(Arrays.asList(new WeatherReport[]{report}).iterator()); assertTrue(hive.directory().doesResourceIdExist("Temperature", 72)); } }