/**
* Copyright (C) 2001-2004 France Telecom R&D
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.objectweb.speedo.runtime.userid;
import junit.framework.Assert;
import org.objectweb.speedo.SpeedoTestHelper;
import org.objectweb.speedo.pobjects.userid.AutoIncFieldId;
import org.objectweb.speedo.pobjects.userid.AutoIncId;
import org.objectweb.speedo.pobjects.userid.BasicB;
import org.objectweb.speedo.pobjects.userid.IntUserId;
import org.objectweb.speedo.pobjects.userid.Ref2AutoIncFieldId;
import org.objectweb.speedo.pobjects.userid.StringLongId;
import org.objectweb.speedo.pobjects.userid.StringUserId;
import org.objectweb.speedo.pobjects.userid.InnerUserId;
import org.objectweb.speedo.pobjects.userid.Ref2BasicB;
import org.objectweb.util.monolog.api.BasicLevel;
import javax.jdo.JDOException;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.jdo.Query;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
*
* @author S.Chassande-Barrioz
*/
public class TestUserId extends SpeedoTestHelper {
private final static String OID_FILE_NAME = "TestUserId_test1.id";
public TestUserId(String s) {
super(s);
}
protected String getLoggerName() {
return LOG_NAME + "rt.userid";
}
public void testGetUnexistingObject() {
PersistenceManager pm = pmf.getPersistenceManager();
try {
pm.getObjectById(new StringLongId("azerty", 217), false);
fail("Object found !");
} catch (JDOException e) {
//OK
} catch (Exception e) {
logger.log(BasicLevel.ERROR, e.getMessage(), e);
fail("Object found !");
} finally {
pm.close();
}
}
public void test1MakePersistent() {
try {
PersistenceManager pm = pmf.getPersistenceManager();
BasicB bb = new BasicB("azerty", 217, "blabla", 456);
pm.makePersistent(bb);
StringLongId id = (StringLongId) pm.getObjectId(bb);
logger.log(BasicLevel.DEBUG, "UserId=" + id);
pm.close();
Assert.assertNotNull("Null Object id", id);
ObjectOutputStream os = new ObjectOutputStream(
new FileOutputStream(OID_FILE_NAME));
os.writeObject(id);
os.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void test2LoadNDelete() {
try {
PersistenceManager pm = pmf.getPersistenceManager();
ObjectInputStream is = new ObjectInputStream(
new FileInputStream(OID_FILE_NAME));
StringLongId id = (StringLongId) is.readObject();
is.close();
new File(OID_FILE_NAME).delete();
BasicB bb = (BasicB) pm.getObjectById(id, true);
Assert.assertNotNull("Null Object", bb);
pm.currentTransaction().begin();
pm.deletePersistent(bb);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testUserId1() {
try {
String id1 = "wxcvb";
int id2 = 3;
String f1 = "sdgh";
int f2 = 68746;
PersistenceManager pm = pmf.getPersistenceManager();
BasicB bb = new BasicB(id1, id2, f1, f2);
pm.makePersistent(bb);
StringLongId id = (StringLongId) pm.getObjectId(bb);
logger.log(BasicLevel.DEBUG, "UserId=" + id);
Assert.assertNotNull("identifier is null", id);
String strid = id.toString();
bb = null;
pm.close();
pm = pmf.getPersistenceManager();
Object o = pm.newObjectIdInstance(BasicB.class, strid);
bb = (BasicB) pm.getObjectById(o, false);
Assert.assertNotNull("returned object is null", bb);
Assert.assertEquals("Bad field 'id1' value", id1, bb.getId1());
Assert.assertEquals("Bad field 'di2' value", id2, bb.getId2());
Assert.assertEquals("Bad field 'f1' value", f1, bb.readF1());
Assert.assertEquals("Bad field 'f1' value", f2, bb.readF2());
Query q = pm.newQuery(BasicB.class);
Iterator it = ((Collection) q.execute()).iterator();
while(it.hasNext()) {
BasicB _bb = (BasicB) it.next();
StringLongId oid = (StringLongId) pm.getObjectId(_bb);
assertTrue(_bb == pm.getObjectById(oid, false));
}
q.closeAll();
pm.currentTransaction().begin();
pm.deletePersistent(bb);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testUserId2() {
try {
String id1 = "querty";
int id2 = 12000;
String f1 = "blabla";
int f2 = 456;
PersistenceManager pm = pmf.getPersistenceManager();
BasicB bb = new BasicB(id1, id2, f1, f2);
pm.makePersistent(bb);
StringLongId id = (StringLongId) pm.getObjectId(bb);
logger.log(BasicLevel.DEBUG, "UserId=" + id);
Assert.assertNotNull("identifier is null", id);
bb = null;
pm.close();
pm = pmf.getPersistenceManager();
id = new StringLongId(id1, id2);
bb = (BasicB) pm.getObjectById(id, false);
Assert.assertNotNull("returned object is null", bb);
Assert.assertEquals("Bad field 'id1' value", id1, bb.getId1());
Assert.assertEquals("Bad field 'di2' value", id2, bb.getId2());
Assert.assertEquals("Bad field 'f1' value", f1, bb.readF1());
Assert.assertEquals("Bad field 'f1' value", f2, bb.readF2());
pm.currentTransaction().begin();
pm.deletePersistent(bb);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testInnerUserId() {
try {
String f1 = "testInnerUserId";
int f2 = 12;
InnerUserId.Oid iuio = new InnerUserId.Oid(0,0);
PersistenceManager pm = pmf.getPersistenceManager();
InnerUserId iui = new InnerUserId(f1, f2, iuio);
pm.makePersistent(iui);
InnerUserId.Oid iuio2 = (InnerUserId.Oid) pm.getObjectId(iui);
logger.log(BasicLevel.DEBUG, "UserId=" + iuio2);
Assert.assertNotNull("identifier is null", iuio2);
iui = null;
pm.close();
pm = pmf.getPersistenceManager();
iuio2 = new InnerUserId.Oid(0, 0);
iui = (InnerUserId) pm.getObjectById(iuio2, false);
Assert.assertNotNull("returned object is null", iui);
Assert.assertEquals("Bad field 'oid1' value", iuio.oid1, iui.getOid1());
Assert.assertEquals("Bad field 'oid2' value", iuio.oid2, iui.getOid2());
Assert.assertEquals("Bad field 'f1' value", f1, iui.getF1());
Assert.assertEquals("Bad field 'f2' value", f2, iui.getF2());
pm.currentTransaction().begin();
pm.deletePersistent(iui);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testStringId() {
try {
String name = "testStringId1";
int f1 = 12;
Object id;
String strid;
PersistenceManager pm = pmf.getPersistenceManager();
StringUserId sui = new StringUserId(name, f1);
pm.makePersistent(sui);
id = pm.getObjectId(sui);
Assert.assertNotNull("identifier is null", id);
strid = id.toString();
id = null;
pm.close();
sui = null; // garbage object
pm = pmf.getPersistenceManager();
id = pm.newObjectIdInstance(StringUserId.class, strid);
sui = (StringUserId) pm.getObjectById(id, false);
Assert.assertNotNull("returned object is null", sui);
Assert.assertEquals("Bad field 'name' value", name, sui.getName());
Assert.assertEquals("Bad field 'f1' value", f1, sui.getF1());
pm.currentTransaction().begin();
pm.deletePersistent(sui);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testStringId2() {
try {
String name = "testStringId2";
int f1 = 12;
Object id;
PersistenceManager pm = pmf.getPersistenceManager();
StringUserId sui = new StringUserId(name, f1);
pm.makePersistent(sui);
id = pm.getObjectId(sui);
Assert.assertNotNull("identifier is null", id);
id = null;
pm.close();
sui = null; // garbage object
pm = pmf.getPersistenceManager();
id = pm.newObjectIdInstance(StringUserId.class, name);
sui = (StringUserId) pm.getObjectById(id, false);
Assert.assertNotNull("returned object is null", sui);
Assert.assertEquals("Bad field 'name' value", name, sui.getName());
Assert.assertEquals("Bad field 'f1' value", f1, sui.getF1());
pm.currentTransaction().begin();
pm.deletePersistent(sui);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testIntId() {
try {
String f1 = "testInt";
int name = 13;
Object id;
PersistenceManager pm = pmf.getPersistenceManager();
IntUserId iui = new IntUserId(name, f1);
pm.makePersistent(iui);
id = pm.getObjectId(iui);
Assert.assertNotNull("identifier is null", id);
pm.close();
iui = null; // garbage object
pm = pmf.getPersistenceManager();
id = pm.newObjectIdInstance(IntUserId.class, id.toString());
Assert.assertNotNull("built identifier is null", id);
iui = (IntUserId) pm.getObjectById(id, false);
Assert.assertNotNull("returned object is null", iui);
Assert.assertEquals("Bad field 'name' value", name, iui.getName());
Assert.assertEquals("Bad field 'f1' value", f1, iui.getF1());
pm.currentTransaction().begin();
pm.deletePersistent(iui);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testRdbSequence1() {
try {
PersistenceManager pm = pmf.getPersistenceManager();
AutoIncId aii = new AutoIncId();
pm.makePersistent(aii);
Object id = pm.getObjectId(aii);
logger.log(BasicLevel.DEBUG, "id(AutoIncId): " +id);
Assert.assertNotNull("identifier is null", id);
pm.close();
pm = pmf.getPersistenceManager();
id = pm.newObjectIdInstance(AutoIncId.class, id.toString());
Assert.assertNotNull("built identifier is null", id);
aii = (AutoIncId) pm.getObjectById(id, false);
Assert.assertNotNull("returned object is null", aii);
pm.currentTransaction().begin();
pm.deletePersistent(aii);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testRdbSequence2() {
try {
PersistenceManager pm = pmf.getPersistenceManager();
AutoIncFieldId aifi = new AutoIncFieldId();
pm.makePersistent(aifi);
long id = aifi.getId();
logger.log(BasicLevel.DEBUG, "id(AutoIncId): " +id);
pm.close();
aifi = null;
pm = pmf.getPersistenceManager();
pm.evictAll();
pm.close();
pm = pmf.getPersistenceManager();
Object oid = pm.newObjectIdInstance(AutoIncFieldId.class, "" + id);
Assert.assertNotNull("built identifier is null", oid);
aifi = (AutoIncFieldId) pm.getObjectById(oid, false);
Assert.assertNotNull("returned object is null", aifi);
pm.currentTransaction().begin();
pm.deletePersistent(aifi);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testRdbSequenceUserField() {
try {
PersistenceManager pm = pmf.getPersistenceManager();
AutoIncFieldId aifi = new AutoIncFieldId();
Assert.assertEquals("Bad id value before 'makePersistent'", -1, aifi.getId());
pm.makePersistent(aifi);
long lid = aifi.getId();
Assert.assertTrue("Bad id value after 'makePersistent': " + lid, 0 < lid);
logger.log(BasicLevel.DEBUG, "long id: " +lid);
Object id = pm.getObjectId(aifi);
logger.log(BasicLevel.DEBUG, "id(AutoIncId): " +id);
Assert.assertNotNull("identifier is null", id);
pm.close();
pm = pmf.getPersistenceManager();
id = pm.newObjectIdInstance(AutoIncFieldId.class, id.toString());
Assert.assertNotNull("built identifier is null (toString)", id);
aifi = (AutoIncFieldId) pm.getObjectById(id, false);
Assert.assertNotNull("returned object is null (toString)", aifi);
pm.close();
pm = pmf.getPersistenceManager();
id = pm.newObjectIdInstance(AutoIncFieldId.class, "" + lid);
Assert.assertNotNull("built identifier is null (long value)", id);
aifi = (AutoIncFieldId) pm.getObjectById(id, false);
Assert.assertNotNull("returned object is null (long value)", aifi);
pm.currentTransaction().begin();
pm.deletePersistent(aifi);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testRdbSequenceRefToUserField() {
try {
PersistenceManager pm = pmf.getPersistenceManager();
pm.currentTransaction().begin();
ArrayList al = new ArrayList();
al.add(new AutoIncFieldId());
al.add(new AutoIncFieldId());
Ref2AutoIncFieldId ref = new Ref2AutoIncFieldId(new AutoIncFieldId(), al);
pm.makePersistent(ref);
pm.currentTransaction().commit();
pm.currentTransaction().begin();
pm.deletePersistentAll(al);
pm.deletePersistent(ref.getSimpleRef());
pm.deletePersistent(ref);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
public void testRef2BasicB() {
PersistenceManager pm = pmf.getPersistenceManager();
pm.currentTransaction().begin();
final String r2bb_id = "testRef2BasicB_r2bb_id";
final String bb_id = "testRef2BasicB_bb_id";
BasicB bb = new BasicB(bb_id, 1);
Ref2BasicB r2bb = new Ref2BasicB(r2bb_id);
pm.makePersistent(r2bb);
r2bb.setBasicb(bb);
pm.getObjectId(bb);
pm.currentTransaction().commit();
pm.evict(r2bb);
pm.evict(bb);
pm.close();
pm = pmf.getPersistenceManager();
pm.currentTransaction().begin();
Object o = pm.getObjectById(
pm.newObjectIdInstance(Ref2BasicB.class, r2bb_id), false);
assertTrue("Bad object ", o==r2bb);
pm.deletePersistent(r2bb.getBasicb());
pm.deletePersistent(r2bb);
pm.currentTransaction().commit();
pm.close();
}
public void testTwiceMakePersistent() {
try {
String name = "testTwiceMakePersistent";
String strid;
PersistenceManager pm = pmf.getPersistenceManager();
StringUserId sui = new StringUserId(name, 123456);
pm.currentTransaction().begin();
pm.makePersistent(sui);
pm.currentTransaction().commit();
StringUserId sui2 = new StringUserId(name, 654321);
pm.currentTransaction().begin();
try {
pm.makePersistent(sui2);
fail("Same identifier not detected");
} catch (JDOException e) {
assertTrue("Object becomes persistent", !JDOHelper.isPersistent(sui2));
assertEquals("Bad f1 value in non peristent object", 654321, sui2.getF1());
}
pm.currentTransaction().commit();
sui = null;
pm.evictAll();
pm.currentTransaction().begin();
try {
pm.makePersistent(sui2);
pm.currentTransaction().commit();
fail("Same identifier not detected with empty cache");
} catch (JDOException e) {
if (pm.currentTransaction().isActive()) {
pm.currentTransaction().rollback();
}
assertTrue("Object becomes persistent", !JDOHelper.isPersistent(sui2));
assertEquals("Bad f1 value in non peristent object with empty cache",
654321, sui2.getF1());
}
pm.currentTransaction().begin();
sui = (StringUserId) pm.getObjectById(
pm.newObjectIdInstance(StringUserId.class, name), false);
pm.deletePersistent(sui);
pm.currentTransaction().commit();
pm.close();
} catch (Exception e) {
logger.log(BasicLevel.ERROR, "Exception", e);
fail(e.getMessage());
}
}
}