/*
* Copyright (c) 2010 Mysema Ltd.
* All rights reserved.
*
*/
package com.mysema.rdfbean.object;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.mysema.rdfbean.TEST;
import com.mysema.rdfbean.annotations.ClassMapping;
import com.mysema.rdfbean.annotations.Container;
import com.mysema.rdfbean.annotations.ContainerType;
import com.mysema.rdfbean.annotations.Id;
import com.mysema.rdfbean.annotations.Predicate;
import com.mysema.rdfbean.model.IDType;
import com.mysema.rdfbean.model.MiniRepository;
@ClassMapping
public class DeleteTest {
@Id(IDType.LOCAL)
private String id;
@Predicate
private String name;
@Predicate
private final List<DeleteTest> listReference = new ArrayList<DeleteTest>();
@Predicate
@Container(ContainerType.SEQ)
private final List<DeleteDTO> seqReference = new ArrayList<DeleteDTO>();
@Nullable
private Session session;
private final MiniRepository repository = new MiniRepository();
@ClassMapping(ns = TEST.NS, ln = "DeleteTest")
public static class DeleteDTO {
@Id(IDType.LOCAL)
String id;
public DeleteDTO() {
}
public DeleteDTO(String id) {
this.id = id;
}
}
@Before
public void init() {
this.session = newSession();
}
@After
public void close() throws IOException {
this.session.close();
}
@Test
public void SimpleDelete() {
DeleteTest dtest = new DeleteTest();
dtest.name = "dtest";
session.save(dtest);
newSession();
DeleteTest tmp = dtest;
dtest = session.getById(dtest.id, DeleteTest.class);
assertNotSame(tmp, dtest);
assertEquals("dtest", dtest.name);
session.delete(dtest);
assertNull(session.getById(dtest.id, DeleteTest.class));
newSession();
assertNull(session.getById(dtest.id, DeleteTest.class));
}
@Test
public void SimpleDeleteResource() {
DeleteTest dtest = new DeleteTest();
dtest.name = "dtest";
session.save(dtest);
newSession();
DeleteTest tmp = dtest;
dtest = session.getById(dtest.id, DeleteTest.class);
assertNotSame(tmp, dtest);
assertEquals("dtest", dtest.name);
session.delete(DeleteTest.class, session.getId(dtest));
assertNull(session.getById(dtest.id, DeleteTest.class));
newSession();
assertNull(session.getById(dtest.id, DeleteTest.class));
}
@Test
public void RemoveReferences() {
DeleteTest dtest1 = new DeleteTest();
dtest1.name = "dtest1";
DeleteTest dtest2 = new DeleteTest();
dtest2.name = "dtest2";
dtest2.listReference.add(dtest1);
// Circular reference
dtest1.listReference.add(dtest2);
session.save(dtest1);
String id1 = dtest1.id;
String id2 = dtest2.id;
assertNotNull(id1);
assertNotNull(id2);
newSession();
dtest1 = session.getById(id1, DeleteTest.class);
dtest2 = dtest1.listReference.get(0);
assertEquals(id2, dtest2.id);
assertSame(dtest1, dtest2.listReference.get(0));
dtest1.seqReference.add(new DeleteDTO(id2));
dtest2.seqReference.add(new DeleteDTO(id1));
dtest2.seqReference.add(new DeleteDTO(id2)); // self reference
session.save(dtest1); // cascades to dtest2
session.delete(dtest1);
assertNull(session.getById(id1, DeleteTest.class));
newSession();
assertNull(session.getById(id1, DeleteTest.class));
dtest2 = session.getById(id2, DeleteTest.class);
assertNotNull(dtest2);
assertNull(dtest2.listReference.get(0));
assertNull(dtest2.seqReference.get(0));
assertEquals(id2, dtest2.seqReference.get(1).id);
}
private Session newSession() {
closeSession();
session = SessionUtil.openSession(repository, DeleteTest.class, DeleteDTO.class);
return session;
}
private void closeSession() {
if (session != null) {
session.close();
session = null;
}
}
}