/*
* Copyright 2010-2012 Luca Garulli (l.garulli--at--orientechnologies.com)
*
* 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 com.orientechnologies.orient.test.database.auto;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.object.db.OObjectDatabaseTx;
import com.orientechnologies.orient.test.domain.whiz.Profile;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Optional;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.io.IOException;
import java.util.List;
@Test(groups = "hook")
public class HookTest extends ObjectDBBaseTest {
private int callbackCount = 0;
private Profile p;
private Hook hook = new Hook();
@Parameters(value = "url")
public HookTest(@Optional String url) {
super(url);
}
@AfterMethod
@Override
public void afterMethod() throws Exception {
}
@Test
public void testRegisterHook() throws IOException {
database.registerHook(hook);
database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.business");
database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.whiz");
database.getEntityManager().registerEntityClasses("com.orientechnologies.orient.test.domain.base");
}
@Test(dependsOnMethods = "testRegisterHook")
public void testHooksIsRegistered() throws IOException {
for (ORecordHook hook : database.getHooks().keySet()) {
if (hook.equals(this.hook))
return;
}
Assert.assertTrue(false);
}
@Test(dependsOnMethods = "testHooksIsRegistered")
public void testHookCreate() throws IOException {
p = new Profile("HookTest");
// TEST HOOKS ON CREATE
Assert.assertEquals(callbackCount, 0);
database.save(p);
Assert.assertEquals(callbackCount, 11);
}
@Test(dependsOnMethods = "testHookCreate")
public void testHookRead() {
// TEST HOOKS ON READ
List<Profile> result = database.query(new OSQLSynchQuery<Profile>("select * from Profile where nick = 'HookTest'"));
Assert.assertEquals(result.size(), 1);
for (int i = 0; i < result.size(); ++i) {
Assert.assertEquals(callbackCount, 46);
p = result.get(i);
}
Assert.assertEquals(callbackCount, 46);
}
@Test(dependsOnMethods = "testHookRead")
public void testHookUpdate() {
// TEST HOOKS ON UPDATE
p.setValue(p.getValue() + 1000);
database.save(p);
Assert.assertEquals(callbackCount, 136);
}
@Test(dependsOnMethods = "testHookUpdate")
public void testHookDelete() {
// TEST HOOKS ON DELETE
database.delete(p);
Assert.assertEquals(callbackCount, 266);
}
@Test(dependsOnMethods = "testHookDelete")
public void testUnregisterHook() throws IOException {
database.unregisterHook(hook);
database.close();
}
public class Hook extends ORecordHookAbstract {
@Override
public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
return DISTRIBUTED_EXECUTION_MODE.TARGET_NODE;
}
@Override
public RESULT onRecordBeforeCreate(ORecord iRecord) {
if (iRecord instanceof ODocument && ((ODocument) iRecord).getClassName() != null
&& ((ODocument) iRecord).getClassName().equals("Profile"))
callbackCount += 1;
return RESULT.RECORD_NOT_CHANGED;
}
@Override
public void onRecordAfterCreate(ORecord iRecord) {
if (iRecord instanceof ODocument && ((ODocument) iRecord).getClassName() != null
&& ((ODocument) iRecord).getClassName().equals("Profile"))
callbackCount += 10;
}
@Override
public RESULT onRecordBeforeRead(ORecord iRecord) {
if (iRecord instanceof ODocument && ((ODocument) iRecord).getClassName() != null
&& ((ODocument) iRecord).getClassName().equals("Profile"))
callbackCount += 20;
return RESULT.RECORD_NOT_CHANGED;
}
@Override
public void onRecordAfterRead(ORecord iRecord) {
if (iRecord instanceof ODocument && ((ODocument) iRecord).getClassName() != null
&& ((ODocument) iRecord).getClassName().equals("Profile"))
callbackCount += 15;
}
@Override
public RESULT onRecordBeforeUpdate(ORecord iRecord) {
if (iRecord instanceof ODocument && ((ODocument) iRecord).getClassName() != null
&& ((ODocument) iRecord).getClassName().equals("Profile"))
callbackCount += 40;
return RESULT.RECORD_NOT_CHANGED;
}
@Override
public void onRecordAfterUpdate(ORecord iRecord) {
if (iRecord instanceof ODocument && ((ODocument) iRecord).getClassName() != null
&& ((ODocument) iRecord).getClassName().equals("Profile"))
callbackCount += 50;
}
@Override
public RESULT onRecordBeforeDelete(ORecord iRecord) {
if (iRecord instanceof ODocument && ((ODocument) iRecord).getClassName() != null
&& ((ODocument) iRecord).getClassName().equals("Profile"))
callbackCount += 60;
return RESULT.RECORD_NOT_CHANGED;
}
@Override
public void onRecordAfterDelete(ORecord iRecord) {
if (iRecord instanceof ODocument && ((ODocument) iRecord).getClassName() != null
&& ((ODocument) iRecord).getClassName().equals("Profile"))
callbackCount += 70;
}
}
}